JeroMq丢弃消息 - 如何防止?

问题描述:

我有以下“hello world”jeromq PUSH-PULL客户端和服务器。只有在设置了高水位标记值后,我才能够传输而不会丢失消息。JeroMq丢弃消息 - 如何防止?

import org.jeromq.ZMQ; 

    public class TestTcpServer { 

    public static void main(String[] args) { 

    ZMQ.Context context = ZMQ.context(1); 
    ZMQ.Socket socket = context.socket(ZMQ.PULL); 

    System.out.println("Binding TCP server on port 5555"); 

    //socket.setRcvHWM(100_000); 

    socket.bind("tcp://*:5555"); 
    int x; 
    x = 0; 
    while (true) { 
     x++; 
     byte[] raw = socket.recv(0); 
     String rawMessage = new String(raw); 
     if (x > 99_997) { 
      System.out.println(x); 
      System.out.println(rawMessage); 
     } 
    } 

    } 

} 

//client 

import java.io.IOException; 
import org.jeromq.ZMQ; 

public class TestTcpClient { 

/** 
* @param args 
* @throws InterruptedException 
* @throws IOException 
*/ 
public static void main(String[] args) throws InterruptedException, 
     IOException { 
    ZMQ.Context context = ZMQ.context(1); 
    ZMQ.Socket socket = context.socket(ZMQ.PUSH); 
    socket.connect("tcp://localhost:5555"); 

    //socket.setRcvHWM(100_000); 

    System.out.println("Sending 100 000 transactions over TCP...");     long start = System.currentTimeMillis(); 

    for (int request_nbr = 0; request_nbr != 100_000; request_nbr++) { 
     String requestString = "message"; 
     byte[] request = requestString.getBytes(); 
     boolean success = socket.send(request, 0); 
     if (!success) { 
      System.out.println("sending message failed!"); 
     } 

    } 
    long end = System.currentTimeMillis(); 
    System.out.print("Time: "); 
    System.out.print(end - start); 
    System.out.println(" ms");  
    socket.close(); 
    context.term();  
} 

} 

据0Mq documentation,达到高水位时仅PUB插座将下降的消息。由于我使用PUSH-PULL套接字,为什么消息被丢弃?

在我看来,HWM是系统的一个动态属性,所以尽管我已经能够在这个hello世界示例中解析丢弃的消息,但是我不知道我是否可以指望jeromq不要在真实世界中丢弃消息情况?

谢谢你的报告。

是的,PUSH/PULL不能丢弃消息。

对于ZMTP 2.0支持的最新飞跃有一个错误。

请尝试使用最新的快照。

另外,我会建议你在客户端添加socket.setLinger(some_milli_seconds)当你想发送消息后退出应用程序。

+0

我尝试了灵儿设置没有任何影响,会尝试最新的快照。 – Dan

应该在JeroMQ 0.3工作确定,我在这里做一个简单的基准http://nguyentantrieu.info/blog/benchmark-pubsub-jeromq-java/