2009-10-06 3 views
4

Привет всем Кто знает, как создать прослушиватель сообщений с помощью IBM MQ? Я знаю, как это сделать, используя спецификацию JMS, но я не уверен, как это сделать для IBM MQ. Любые ссылки или указатели приветствуются.IBM MQ Message Listener

+0

Если вы знаете, как сделать это для JMS, зачем вам сделать его MQ-специфическим? – skaffman

+0

Эй вы можете мне рассказать, как подключиться к IBM MQ с помощью JMS, например, я хочу знать, как указать диспетчер очереди, канал и т. Д. –

ответ

4

Посмотрите на помощь IBM: Writing WebSphere MQ base Java applications

IBM имеет API для взаимодействия с очередями. Вот их пример:

import com.ibm.mq.*;   // Include the WebSphere MQ classes for Java package 


public class MQSample 
{ 
    private String qManager = "your_Q_manager"; // define name of queue 
               // manager to connect to. 
    private MQQueueManager qMgr;     // define a queue manager 
               // object 
    public static void main(String args[]) { 
    new MQSample(); 
    } 

    public MQSample() { 
    try { 

     // Create a connection to the queue manager 

     qMgr = new MQQueueManager(qManager); 

     // Set up the options on the queue we wish to open... 
     // Note. All WebSphere MQ Options are prefixed with MQC in Java. 

     int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | 
         MQC.MQOO_OUTPUT ; 

     // Now specify the queue that we wish to open, 
     // and the open options... 

     MQQueue system_default_local_queue = 
       qMgr.accessQueue("SYSTEM.DEFAULT.LOCAL.QUEUE", 
           openOptions); 

     // Define a simple WebSphere MQ message, and write some text in UTF format.. 

     MQMessage hello_world = new MQMessage(); 
     hello_world.writeUTF("Hello World!"); 

     // specify the message options... 

     MQPutMessageOptions pmo = new MQPutMessageOptions(); // accept the // defaults, 
                  // same as MQPMO_DEFAULT 

     // put the message on the queue 

     system_default_local_queue.put(hello_world,pmo); 

     // get the message back again... 
     // First define a WebSphere MQ message buffer to receive the message into.. 

     MQMessage retrievedMessage = new MQMessage(); 
     retrievedMessage.messageId = hello_world.messageId; 

     // Set the get message options... 

     MQGetMessageOptions gmo = new MQGetMessageOptions(); // accept the defaults 
                  // same as MQGMO_DEFAULT 
     // get the message off the queue... 

     system_default_local_queue.get(retrievedMessage, gmo); 

     // And prove we have the message by displaying the UTF message text 

     String msgText = retrievedMessage.readUTF(); 
     System.out.println("The message is: " + msgText); 
     // Close the queue... 
     system_default_local_queue.close(); 
     // Disconnect from the queue manager 

     qMgr.disconnect(); 
    } 
     // If an error has occurred in the above, try to identify what went wrong 
     // Was it a WebSphere MQ error? 
    catch (MQException ex) 
    { 
     System.out.println("A WebSphere MQ error occurred : Completion code " + 
         ex.completionCode + " Reason code " + ex.reasonCode); 
    } 
     // Was it a Java buffer space error? 
    catch (java.io.IOException ex) 
    { 
     System.out.println("An error occurred whilst writing to the message buffer: " + ex); 
    } 
    } 
} // end of sample 

Я не уверен, что банки IBM расположены на базе Maven repo. Я знаю, что в прошлом мне приходилось извлекать их из локальной установки IBM и помещать их в локальное репо SVN. Я использую следующие банки:

<dependency> 
    <groupId>com.ibm</groupId> 
    <artifactId>com.ibm.mq</artifactId> 
    <version>5.3.00</version> 
    <scope>compile</scope> 
</dependency> 
    <dependency> 
    <groupId>com.ibm</groupId> 
    <artifactId>com.ibm.mq.pcf</artifactId> 
    <version>5.3.00</version> 
    <scope>compile</scope> 
</dependency> 
    <dependency> 
    <groupId>com.ibm</groupId> 
    <artifactId>com.ibm.mqbind</artifactId> 
    <version>5.3.00</version> 
    <scope>compile</scope> 
</dependency> 
    <dependency> 
    <groupId>com.ibm</groupId> 
    <artifactId>com.ibm.mqjms</artifactId> 
    <version>5.3.00</version> 
    <scope>compile</scope> 
</dependency> 
+0

Привет, спасибо за ответ. Я проверил эти сайты, но я до сих пор не нашел примера, который использует асинхронные прослушиватели сообщений. Есть идеи? Благодарю. – x1a0

+0

Мы создаем поток, который ищет сообщения каждые X секунд в очереди, расположенной в менеджере очередей. Кроме того, вы можете отредактировать исходный вопрос, если это то, что вы действительно ищете. – Droo

2

Взгляните на образец, указанный выше.

В частности на линиях

MQGetMessageOptions gmo = new MQGetMessageOptions();  
system_default_local_queue.get(retrievedMessage, gmo); 

Вы можете настроить получить ждать определенное время, прежде чем выбросить MQRC_NO_MSG_AVAILABLE исключение. Или ты можешь ждать вечно.

gmo.waitInterval= qTimeout; 
gmo.options = MQC.MQGMO_WAIT 

Таким образом, вы можете создать поток, который продолжает искать новые сообщения, а затем передает их обработчику. Получение и размещение не обязательно должны быть в одном и том же потоке или даже в приложении.

Надеюсь, это поможет ответить на ваш вопрос.

6

Несмотря на наличие Java API Java WMQ, как отмечено предыдущими респондентами, WMQ поддерживает JMS, так что вот некоторые ресурсы, которые помогут вам начать работу там.

Посмотрите на эту статью: IBM WebSphere Developer Technical Journal: Running a standalone Java application on WebSphere MQ V6.0

Кроме того, если вы установили полный клиент WMQ и не просто схватил банки, то вы будете иметь много примеров кода, установленного. По умолчанию они будут работать в C: \ Program Files \ IBM \ WebSphere MQ \ tools \ jms или/opt/mqm/samp в зависимости от вашей платформы.

Если вам нужен установочный носитель клиента WMQ, получите его here. Обратите внимание, что это клиент WMQ v7, а не клиент v6. Он совместим с v6 QMgr, но поскольку v6 - это конец жизни по состоянию на сентябрь 2011 года, вы должны делать новую разработку на клиенте v7 и, если возможно, v7 QMgr. Существует множество функциональных и улучшений производительности, если обе стороны - v7.

Вы можете получить руководство по эксплуатации here, если вам это нужно.

Наконец, убедитесь, что при получении исключения JMS распечатайте связанное исключение. Это не вещь WMQ, скорее это JMS. Sun предоставила многоуровневую структуру данных для исключений JMS, и действительно интересные части часто находятся на вложенном уровне. Это не имеет большое значение и может быть реализовано в нескольких строках:

try { 
    . 
    . code that might throw a JMSException 
    . 
} catch (JMSException je) { 
    System.err.println("caught "+je); 
    Exception e = je.getLinkedException(); 
    if (e != null) { 
    System.err.println("linked exception: "+e); 
    } else { 
    System.err.println("No linked exception found."); 
    } 
} 

Это помогает определить разницу между ошибкой JMS против транспортной ошибки. Например, ошибка безопасности JMS может быть WMQ 2035, или это может быть конфигурация JSSE, или приложение может не иметь доступа к чему-либо в файловой системе. Только один из них стоит потратить много времени на перекодирование журналов ошибок WMQ и только путем печати связанного исключения вы сможете узнать, является ли он таковым.

2

Важным моментом в дополнение к существующим ответам: JMS предоставляет MessageListener, класс, который позволяет получать сообщения как асинхронные обратные вызовы.

Натуральный API имеет нет эквивалентной функции! Вам необходимо повторно позвонить get(...), если необходимо.

2

в петле перед тем, как сообщение, которое вы можете указать следующие

gmo.options = MQC.MQGMO_WAIT 
gmo.waitInterval = MQConstants.MQWI_UNLIMITED; 

это делает цикл будет ждать до тех пор, пока сообщение в очереди. Для меня это похоже на MessageListerner

2

Только в случае, если кто будет Google StackOverflow для MQ Listener, как я сделал ... Это может быть не ответ из-за реализации JMS, но это то, что я искал. Что-то вроде этого:

MQQueueConnectionFactory cf = new MQQueueConnectionFactory(); 
MQQueueConnection conn = (MQQueueConnection)cf.createQueueConnection(); 
MQQueueSession session = (MQQueueSession)conn.createSession(false, 1); 

Queue queue = session.createQueue("QUEUE"); 

MQQueueReceiver receiver = (MQQueueReceiver)session.createReceiver(queue); 

receiver.setMessageListener(new YourListener()); 

conn.start(); 

YourListener должен реализовывать интерфейс MessageListener и вы получите вам сообщения в метод OnMessage (MSG Message).

0

Здравствуйте, вот рабочий пример прослушивателя сообщений с IBM MQ. Здесь я использовал весной также создать бобы и т.д. ...

package queue.app; 

import javax.annotation.PostConstruct; 
import javax.jms.Message; 
import javax.jms.MessageListener; 
import javax.jms.Queue; 
import javax.jms.QueueConnection; 
import javax.jms.QueueReceiver; 
import javax.jms.QueueSession; 
import javax.jms.Session; 
import javax.jms.TextMessage; 

import org.apache.log4j.Logger; 
import org.springframework.beans.factory.annotation.Value; 
import org.springframework.stereotype.Component; 

import com.ibm.mq.jms.MQQueue; 
import com.ibm.mq.jms.MQQueueConnectionFactory; 
import com.ibm.msg.client.wmq.WMQConstants; 


@Component 
public class QueueConsumer implements MessageListener{ 

    private Logger logger = Logger.getLogger(getClass()); 

    MQQueueConnectionFactory qcf = new MQQueueConnectionFactory(); 
    QueueConnection qc; 
    Queue queue; 
    QueueSession queueSession; 
    QueueReceiver qr; 

    @Value("${jms.hostName}") 
    String jmsHost; 
    @Value("${jms.port}") 
    String jmsPort; 
    @Value("${jms.queue.name}") 
    String QUEUE_NAME; 
    @Value("${jms.queueManager}") 
    String jmsQueueMgr; 
    @Value("${jms.username}") 
    String jmsUserName; 
    @Value("${jms.channel}") 
    String jmsChannel; 

    @PostConstruct 
    public void init() throws Exception{ 
     qcf.setHostName (jmsHost); 
     qcf.setPort (Integer.parseInt(jmsPort)); 
     qcf.setQueueManager (jmsQueueMgr); 
     qcf.setChannel (jmsChannel); 
     qcf.setTransportType (WMQConstants.WMQ_CM_CLIENT); 
     qc = qcf.createQueueConnection(); 

     queue = new MQQueue(QUEUE_NAME); 
     qc.createQueueSession (false, Session.AUTO_ACKNOWLEDGE); 
     queueSession = qc.createQueueSession (false, Session.AUTO_ACKNOWLEDGE); 
     qr = queueSession.createReceiver(queue); 
     qr.setMessageListener(this); 
     qc.start(); 

    } 


    @Override 
    public void onMessage(Message message) { 
     logger.info("Inside On Message..."); 
     long t1 = System.currentTimeMillis(); 
     logger.info("Message consumed at ...."+t1); 

     try{ 
      if(message instanceof TextMessage) { 
       logger.info("String message recieved >> "+((TextMessage) message).getText()); 
      } 

     }catch(Exception e){ 
      e.printStackTrace(); 
     } 

    } 
} 

Ниже приведены зависимости я есть ..

<dependency> 
      <groupId>com.sun.messaging.mq</groupId> 
      <artifactId>fscontext</artifactId> 
      <version>4.2</version> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>com.ibm</groupId> 
      <artifactId>jms</artifactId> 
      <version>1.0</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-jms</artifactId> 
      <version>3.2.17.RELEASE</version> 
     </dependency> 


     <dependency> 
      <groupId>com.ibm</groupId> 
      <artifactId>com.ibm.mq</artifactId> 
      <version>1.0</version> 
     </dependency> 
     <dependency> 
      <groupId>com.ibm</groupId> 
      <artifactId>com.ibm.mq.allclient</artifactId> 
      <version>1.0</version> 
     </dependency> 
     <dependency> 
      <groupId>com.ibm</groupId> 
      <artifactId>com.ibm.mq.jmqi</artifactId> 
      <version>1.0</version> 
     </dependency> 
     <dependency> 
      <groupId>com.ibm</groupId> 
      <artifactId>com.ibm.mqjms</artifactId> 
      <version>1.0</version> 
     </dependency> 
Смежные вопросы