MessageListener перестает слушать очередь HornetQ - PullRequest
0 голосов
/ 04 декабря 2018

Следующая проблема ухудшает мою производственную систему.Поэтому у меня есть несколько MDB, упакованных как приложения EAR, WAR и развернутые в JBOSS.Когда на моем веб-сайте много трафика, эти MDB перестают слушать сообщения, записываемые в очереди в HornetQ, и я вынужден перезагружать систему.В прошлый раз, когда это произошло, я написал автономный прослушиватель сообщений и смог прослушивать сообщения с того же сервера hq.Это указало на проблему на моем сервере приложений / уровне приложений.Я прилагаю следующее:

  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>
    

1 Ответ

0 голосов
/ 04 декабря 2018

Когда MDB перестают получать сообщения, вам нужно получить серию дампов потоков, чтобы увидеть, что делают потоки MDB (если что-нибудь).Часто такие проблемы возникают из-за проблем, связанных с конкретным приложением, которые легко идентифицировать с дампами потоков.

...