package ch.epfl.gsn.networking.zeromq; import java.io.ByteArrayOutputStream; import java.io.IOException; import org.zeromq.ZContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.zeromq.ZMQ; import org.zeromq.ZMQ.Socket; import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.io.Output; import ch.epfl.gsn.Main; import ch.epfl.gsn.beans.DataField; import ch.epfl.gsn.beans.StreamElement; import ch.epfl.gsn.beans.VSensorConfig; import ch.epfl.gsn.delivery.DeliverySystem; public class ZeroMQDeliveryAsync implements DeliverySystem{ private ZContext context; private Socket publisher; private boolean closed = true; private Kryo kryo = new Kryo(); private String name; public static transient Logger logger = LoggerFactory.getLogger ( ZeroMQDeliveryAsync.class ); public ZeroMQDeliveryAsync(String name){ if (name.endsWith(":")){ name = name.substring(0, name.length()-1); } this.name = name; context = Main.getZmqContext(); // Socket to talk to clients publisher = context.createSocket(ZMQ.PUB); publisher.setLinger(5000); publisher.setSndHWM(0); // no limit publisher.bind("inproc://stream/"+name); Main.getZmqProxy().connectTo(name); closed = false; } @Override public void writeStructure(DataField[] fields) throws IOException { Main.getZmqProxy().registerStructure(name,fields); } @Override public boolean writeStreamElement(StreamElement se) { try { ByteArrayOutputStream bais = new ByteArrayOutputStream(); bais.write((name + ": ").getBytes()); Output o = new Output(bais); kryo.writeObjectOrNull(o,se,StreamElement.class); o.close(); byte[] b = bais.toByteArray(); return publisher.send(b); } catch (IOException e) { logger.error(e.getMessage(), e); } return false; } @Override public boolean writeKeepAliveStreamElement() { return true; } @Override public void close() { publisher.close(); closed = true; } @Override public boolean isClosed() { return closed; } }