我正在编写的应用程序使用Apache Camel(camel-websocket组件)来创建Web Socket。
问题在于,如果我尝试停止Actor(即Akka Camel中的Producer),我无法在初始化期间停止作为组件创建的Jetty服务器。
我实际上尝试在我的actor的doStop()
方法中调用postStop()
方法,但它似乎不起作用:事实上,如果我尝试重新打开Web套接字,则所选端口已在使用中。< / p>
> FAILED org.eclipse.jetty.server.Server@41500094: java.net.BindException: Address already in use
java.net.BindException: Address already in use
at sun.nio.ch.Net.bind0(Native Method) ~[na:1.7.0_80]
at sun.nio.ch.Net.bind(Net.java:463) ~[na:1.7.0_80]
at sun.nio.ch.Net.bind(Net.java:455) ~[na:1.7.0_80]
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223) ~[na:1.7.0_80]
at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74) ~[na:1.7.0_80]
如果我尝试连接到WebSocket,实际上当我尝试停止生产者和相关的Jetty服务器时,我的连接不会丢失。
相反,如果我终止并重新启动整个应用程序,则第一次初始化将按预期工作。
我的制作人代码如下:
class HttpEndpointActor() extends Producer{
val wsComponent: WebsocketComponent = new WebsocketComponent()
wsComponent.setHost("localhost")
wsComponent.setPort(2222)
this.camelContext.addComponent("ws", wsComponent)
override def endpointUri: String = "ws://localhost:2222/test?sendToAll=true"
override def postStop() = {
super.postStop()
this.camelContext.getComponent("ws", classOf[WebsocketComponent]).doStop()
this.camelContext.removeComponent("ws")
}
}