0

次の問題により、本番システムに障害が発生しています。そのため、複数の MDB を EAR、WAR アプリケーションとしてパッケージ化し、JBOSS にデプロイしています。私の Web サイトに大量のトラフィックがあると、これらの MDB は HornetQ のキューに書き込まれるメッセージのリッスンを停止し、システムの再起動を余儀なくされます。前回これが発生したとき、私はスタンドアロンのメッセージ リスナーを作成し、同じ本社サーバーからのメッセージをリッスンすることができました。これにより、問題がアプリケーション サーバー/アプリケーション レベルにあることがわかりました。以下を添付しています。

  1. 典型的な MDB

    @MessageDriven(activationConfig = {
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), 
        @ActivationConfigProperty(propertyName = "destination", propertyValue = Queues.CHAT_HANDLER),})
    @ResourceAdapter("hornetq-ra.rar")
    public class ChatHandlerQueueListener implements MessageListener {
    
     public static final Logger logger = LoggerFactory.getLogger(ChatHandlerQueueListener.class);
    
     @Inject
     IChatManager chatManager;
    
     public void onMessage(Message message) {
        ObjectMessage objectMessage = (ObjectMessage) message;
        ComponentMessage routingEngineResponse = null;
        try {
           routingEngineResponse = (ComponentMessage) objectMessage.getObject();
           boolean messageRedelivered = message.getJMSRedelivered();
           if (logger.isTraceEnabled())
              logger.trace("ChatHandlerQueueListener.callingChatManager Incoming response is {}", JsonUtils.toJson(routingEngineResponse));
           if (routingEngineResponse == null)
              return;
           if (messageRedelivered) {
              // Sending the message acknowledgement manually
              message.acknowledge();
           }
    
        } catch (JMSException e) {
           logger.error("ChatHandlerQueueListener.onMessage Type: null", e);
        }
        if (routingEngineResponse.getType().equals(MessageType.ChatAction) || routingEngineResponse.getType().equals(MessageType.ChatTransfer)) {
           try {
              logger.debug("ChatHandlerQueueListener.callingChatManager {}", JsonUtils.toJson(routingEngineResponse));
              chatManager.processRoutingEngineResponseMessage(routingEngineResponse);
           } catch (UnknownReActionTypeException e) {
              logger.error("ChatHandlerQueueListener.onMessage Type: UnknownReActionTypeException {}", e);
           }
        } else if (routingEngineResponse.getType().equals(MessageType.InboundSms)) {
           logger.debug("Calling request for agent {}", JsonUtils.toJson(routingEngineResponse));
           try {
              chatManager.processChatMessage(routingEngineResponse);
           } catch (ChatServiceUnavailableException | JMSException | ApplicationException e) {
              logger.error("ChatHandlerQueueListener.onMessage Type: Exception {}", e);
           }
        } else if (routingEngineResponse.getType().equals(MessageType.ChatMessage)) {
           try {
              chatManager.processChatMessage(routingEngineResponse);
           } catch (ChatServiceUnavailableException | JMSException | ApplicationException e) {
              logger.error("ChatHandlerQueueListener.onMessage Type: Exception {}", e);
           }
        } else if (routingEngineResponse.getType().equals(MessageType.TropoSmsDelivery)) {
           logger.debug("Calling smsDelvieryHandler {}", JsonUtils.toJson(routingEngineResponse));
           try {
              chatManager.processSmsDeliveryMessage(routingEngineResponse);
           } catch (Exception e) {
              logger.error("ChatHandlerQueueListener.onMessage Type: Exception {}", e);
           }
        } else {
           try {
              logger.trace("Unexpected message seletor found: {}", message.getStringProperty("MESSAGE_TYPE"));
           } catch (JMSException e) {
              logger.error("ChatHandlerQueueListener.onMessage Type: Exception {}", e);
           }
        }
     }
    

    }

  2. JBOSS 設定ファイル

    <hornetq-server>
       <persistence-enabled>true</persistence-enabled>
       <connectors>
          <connector name="netty">
             <factory-class>org.hornetq.core.remoting.impl.netty.NettyConnectorFactory</factory-class>
             <param key="host" value="${jboss.bind.remote.hq.address}"/>
             <param key="port" value="${jboss.bind.remote.hq.port}"/>
          </connector>
       </connectors>
       <jms-connection-factories>
          <connection-factory name="RemoteConnectionFactory">
             <connectors>
                <connector-ref connector-name="netty"/>
             </connectors>
             <entries>
                <entry name="RemoteConnectionFactory"/>
             </entries>
          </connection-factory>
          <pooled-connection-factory name="hornetq-ra">
             <transaction mode="xa"/>
             <connectors>
                <connector-ref connector-name="netty"/>
             </connectors>
             <entries>
                <entry name="java:/JmsXA"/>
             </entries>
          </pooled-connection-factory>
       </jms-connection-factories>
    </hornetq-server>
    
4

1 に答える 1