2013-02-09 4 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 스레드는 메시지를 파이프 라인에서 네트워크로 읽습니다. 작은 메시지를 보내는 등의 빡빡한 루프에 있기 때문에 첫 번째 메시지를 보내기 전에 파이프 라인을 채우고있는 것처럼 보입니다.