2013-07-24 105 views
2

我想實現延遲隊列,使用Active MQ重寫消息。ActiveMQ覆蓋預定消息

每個消息被調度到與x的延遲來被傳遞(說60秒)

在之間如果再次接收到相同的消息時,它應該覆蓋先前的消息。

所以即使我收到10條消息說在x秒。只有一條消息應該被處理。

有乾淨的方法來完成這個嗎?

回答

5

的問題有兩個部分需要另行處理:

能的消息在ActiveMQ中被延遲?

是 - 請參閱Delay and Schedule Message Delivery。您需要在ActiveMQ配置中設置<broker ... schedulerSupport="true">,並設置JMS消息的AMQ_SCHEDULED_DELAY屬性,說明您希望消息延遲多久(在您的情況下爲10000)。

有什麼辦法可以防止同一消息被多次使用嗎?

是的,但這是一個應用程序的問題,而不是一個ActiveMQ之一。它通常被稱爲去重或冪等消費。如果您只有一個消費者,最簡單的方法是跟蹤地圖中收到的消息,並檢查該地圖是否收到消息。它已被看到,丟棄。

對於在不同計算機上有多個使用者或者希望該狀態在應用程序重新啓動後仍然存在的更復雜用例,您需要在數據庫中保留一條消息表,並且每次都要查詢它。

如果有幫助,請選擇此答案,因爲它會鼓勵人們幫助您。

0

同樣根據ActiveMQ BrokerService類中的方法,您應該配置持久性以具備使用調度程序功能的能力。

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

可以配置ActiveMQ代理,以使「schedulerSupport」在位於您的ActiveMQ主目錄的conf目錄下的文件activemq.xml中以下項。

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

你知道你會怎麼配置這個用spring啓動? @Chanaka udaya – neaGaze

0

可以覆蓋的BrokerService在配置

@Configuration 
    @EnableJms 
    public class JMSConfiguration { 

     @Bean 
     public BrokerService brokerService() throws Exception { 
      BrokerService brokerService = new BrokerService(); 
      brokerService.setSchedulerSupport(true); 
      return brokerService; 
     } 
    }