/**
*
*/
package com.trendrr.strest.contrib.zmq;
import java.io.UnsupportedEncodingException;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.Executor;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.trendrr.oss.DynMap;
import com.trendrr.strest.server.StrestServer;
import com.trendrr.strest.server.v2.models.json.StrestJsonRequest;
import com.trendrr.strest.server.v2.servers.ServerListenerBase;
import com.trendrr.zmq.server.ZMQChannel;
import com.trendrr.zmq.server.ZMQServer;
import com.trendrr.zmq.server.ZMQServerMessageHandler;
/**
* @author Dustin Norlander
* @created May 30, 2012
*
*/
public class StrestZMQServerListener extends ServerListenerBase implements ZMQServerMessageHandler {
ZMQServer server;
Timer connectionReaper = new Timer(true);
Executor workerExecutor;
/**
* @param master
* @param config
*/
public StrestZMQServerListener(StrestServer master, DynMap config) {
super(master, config);
}
protected static Log log = LogFactory.getLog(StrestZMQServerListener.class);
/* (non-Javadoc)
* @see com.trendrr.strest.server.v2.servers.ServerListenerBase#getName()
*/
@Override
public String getName() {
return "zmq";
}
/* (non-Javadoc)
* @see com.trendrr.strest.server.v2.servers.ServerListenerBase#start(java.util.concurrent.Executor, java.util.concurrent.Executor)
*/
@Override
public void start(Executor bossExecutor, Executor workerExecutor) {
this.workerExecutor = workerExecutor;
this.server = new ZMQServer();
int port= this.config.getInteger("port");
server.listen(port, this, true);
this.connectionReaper.schedule(new TimerTask() {
@Override
public void run() {
try {
StrestZMQChannel.reaper();
} catch (Exception x) {
log.error("Caught", x);
}
}
}, 60*1000, 60*1000);
System.out.println("ZMQ server started at port " + port + '.');
}
/* (non-Javadoc)
* @see com.trendrr.strest.server.v2.servers.ServerListenerBase#stop()
*/
@Override
public void stop() {
server.close();
this.connectionReaper.cancel();
}
/* (non-Javadoc)
* @see com.trendrr.zmq.server.ZMQServerMessageHandler#error(java.lang.Exception)
*/
@Override
public void error(Exception e) {
log.error("Caught", e);
}
/* (non-Javadoc)
* @see com.trendrr.zmq.server.ZMQServerMessageHandler#incoming(com.trendrr.zmq.server.ZMQChannel, byte[])
*/
@Override
public void incoming(ZMQChannel channel, byte[] bytes) {
//create the StrestJsonRequest.
StrestZMQChannel c = StrestZMQChannel.get(channel);
workerExecutor.execute(
new StrestZMQIncomingRunnable(this.master, c, bytes)
);
}
}