2015-11-20 3 views
0

Я пытаюсь доставить сообщение JMS через некоторое время, моя первоначальная идея заключалась в том, чтобы использовать очередь истечения срока действия и помещать сообщения в очередь, у которой нет пользователей. Таким образом, у меня есть 3 очереди по умолчанию:JMS доставляет сообщение позднее

  • WaitQueue - (экспирации очередь для этого устанавливается в SendQueue)
  • SendQueue - это один имеет потребителей, которые обрабатывают сообщения (по умолчанию это один имеет expiryQueue как его очередь ожидания)
  • ExpiryQueue - по умолчанию JBoss очереди для всех сообщений, которые действительно истекли (не намеренно)

Вставьте сообщение в WaitQueue с моей предполагаемой задержкой как TimeToLive, после истечения времени я ожидаю увидеть сообщения в SendQueue (и потребители для их обработки), однако он остается пустым и сообщения напрямую переходят в ExpiryQueue, любые идеи что не так?

Статистика SendQueue показывает, что «полученные сообщения» увеличиваются, но текущие сообщения остаются равными 0, поэтому они поступают, но сразу же перенаправляются на последний ExpiryQueue.

ответ

1

Вместо использования подхода очереди с истечением срока действия, который является более ресурсоемким; вы можете рассмотреть возможность использования задержки доставки на уровне сообщений.

В случае HornetQ вы можете установить свойство _HQ_SCHED_DELIVERY. https://docs.jboss.org/hornetq/2.3.0.Final/docs/user-manual/html/scheduled-messages.html

 

    TextMessage message = session.createTextMessage("This is a scheduled message message which will be delivered in 5 sec."); 
    message.setLongProperty("_HQ_SCHED_DELIVERY", System.currentTimeMillis() + 5000); 
    producer.send(message); 
 

С JMS2.0 (JavaEE7) это свойство может быть также установлен на MessageProducer. См. https://github.com/jboss/jboss-jms-api_spec/blob/master/src/main/java/javax/jms/MessageProducer.java#L285