diff options
author | Jakob Odersky <jodersky@gmail.com> | 2013-06-27 16:06:21 +0200 |
---|---|---|
committer | Jakob Odersky <jodersky@gmail.com> | 2013-06-27 16:06:21 +0200 |
commit | f21d2de9405d5dd36f108a380f558cab930c1205 (patch) | |
tree | f612d87ab811ed203a8050e2da9fedfff7bbc06d /src | |
parent | f0a76248141f6992d2a3622572f86810abfd07b5 (diff) | |
download | akka-serial-f21d2de9405d5dd36f108a380f558cab930c1205.tar.gz akka-serial-f21d2de9405d5dd36f108a380f558cab930c1205.tar.bz2 akka-serial-f21d2de9405d5dd36f108a380f558cab930c1205.zip |
add error management
Diffstat (limited to 'src')
-rw-r--r-- | src/main/scala/com/github/jodersky/flow/Serial.scala | 2 | ||||
-rw-r--r-- | src/main/scala/com/github/jodersky/flow/SerialOperator.scala | 24 |
2 files changed, 19 insertions, 7 deletions
diff --git a/src/main/scala/com/github/jodersky/flow/Serial.scala b/src/main/scala/com/github/jodersky/flow/Serial.scala index 6f18e19..6e4aefb 100644 --- a/src/main/scala/com/github/jodersky/flow/Serial.scala +++ b/src/main/scala/com/github/jodersky/flow/Serial.scala @@ -20,6 +20,6 @@ object Serial extends ExtensionKey[SerialExt] { case class Wrote(data: ByteString) extends Event case object Close extends Command - case object Closed extends Event + case class Closed(error: Option[Exception]) extends Event } diff --git a/src/main/scala/com/github/jodersky/flow/SerialOperator.scala b/src/main/scala/com/github/jodersky/flow/SerialOperator.scala index 8621c55..604dc74 100644 --- a/src/main/scala/com/github/jodersky/flow/SerialOperator.scala +++ b/src/main/scala/com/github/jodersky/flow/SerialOperator.scala @@ -1,5 +1,7 @@ package com.github.jodersky.flow +import java.io.IOException + import com.github.jodersky.flow.internal.InternalSerial import Serial.Close @@ -18,7 +20,7 @@ import akka.util.ByteString class SerialOperator(handler: ActorRef, serial: InternalSerial) extends Actor with ActorLogging { import context._ - case class ReadException(ex: Throwable) + case class ReadException(ex: Exception) object Reader extends Thread { @@ -68,19 +70,29 @@ class SerialOperator(handler: ActorRef, serial: InternalSerial) extends Actor wi def receive: Receive = { case Write(data, ack) => { - serial.write(data.toArray) // no future needed as write is non-blocking - if (ack) sender ! Wrote(data) + try { + val sent = serial.write(data.toArray) + if (ack) sender ! Wrote(ByteString(sent)) + } catch { + case ex: IOException => { + handler ! Closed(Some(ex)) + context stop self + } + } } case Close => { - sender ! Closed - context.stop(self) + handler ! Closed(None) + context stop self } case Terminated(`handler`) => context.stop(self) //go down with reader thread - case ReadException(ex) => throw ex + case ReadException(ex) => { + handler ! Closed(Some(ex)) + context stop self + } } |