2017-02-24 12 views
0

処理するメッセージがActiveMQにプッシュされるシステムを開発しています。私は、消費者が着信シーケンスでメッセージを処理しなければならないという厳しい要件を持っています。コンシューマでメッセージ処理が失敗した場合は、ロールバック/リカバリを行い、無限に再試行を続ける必要があります。メッセージ処理が成功した場合にのみ、消費者はコミットして次のメッセージに進む必要があります。ActivemMQメッセージのDLQと再配信を無効にする

ロールバックされたメッセージの自動転送をDLQに防止する方法と、そのような要件の再配信ポリシーを構成する適切な方法は何ですか。

答えて

0

設定した場合、メッセージがDLQに送信されることはありません。以下のように無限に再送します。 ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE

policy.setMaximumRedeliveries(RedeliveryPolicy.NO_MAXIMUM_REDELIVERIES);

あなたはメッセージを一つずつ認めます。

http://activemq.apache.org/redelivery-policy.html

import javax.jms.Connection; 
import javax.jms.JMSException; 
import javax.jms.Message; 
import javax.jms.MessageListener; 

import org.apache.activemq.ActiveMQConnectionFactory; 
import org.apache.activemq.ActiveMQMessageConsumer; 
import org.apache.activemq.ActiveMQSession; 
import org.apache.activemq.RedeliveryPolicy; 

public class SimpleConsumerIndividualAcknowledge { 

    public static void main(String[] args) throws JMSException { 
     Connection conn = null; 
     try { 
      ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory("tcp://localhost:61616"); 
      RedeliveryPolicy policy = new RedeliveryPolicy(); 
      policy.setMaximumRedeliveries(RedeliveryPolicy.NO_MAXIMUM_REDELIVERIES); 
      cf.setRedeliveryPolicy(policy); 
      conn = cf.createConnection(); 
      ActiveMQSession session = (ActiveMQSession) conn.createSession(false, 
        ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE); 
      ActiveMQMessageConsumer consumer = (ActiveMQMessageConsumer) session 
        .createConsumer(session.createQueue("test")); 
      consumer.setMessageListener(new MessageListener() { 
       @Override 
       public void onMessage(Message message) { 
        try { 
         //do your stuff 
         message.acknowledge(); 
        } catch (Exception e) { 
         throw new RuntimeException(e);//ActiveMQMessageConsumer.rollback() is called automatically 
        } 
       } 
      }); 
      conn.start(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      if (conn != null) { 
       try { 
        conn.close(); 
       } catch (Exception e) { 
       } 
      } 
     } 
    } 
} 

手動で停止して再起動したい場合は、消費者こちらをご覧activemq-redelivery-does-not-work

を取ります
関連する問題