Changeset 264:31ad17f72637
- Timestamp:
- 04/30/2010 01:01:58 PM (4 months ago)
- Author:
- dcaoyuan
- Branch:
- default
- Message:
-
Type paramter is not neccesary for ScalaActor?
- Location:
- blogbird/src/main/scala/org/aiotrade/httpd
- Files:
-
Legend:
- Unmodified
- Added
- Removed
-
|
r262
|
r264
|
|
| 5 | 5 | import java.nio.channels.SocketChannel |
| 6 | 6 | |
| | 7 | import org.aiotrade.httpd.SelectActor.Read |
| | 8 | import org.aiotrade.httpd.SelectActor.Write |
| 7 | 9 | import scala.actors.Actor |
| 8 | 10 | import Debugger._ |
| … |
… |
|
| 11 | 13 | * Represents an open HTTP connection coming from a client. |
| 12 | 14 | */ |
| 13 | | class ClientConnection(val channel: SocketChannel) extends Actor with WithSelectableChannel { |
| | 15 | class ClientConnection(val channel: SocketChannel) extends Actor with ChannelListener { |
| 14 | 16 | private var _isOpen = true |
| 15 | 17 | private var requestParser = new HttpRequestParser |
-
|
r263
|
r264
|
|
| 66 | 66 | } |
| 67 | 67 | |
| 68 | | object selectActor extends SelectActor[ClientConnection](SelectionKey.OP_READ) { |
| | 68 | object selectActor extends SelectActor(SelectionKey.OP_READ) { |
| 69 | 69 | def produce(o: Request) = ConnectionManager.produce(o) |
| 70 | 70 | } |
| … |
… |
|
| 116 | 116 | } |
| 117 | 117 | |
| 118 | | private object selectActor extends SelectActor[ClientConnection](SelectionKey.OP_WRITE) |
| | 118 | private object selectActor extends SelectActor(SelectionKey.OP_WRITE) |
| 119 | 119 | |
| 120 | 120 | protected def consume(reply: Reply) { |
-
|
r263
|
r264
|
|
| 9 | 9 | import scala.collection.JavaConversions._ |
| 10 | 10 | |
| 11 | | abstract class SelectionEvent[T <: WithSelectableChannel](sender: SelectActor[T]) |
| 12 | | case class Read [T <: WithSelectableChannel](sender: SelectActor[T]) extends SelectionEvent(sender) |
| 13 | | case class Write [T <: WithSelectableChannel](sender: SelectActor[T]) extends SelectionEvent(sender) |
| 14 | | case class Unknown[T <: WithSelectableChannel](sender: SelectActor[T]) extends SelectionEvent(sender) |
| 15 | 11 | |
| 16 | | abstract class SelectActor[T <: WithSelectableChannel](ops: Int) extends Actor { |
| | 12 | object SelectActor { |
| | 13 | abstract class Event(sender: SelectActor) |
| | 14 | case class Read (sender: SelectActor) extends Event(sender) |
| | 15 | case class Write (sender: SelectActor) extends Event(sender) |
| | 16 | case class Unknown(sender: SelectActor) extends Event(sender) |
| | 17 | } |
| | 18 | |
| | 19 | import SelectActor._ |
| | 20 | abstract class SelectActor(ops: Int) extends Actor { |
| 17 | 21 | |
| 18 | 22 | // @Note tried using ConcurrentMap here before, but no success |
| 19 | | private val newListeners = new LinkedBlockingQueue[T] |
| | 23 | private val newListeners = new LinkedBlockingQueue[ChannelListener] |
| 20 | 24 | |
| 21 | 25 | private val selector: Selector = SelectorProvider.provider.openSelector |
| 22 | 26 | |
| 23 | | def addListener(listener: T) { |
| | 27 | def addListener(listener: ChannelListener) { |
| 24 | 28 | newListeners put listener |
| 25 | 29 | selector.wakeup |
| … |
… |
|
| 39 | 43 | |
| 40 | 44 | if (key.isValid) { |
| 41 | | val listener = key.attachment.asInstanceOf[T] |
| | 45 | val listener = key.attachment.asInstanceOf[ChannelListener] |
| 42 | 46 | val event = |
| 43 | 47 | if (key.isReadable) { |
| … |
… |
|
| 56 | 60 | |
| 57 | 61 | // Add queued up connections before looping back around: |
| 58 | | val listeners = new java.util.Vector[T] |
| | 62 | val listeners = new java.util.Vector[ChannelListener] |
| 59 | 63 | newListeners.drainTo(listeners) |
| 60 | 64 | |
| … |
… |
|
| 68 | 72 | } |
| 69 | 73 | |
| 70 | | trait WithSelectableChannel extends Actor { |
| | 74 | trait ChannelListener extends Actor { |
| 71 | 75 | def isOpen: Boolean |
| 72 | 76 | def channel: SelectableChannel |