2013-07-24 4 views
2

Я пытаюсь реализовать задержанную очередь с переопределением сообщений с помощью Active MQ.ActiveMQ Переопределить запланированное сообщение

Каждое сообщение планируется быть доставлены с задержкой х (скажем, 60 секунд)

между ними, если же сообщение получено снова он должен отменить предыдущее сообщение.

Так что даже если я получу 10 сообщений, скажите в х секунд. Должно быть обработано только одно сообщение.

Есть ли чистый способ достичь этого?

ответ

5

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

Может быть отложено сообщение в ActiveMQ?

Да - см. Delay and Schedule Message Delivery. Вам нужно установить <broker ... schedulerSupport="true"> в конфигурацию ActiveMQ, а также установить свойство AMQ_SCHEDULED_DELAY сообщения JMS о том, как долго вы хотите, чтобы сообщение было отложено (10000 в вашем случае).

Есть ли способ предотвратить использование одного и того же сообщения более одного раза?

Да, но это касается приложений, а не ActiveMQ. Его часто называют дедупликацией или идемпотентным потреблением. Самый простой способ, если у вас есть только один потребитель, - отслеживать сообщения, полученные на карте, и проверять, действительно ли вы получаете сообщение. Это было видно, отбросить.

Для более сложных случаев использования, когда у вас несколько пользователей на разных компьютерах, или вы хотите, чтобы это состояние выдержало перезапуск приложения, вам нужно будет хранить таблицу сообщений, просматриваемую в базе данных, и запрашивать ее каждый раз.

Просьба проголосовать за этот ответ, если это поможет, так как оно побуждает людей помочь вам.

0

Также в соответствии с методом класса ActiveMQ BrokerService вы должны настроить постоянство, чтобы иметь возможность использовать функциональность планировщика.

public boolean isSchedulerSupport() { 
    return this.schedulerSupport && (isPersistent() || jobSchedulerStore != null); 
} 
0

вы можете настроить ActiveMQ брокера для того, чтобы «schedulerSupport» со следующей записью в файле activemq.xml, расположенном в конфе каталоге вашего ActiveMQ домашней директории.

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}" schedulerSupport="true"> 
+0

Вы знаете, как вы бы настроить это с помощью загрузки пружины? @Chanaka удайя – neaGaze

0

Вы можете переопределить BrokerService в конфигурации

@Configuration 
    @EnableJms 
    public class JMSConfiguration { 

     @Bean 
     public BrokerService brokerService() throws Exception { 
      BrokerService brokerService = new BrokerService(); 
      brokerService.setSchedulerSupport(true); 
      return brokerService; 
     } 
    } 
Смежные вопросы