2014-11-12 2 views
2

지연 메시지 처리에 RabbitMQ를 사용합니다. 구현을 위해 WorkQueue와 WaitQueue의 두 대기열을 사용합니다. 처음에는 메시지가 만료 된 시간과 함께 WaitQueue에 전달됩니다. 이 시간이 지나면 WorkQueue로 이동해야합니다. 그러나 그것은 효과가 없습니다. 2 개의 메시지를 넣는 경우 : 만료 시간 1 분 10 분. 이 경우 두 메시지는 10 분 후에 배달됩니다. 올바른 행동입니까?RabbitMQ의 만료 시간

대기열 생성 :

channel.queueDeclare(Config.getInstance().getRabbitmqWorkQueue(), true, false, false, null); 
channel.queueBind(Config.getInstance().getRabbitmqWorkQueue(), Config.getInstance().getRabbitmqWorkExchange(), ""); 
Map<String, Object> args = new HashMap<>(); 
args.put("x-dead-letter-exchange", Config.getInstance().getRabbitmqWorkExchange()); 
channel.exchangeDeclare(Config.getInstance().getRabbitmqWaitExchange(), "direct"); 
channel.queueDeclare(Config.getInstance().getRabbitmqWaitQueue(), true, false, false, args); 
channel.queueBind(Config.getInstance().getRabbitmqWaitQueue(), Config.getInstance().getRabbitmqWaitExchange(), ""); 

메시지가 전송 :

channel.basicPublish(Config.getInstance().getRabbitmqWaitExchange(), "", 
    new AMQP.BasicProperties.Builder() 
    .deliveryMode(1) 
    .expiration(String.valueOf(delay)) 
    .build(), ByteBuffer.allocate(8).putLong(event.getId()).array()); 
+0

몇 가지 코드를 살펴 보겠습니다. 메시지 대신 대기열에서 시간 제한을 설정하는 중일 수 있습니다. –

+0

대기열 생성 및 메시지 전송 코드가 첨부되었습니다. – dmitrievanthony

+0

몇 가지 : 메시지 시간 제한을 제어하는 ​​'지연'값을 설정하는 코드가 표시되지 않습니다. 필자는 빌더 호출을 자체 객체가 인스턴스화 된 별도의 행으로 가져 오는 것이 좋습니다. 디버거를 사용하여'BasicProperties' 인스턴스를 깨고 값을 확인하십시오. 나는 당신이'지연 '을 설정하는 코드에 버그가 있다고 생각하고있다. –

답변

2

소비자 만료 된 메시지 큐의 헤드가 실제로 삭제됩니다 도달 (또는 경우에만 만료 된 메시지를 볼 수 없을 동안 dead- 문자). (c) documentation