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.delivery.DeliverySystem; public class ZeroMQDeliverySync implements DeliverySystem{ private ZContext context; private Socket sender; private boolean closed = true; private Kryo kryo = new Kryo(); private String name; public static transient Logger logger = LoggerFactory.getLogger ( ZeroMQDeliverySync.class ); public ZeroMQDeliverySync(String name, String remoteContactPoint){ if (name.endsWith(":")){ name = name.substring(0, name.length()-1); } this.name = name; context = Main.getZmqContext(); sender = context.createSocket(ZMQ.REQ); sender.connect(remoteContactPoint); 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(); Output o = new Output(bais); kryo.writeObjectOrNull(o,se,StreamElement.class); o.close(); byte[] b = bais.toByteArray(); if(sender.send(b)){ byte[] rec = sender.recv(); return rec != null && rec.length == 1 && rec[0] == 0; } } catch (Exception e) { logger.error(e.getMessage(), e); } return false; } @Override public boolean writeKeepAliveStreamElement() { return true; } @Override public void close() { sender.close(); closed = true; } @Override public boolean isClosed() { return closed; } }