2017-02-23 49 views
0

當消費者無法處理消息並調用會話回滾時,我需要禁用消息重新傳遞。目標是將消息保留在隊列中,而不用重新傳遞,而我的後臺消費者將繼續嘗試處理消息。以編程方式禁用ActiveMQ消息重新傳遞

在connection.getRedeliveryPolicy()中,我看到了一些選項來自定義重新傳遞延遲和其他設置,但我沒有看到任何選項來完全禁用重新傳遞。這甚至是可能的(最好以編程方式使用connection.getRedeliveryPolicy()屬性例如)

回答

0

不幸的是,沒有解決方案來停用RedeliveryPolicy,但是你可以設計你的代碼,否則。

看看這裏ActiveMQ redelivery does not work

也許org.apache.activemq.ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE可以幫助你,但請記住這一點:

一旦券商已派出消息的預取限制數量 消費者也不會派遣向該消費者發送更多消息,直到消費者已經確認其接收到的至少50%預取的消息,例如預取/ 2。當代理收到所述確認時,它將向消費者發送進一步的預取/ 2 數量的「充值」,因爲它是其預取緩衝器。請注意,可以根據每個消費者指定預取限制 (請參閱下文)。

另一種解決方案是將消息發送到另一個隊列以供後臺消費者使用。

0

那麼,你可以做幾個技巧。

典型的方法是使用內置的DLQ功能,並讓回滾消息前往DLQ。然後你可以有任何過程試圖處理這些消息。

但是,如果您真的想將回滾的消息保留在隊列中,並且不會被消費者觸及,那麼也可以實現此目的。

首先。將max redeliveres設置爲1,即消息將重試一次。

ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory("tcp://localhost:61616"); 
RedeliveryPolicy policy = new RedeliveryPolicy(); 
policy.setMaximumRedeliveries(1); 
cf.setRedeliveryPolicy(policy); 

然後確保只使用選擇器接收未重新發送的消息。

MessageConsumer cons = sess.createConsumer(sess.createQueue("FOOBAR"), "JMSRedelivered <> true"); 

要閱讀回滾的消息,您必須使用反向選擇器來閱讀。無論如何,我仍然建議爲回滾消息使用單獨的隊列,例如內置的DLQ。處理起來更容易,而且容易出錯。