Jetty Websocket Server does not shutdown
Using the following classes to start an UntypedProducerActor for a Jetty Websocket Server works just fine until shutdown. The ActorSystem.stop(ActorRef) does not cause Jetty server to shutdown. The shutdown call does complete but the Jetty server stays alive after the ActorSystem is terminated.
import akka.actor.*;
import com.comcept.cloudbaseServices.actors.webSocketProducer;
import org.apache.log4j.Logger;
import java.net.URLDecoder;
/**
public class akkaTest {
private static Logger _logger = Logger.getLogger(akkaTest.class);
public static void main(String[] agrs) {
ActorSystem system = ActorSystem.create("testSystem");
ActorRef wsProducer = system.actorOf(new Props(new UntypedActorFactory() {
public Actor create() throws Exception {
return new webSocketProducer(URLDecoder.decode("websocket://localhost:2222", "UTF-8"));
}
}));
system.stop(wsProducer);
system.shutdown();
while (!system.isTerminated()) {
try {Thread.sleep(500);}catch (Exception ignore) {}
}
System.out.println("Akka System is shutdown");
}
}
import akka.actor.ActorContext;
import akka.camel.CamelMessage;
import akka.camel.javaapi.UntypedProducerActor;
import org.apache.camel.CamelContext;
import org.apache.camel.component.websocket.WebsocketComponent;
import org.apache.camel.component.websocket.WebsocketEndpoint;
import org.apache.camel.component.websocket.WebsocketProducerConsumer;
import org.apache.log4j.Logger;
/**
public class webSocketProducer extends UntypedProducerActor {
private Logger _logger = Logger.getLogger(webSocketProducer.class.getName());
private String endpoint;
protected webSocketProducer() {}
public webSocketProducer(String wsUri) {
try {
endpoint = wsUri;
} catch (Exception ex) {
_logger.error(ex);
}
}
@Override
public String getEndpointUri() {
return endpoint;
}
private WebsocketComponent getComponent() {
CamelContext cc = getCamelContext();
return cc.getComponent("websocket", WebsocketComponent.class);
}
@Override
public Object onTransformOutgoingMessage(Object message) {
try {
CamelMessage cm = (CamelMessage)message;
if (cm.body() == null) return null;
return message;
} catch (Exception ex) {
_logger.error(ex);
}
return null;
}
@Override
public void postStop() {
super.postStop();
try {
_logger.info("!!!!!!!!!!!!!!!! webSocketProducer postStop called !!!!!!!!!!!!!!!!!!!!!!");
_logger.info(String.format("webSocketProducer is %s", getEndpointUri()));
CamelContext cc = getCamelContext();
WebsocketComponent c = cc.getComponent("websocket", WebsocketComponent.class);
ActorContext ac = context();
while (!c.isStopped()) {
_logger.info("trying to stop jetty");
c.stop();
c.shutdown();
c.doStop();
if (c.isStopped())
_logger.info("WebsocketComponet is stopped");
Thread.sleep(1000);
}
_logger.info("!!!!!!!!!!!!!!!! webSocketProducer postStop complete !!!!!!!!!!!!!!!!!!!!!!");
} catch (Exception ex) {
_logger.error(ex);
}
}
}
import akka.actor.*;
import com.comcept.cloudbaseServices.actors.webSocketProducer;
import org.apache.log4j.Logger;
import java.net.URLDecoder;
/**
- User: bob
- Date: 12/23/13
- Time: 2:13 PM
public class akkaTest {
private static Logger _logger = Logger.getLogger(akkaTest.class);
public static void main(String[] agrs) {
ActorSystem system = ActorSystem.create("testSystem");
ActorRef wsProducer = system.actorOf(new Props(new UntypedActorFactory() {
public Actor create() throws Exception {
return new webSocketProducer(URLDecoder.decode("websocket://localhost:2222", "UTF-8"));
}
}));
system.stop(wsProducer);
system.shutdown();
while (!system.isTerminated()) {
try {Thread.sleep(500);}catch (Exception ignore) {}
}
System.out.println("Akka System is shutdown");
}
}
import akka.actor.ActorContext;
import akka.camel.CamelMessage;
import akka.camel.javaapi.UntypedProducerActor;
import org.apache.camel.CamelContext;
import org.apache.camel.component.websocket.WebsocketComponent;
import org.apache.camel.component.websocket.WebsocketEndpoint;
import org.apache.camel.component.websocket.WebsocketProducerConsumer;
import org.apache.log4j.Logger;
/**
- Created with IntelliJ IDEA.
- User: bob
- Date: 11/20/12
- Time: 3:28 PM
- To change this template use File | Settings | File Templates.
public class webSocketProducer extends UntypedProducerActor {
private Logger _logger = Logger.getLogger(webSocketProducer.class.getName());
private String endpoint;
protected webSocketProducer() {}
public webSocketProducer(String wsUri) {
try {
endpoint = wsUri;
} catch (Exception ex) {
_logger.error(ex);
}
}
@Override
public String getEndpointUri() {
return endpoint;
}
private WebsocketComponent getComponent() {
CamelContext cc = getCamelContext();
return cc.getComponent("websocket", WebsocketComponent.class);
}
@Override
public Object onTransformOutgoingMessage(Object message) {
try {
CamelMessage cm = (CamelMessage)message;
if (cm.body() == null) return null;
return message;
} catch (Exception ex) {
_logger.error(ex);
}
return null;
}
@Override
public void postStop() {
super.postStop();
try {
_logger.info("!!!!!!!!!!!!!!!! webSocketProducer postStop called !!!!!!!!!!!!!!!!!!!!!!");
_logger.info(String.format("webSocketProducer is %s", getEndpointUri()));
CamelContext cc = getCamelContext();
WebsocketComponent c = cc.getComponent("websocket", WebsocketComponent.class);
ActorContext ac = context();
while (!c.isStopped()) {
_logger.info("trying to stop jetty");
c.stop();
c.shutdown();
c.doStop();
if (c.isStopped())
_logger.info("WebsocketComponet is stopped");
Thread.sleep(1000);
}
_logger.info("!!!!!!!!!!!!!!!! webSocketProducer postStop complete !!!!!!!!!!!!!!!!!!!!!!");
} catch (Exception ex) {
_logger.error(ex);
}
}
}
Leave a comment
on 2014-02-26 20:17 *
By viktorklang
I don't see how this is connected to Akka.