Skip to content

Instantly share code, notes, and snippets.

@gakuzzzz
Created September 30, 2012 07:07
Show Gist options
  • Save gakuzzzz/3806119 to your computer and use it in GitHub Desktop.
Save gakuzzzz/3806119 to your computer and use it in GitHub Desktop.
ThreadSafe jetty server
package com.yuroyoro.websocket
import javax.servlet.http._
import org.eclipse.jetty.websocket._
import org.eclipse.jetty.websocket.WebSocket.Outbound
import java.util.concurrent.atomic._
class ChatServlet extends WebSocketServlet {
val clients = new AtomicReference[Set[ChatWebSocket]](Set())
override def doGet(req:HttpServletRequest, res:HttpServletResponse ) =
getServletContext.getNamedDispatcher("default").forward(req, res)
override def doWebSocketConnect(req:HttpServletRequest, protocol:String ) =
new ChatWebSocket
class ChatWebSocket extends WebSocket {
@volatile var outbound:Outbound = _
override def onConnect(outbound:Outbound ) = {
this.outbound = outbound
clients.lazySet(clients.get + this)
onMessage( 0, "WebSocket is success!!!");
}
override def onMessage(frame:Byte, data:Array[Byte], offset:Int, length:Int ) = {}
override def onMessage(frame:Byte, data:String ) =
clients.get.foreach{ c => c.outbound.sendMessage( frame, data ) }
override def onDisconnect = clients.lazySet(clients.get - this)
}
}
@gakuzzzz
Copy link
Author

gakuzzzz commented Oct 4, 2012

Haskell の場合は、このCASループの様なことを内部的にやってくれる STM っていうモナドがあったりします。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment