Асинхронное чтение сообщений из IBM MQ

#java #message-driven-bean #ejb-3.2

#java #компонент, управляемый сообщениями #ejb-3.2

Вопрос:

Я хочу прочитать несколько сообщений из IBM MQ асинхронно. Я просто использую конфигурации MessageDrivenBean, как показано ниже.

 import java.io.IOException;
import java.util.ArrayList;

import javax.ejb.ActivationConfigProperty;
import javax.ejb.Asynchronous;
import javax.ejb.EJBException;
import javax.ejb.MessageDriven;
import javax.ejb.MessageDrivenBean;
import javax.ejb.MessageDrivenContext;
import javax.ejb.Stateless;
import javax.jms.*;


import com.tlr.searchextract.messages.MessageHandler;

@MessageDriven(
           name = "MessageTrigger_ABean",
           activationConfig = {
              @ActivationConfigProperty( propertyName = "destinationType", 
                                         propertyValue = "javax.jms.Queue"),
              @ActivationConfigProperty( propertyName = "destination", 
                                         propertyValue ="COMSERV.SRCHEXT.EVENTS.PUBLISH.QA.Q01"),
              @ActivationConfigProperty( propertyName = "hostname", 
              propertyValue ="reese"),
              @ActivationConfigProperty( propertyName = "channel", 
              propertyValue ="CLIENTCONNECTION"),
              @ActivationConfigProperty( propertyName = "port", 
              propertyValue ="1414")
           }
        )
/**
 * Bean implementation class for Enterprise Bean: MessageTrigger_A
 */

public class MessageTrigger_ABean implements MessageListener,MessageDrivenBean
     {
  /**
     * 
     */
    //private static final long serialVersionUID = 1L;
    private MessageDrivenContext fMessageDrivenCtx;
    
    
public javax.ejb.MessageDrivenContext getMessageDrivenContext() {
        return fMessageDrivenCtx;
    }
@Override
public void ejbRemove() throws EJBException {
    // TODO Auto-generated method stub
    
}

@Override
public void setMessageDrivenContext(MessageDrivenContext ctx) throws EJBException {
    fMessageDrivenCtx = ctx;
    
}


/**
 * onMessage
 */
public void onMessage(Message msg) {
    
    String messageText = "";
     System.out.println("inside onMessage of MessageTrigger_ABean ");
    try {
      System.out.println("check if msg instance of bytes");
        if (msg instanceof BytesMessage) {

            int length;
            byte[] buf2 = new byte[100];
            StringBuffer sb = new StringBuffer();
            BytesMessage bytesMessage = ((BytesMessage) msg);
            do {
                length = bytesMessage.readBytes(buf2);
                if (length != -1) {
                    for (int i = 0; i < length; i  ) {
                        //System.out.print((char) buf2[i]);
                        sb.append((char) buf2[i]);
                    }
                }
            }
            while (length >= 100);
            messageText = sb.toString();

        }
        
        else if (msg instanceof TextMessage) {
            System.out.println("check if msg instance of text");
            messageText = ((TextMessage) msg).getText();
        }

        int angleLeft = 0;
        angleLeft = messageText.indexOf("<");
        messageText = messageText.substring(angleLeft, messageText.length());
        
        MessageHandler mh = new MessageHandler();
        System.out.println("messagehandler java file:" messageText);
        mh.processMessages(messageText);

    }
    catch (Exception e) {
        System.out.println("JMSException: "   e.getMessage());
        
    }
    
}
    
}
  

Здесь метод onMessage не вызывается, даже если сообщения присутствуют в очереди. Пожалуйста, скажите мне, где я делаю неправильно.
Я использую нижеприведенный ejb jar, и у меня нет никаких конфигураций в ejb-jar.xml поскольку я использую здесь аннотации.
javax.ejb-api-3.2.jar

Комментарии:

1. Используете ли вы адаптер ресурсов для W-MQ? Довольно необычно видеть имя хоста и порт в спецификации активации — обычно это настраивается в настройке адаптера ресурсов. И у вас действительно есть вызываемая очередь queuename ? Что это за сервер приложений?

2. на самом деле это приложение Tomcat. где я могу настроить имя хоста и порт? и queuename отличается. я отредактирую вопрос

3. Извините — это выше моего понимания. Я даже не знал, что Tomcat поддерживает MDB. Я знаю, что IBM выпускает JCA-совместимый адаптер ресурсов, который может быть установлен на многих серверах приложений, хотя процедуры установки различаются в разных продуктах. Обычно вы настраиваете свойства подключения в собственной конфигурации сервера приложений и просто предоставляете его приложениям как имя JNDI. Извините — удачи.