2017-04-30 20 views
0

JBoss EAP 6.2を使用している現在のアプリケーションでは、リモートEJB呼び出しによって多くのバッチジョブがトリガーされています。これらのジョブのすべての通知ロジックを集中化するために、シリアル化されたメッセージを渡すことによってすべてのコールをMDB経由でルーティングすることを決定しています。意図した流れは以下の通りです:RTEの応答キューにメッセージが送信されない

  • バッチ・ジョブ・クライアントは、リモート・キューにメッセージを送信し
  • MDBは、このリモート・キュー、プロセスメッセージに耳を傾け、
  • DLQは、すべての再試行があるときに通知を処理するように構成されたEJBを呼び出します exhausted
  • 各リトライ時にも通知を送信する必要があります。 、あまりにも多くの の通知を避ける間隔が最後の点を処理するために

十分に高い再試行するために、私は のJMSReplyToヘッダにそれを設定することにより、 返信キューを作成してみました。

@MessageDriven(name = "MiddleManMDB", activationConfig = { 
     @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), 
     @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/test"), 
     @ActivationConfigProperty(propertyName = "connectorClassName", propertyValue = "org.hornetq.core.remoting.impl.netty.NettyConnectorFactory"), 
     @ActivationConfigProperty(propertyName = "connectionParameters", propertyValue = "host=localhost;port=5445"), 
     @ActivationConfigProperty(propertyName = "user", propertyValue = "queueuser"), 
     @ActivationConfigProperty(propertyName = "password", propertyValue = "queuepassword") 
}) 
public class MiddleManMDB implements MessageListener { 

    private static final Logger LOGGER = LoggerFactory.getLogger(MiddleManMDB.class); 

    @Resource(name = "java:/JmsXA") 
    private ConnectionFactory connectionFactory; 

    /* 
    * (non-Javadoc) 
    * @see javax.jms.MessageListener#onMessage(javax.jms.Message) 
    */ 
    @Override 
    public void onMessage(Message message) 
    { 
     try { 

     if (message instanceof TextMessage) { 
      LOGGER.info("Received text message --> {}", ((TextMessage)message).getText()); 
     } 

     throw new JMSException("thrown exception"); 
     } 
     catch (Exception e) { 
     sendToReplyQueue(e.getMessage(), message); 

     LOGGER.info("Throwing exception to simulate retry..."); 
     throw new RuntimeException(e); 
     } 
    } 

    private void sendToReplyQueue(String errorMessage, Message message) 
    { 
     Context context = null; 
     Connection conn = null; 

     LOGGER.info("Sending exception details to reply queue..."); 

     try { 
     context = new InitialContext(); 

     conn = connectionFactory.createConnection(); 
     Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); 
     Destination jmsReplyTo = message.getJMSReplyTo(); 
     MessageProducer replyProducer = session.createProducer(jmsReplyTo); 
     replyProducer.send(jmsReplyTo, session.createTextMessage(errorMessage)); 

     } 
     catch (NamingException | JMSException e) { 
     e.printStackTrace(); 
     } 
     finally { 
     // close connection and context 
     } 
    } 
} 

返信MDB:

@MessageDriven(name = "ReplyMDB", activationConfig = { 
     @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), 
     @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/reply") 
}) 
public class ReplyMDB implements MessageListener { 

    private static final Logger LOGGER = LoggerFactory.getLogger(ReplyMDB.class); 

    @Override 
    public void onMessage(Message message) { 
     try { 
     if (message instanceof TextMessage) { 
      LOGGER.info("Received reply message --> " + ((TextMessage)message).getText()); 
     } 
     } 
     catch (JMSException e) { 
     LOGGER.error("Error in reply queue...", e); 
     } 
    } 
} 

**デッドレターMDB:流れの上にシミュレートするために、私は... MDBの実装の下

メインMDBを作成しました* *

@MessageDriven(name = "DeadLetterMDB", activationConfig = { 
     @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), 
     @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/dead") 
}) 
public class DeadLetterMDB implements MessageListener { 

    private static final Logger LOGGER = LoggerFactory.getLogger(DeadLetterMDB.class); 

    @Override 
    public void onMessage(Message message) { 
     try { 
     LOGGER.info("Message has arrived in dead letter queue"); 
     LOGGER.info("Current delivery count - {}", message.getIntProperty("JMSXDeliveryCount")); 

     if (message instanceof TextMessage) { 
      LOGGER.info("Received text message --> {}", ((TextMessage)message).getText()); 
     } 
     } 
     catch (JMSException e) { 
     e.printStackTrace(); 
     } 
    } 
} 

**クライアント:スタンドアロン・full.xmlで**

public static void main(String[] args) { 
    Connection connection = null; 
    Context context = null; 

    try { 
     // create context and connection factory 

     Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
     Destination destination = (Destination) context.lookup("jms/queue/test"); 
     Destination replyDest = (Destination) context.lookup("jms/queue/reply"); 
     MessageProducer producer = session.createProducer(destination); 
     connection.start(); 

     TextMessage message = session.createTextMessage("Hello World"); 
     message.setJMSReplyTo(replyDest); 

     producer.send(message); 
    } 
    catch (NamingException | JMSException e) { 
     e.printStackTrace(); 
    } 
    finally { 
     // close context and connection 
    } 
} 

**関連エントリ:**

<address-settings> 
    <address-setting match="jms.queue.testQueue"> 
     <dead-letter-address>jms.queue.DLQ</dead-letter-address> 
     <expiry-address>jms.queue.ExpiryQueue</expiry-address> 
     <redelivery-delay>1000</redelivery-delay> 
     <max-delivery-attempts>3</max-delivery-attempts> 
     <max-size-bytes>10485760</max-size-bytes> 
     <address-full-policy>BLOCK</address-full-policy> 
     <message-counter-history-day-limit>10</message-counter-history-day-limit> 
    </address-setting> 
    <address-setting match="jms.queue.replyQueue"> 
     <redelivery-delay>1000</redelivery-delay> 
     <max-delivery-attempts>3</max-delivery-attempts> 
     <max-size-bytes>10485760</max-size-bytes> 
     <address-full-policy>BLOCK</address-full-policy> 
     <message-counter-history-day-limit>10</message-counter-history-day-limit> 
    </address-setting> 
    <address-setting match="jms.queue.DLQ"> 
     <redelivery-delay>1000</redelivery-delay> 
     <max-delivery-attempts>3</max-delivery-attempts> 
     <max-size-bytes>10485760</max-size-bytes> 
     <address-full-policy>BLOCK</address-full-policy> 
     <message-counter-history-day-limit>10</message-counter-history-day-limit> 
    </address-setting> 
</address-settings> 

<jms-destinations> 
    <jms-queue name="testQueue"> 
     <entry name="queue/test"/> 
     <entry name="java:jboss/exported/jms/queue/test"/> 
    </jms-queue> 
    <jms-queue name="replyQueue"> 
     <entry name="queue/reply"/> 
     <entry name="java:jboss/exported/jms/queue/reply"/> 
    </jms-queue> 
    <jms-queue name="DLQ"> 
     <entry name="queue/dead"/> 
     <entry name="java:jboss/exported/jms/queue/dead"/> 
    </jms-queue> 
    <jms-topic name="testTopic"> 
     <entry name="topic/test"/> 
     <entry name="java:jboss/exported/jms/topic/test"/> 
    </jms-topic> 
</jms-destinations> 

は今のMDBで上記の流れで、メッセージがで受信されることはありません応答キュー。 3つのキューはすべて同じサーバーに配置されます。私はその理由を推測してい

が下の行です:sendは非同期であり、私はRTEを投げてい

sendToReplyQueue(e.getMessage(), message); 
LOGGER.info("Throwing exception to simulate retry..."); 
throw new RuntimeException(e); 

ので(再試行をトリガーする)、メッセージが何らかの形で送信されることはありません。この問題を解決する方法はありますか?

答えて

0

私はあなたがRTEをコメントして試すことができます......

を下の行である理由を推測しています。トレースするロガーをさらに追加してください。応答先が正しく設定されているかどうかを確認してください。

message.setJMSReplyTo(replydestination);  
LOGGER.info("Reply to: " + message.getJMSReplyTo()); 

またはメッセージキューを再生か

replyProducer.send(jmsReplyTo, session.createTextMessage(errorMessage)); 
    LOGGER.info("exception details sent to reply queue..."); 
に送られ
関連する問題