2013-02-09 50 views
2

我預計這個程序中的線程工作在鎖定步驟。但是,在等待接收方趕上之前,發送方會發送〜60000條消息。我對HWM有什麼誤解?jzmq似乎忽略了XREP上的HWM

如果我沒有啓動接收者線程,那麼發送者在嘗試發送第二條消息時會阻塞。

public static void main(String[] args) throws Exception { 
    new Thread() { 
     @Override 
     public void run() { 
      ZMQ.Context context = ZMQ.context(1); 
      ZMQ.Socket socket = context.socket(ZMQ.XREP); 
      socket.setHWM(1); 
      socket.bind("tcp://127.0.0.1:8080"); 
      while (true) { 
       try { 
        socket.recv(0); 
        byte[] msg = socket.recv(0); 
        System.out.println("Received: " + new String(msg, "UTF-8")); 
        Thread.sleep(1000); 
       } catch (Exception ex) { 
        Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex); 
       } 
      } 
     } 
    }.start(); 

    new Thread() { 
     @Override 
     public void run() { 
      ZMQ.Context context = ZMQ.context(1); 
      ZMQ.Socket socket = context.socket(ZMQ.XREQ); 
      socket.setHWM(1); 
      socket.connect("tcp://127.0.0.1:8080"); 
      Integer i = 1; 
      while (true) { 
       System.out.println("Sending: " + i); 
       socket.send(i.toString().getBytes(), 0); 
       i++; 
      } 
     } 
    }.start(); 
} 

回答

2

乍一看,我和你一樣,並對行爲感到驚訝。但我做了一些研究,我想我找到了答案。

系統中還有其他緩衝區在這裏播放。設置高水位隻影響其中的一個。

http://www.aosabook.org/en/zeromq.html#fig.zeromq.arch

調用發送簡單推向管道,不等待它去了電線。關聯的I/O線程將消息從管道中讀取到網絡上。因爲你處在發送小消息的緊密循環中,所以在發送第一條消息之前,似乎已經填滿了管道。