2016-06-15 3 views
0

기다리지 않습니다 온다. 대신, 즉시 멈 춥니 다.는 어떻게 다음 코드를 시작할 때마다 내 channel.basicConsume 메시지

DateTime startedAt = new DateTime(); 
    DateTime stopAt = startedAt.plusSeconds(60); 
    long i=0; 
    try { 
     while (stopAt.compareTo(new DateTime()) > 0) { 
      channel.basicConsume(queueName, true, consumer); 
      i++; 
     } 
    }finally { 
     System.out.println(new DateTime()); 
     System.out.println(startedAt); 
     System.out.println(stopAt); 
     System.out.println(i); 
    } 

올바른 잠시 동안 메시지를들을 수있는 더 좋은 방법이 있어야 다음과 같이 나는 그것이 몇 시간 동안 소비 할 수있는 유일한 방법은, 루프와 channel.basicConsume을 대체하는 것입니다? 내가 뭘 놓치고 있니? 바로 듣기를 중단합니다.

+0

ConnectException : Connection refused와 같은 예외가 없는가? –

답변

3

정말 확실합니까? basicConsume이 수행하는 작업은 특정 대기열을 청취하기 위해 소비자를 등록하므로 루프에서 실행하지 않아도됩니다. 한 번만 실행하면 메시지가 도착할 때마다 Consumer 인스턴스의 handleDelivery 메서드가 호출됩니다.

rabbitmq 라이브러리가 생성하는 스레드는 JVM이 종료되지 않도록해야합니다. 프로그램을 종료하기 위해 실제로 여기 connection.close()

를 호출해야하는 rabbitmq에서 완전한 수신기의 예입니다 : https://github.com/rabbitmq/rabbitmq-tutorials/blob/master/java/Recv.java

그것의 실제로 거의 같은 당신과 같은.

0

나는 동일한 문제가있었습니다. 그 이유는 내가 마지막에 connection.close를 호출했기 때문입니다. 그러나 basicConsume() 메서드는 다른 스레드가 아니라 현재 스레드에서 차단되지 않으므로 그 이후의 코드, 즉 connection.close()가 즉시 호출됩니다.

관련 문제