Привет всем Кто знает, как создать прослушиватель сообщений с помощью IBM MQ? Я знаю, как это сделать, используя спецификацию JMS, но я не уверен, как это сделать для IBM MQ. Любые ссылки или указатели приветствуются.IBM MQ Message Listener
ответ
Посмотрите на помощь 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>
Привет, спасибо за ответ. Я проверил эти сайты, но я до сих пор не нашел примера, который использует асинхронные прослушиватели сообщений. Есть идеи? Благодарю. – x1a0
Мы создаем поток, который ищет сообщения каждые X секунд в очереди, расположенной в менеджере очередей. Кроме того, вы можете отредактировать исходный вопрос, если это то, что вы действительно ищете. – Droo
Взгляните на образец, указанный выше.
В частности на линиях
MQGetMessageOptions gmo = new MQGetMessageOptions();
system_default_local_queue.get(retrievedMessage, gmo);
Вы можете настроить получить ждать определенное время, прежде чем выбросить MQRC_NO_MSG_AVAILABLE исключение. Или ты можешь ждать вечно.
gmo.waitInterval= qTimeout;
gmo.options = MQC.MQGMO_WAIT
Таким образом, вы можете создать поток, который продолжает искать новые сообщения, а затем передает их обработчику. Получение и размещение не обязательно должны быть в одном и том же потоке или даже в приложении.
Надеюсь, это поможет ответить на ваш вопрос.
Несмотря на наличие 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 и только путем печати связанного исключения вы сможете узнать, является ли он таковым.
Важным моментом в дополнение к существующим ответам: JMS предоставляет MessageListener
, класс, который позволяет получать сообщения как асинхронные обратные вызовы.
Натуральный API имеет нет эквивалентной функции! Вам необходимо повторно позвонить get(...)
, если необходимо.
в петле перед тем, как сообщение, которое вы можете указать следующие
gmo.options = MQC.MQGMO_WAIT
gmo.waitInterval = MQConstants.MQWI_UNLIMITED;
это делает цикл будет ждать до тех пор, пока сообщение в очереди. Для меня это похоже на MessageListerner
Только в случае, если кто будет 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).
Здравствуйте, вот рабочий пример прослушивателя сообщений с 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>
- 1. IBM MQ JMS Message Listener
- 2. IBM Mq Message Header
- 3. WebSphere MQ Message Listener Threads
- 4. WCF IBM Websphere MQ Communication (WCF Listener)
- 5. Spring `jms: listener-container` и очереди резервного копирования IBM MQ
- 6. IBM MQ - Проснись канал MQ
- 7. Android Wear Message Listener
- 8. Websphere MQ message redelivery
- 9. IBM Blueemix Message Hub - поток Message Connect не работает
- 10. IBM MQ Асинхронная выборка с использованием .Net
- 11. Auto spawn rabbit mq listener
- 12. IBM MQ Java - транзакции
- 13. Глубина IBM MQ
- 14. IBM MQ - NoSuchMethodError - getQmgrSplCapability()
- 15. MuleSoft + IBM MQ connection
- 16. Ограничения IBM MQ
- 17. Глубина IBM MQ queue
- 18. Spring JMS Message Listener Container
- 19. Start stop JMS Message Listener
- 20. No-message listener для обработчика
- 21. Сообщение о передаче сообщений IBM Queue Message
- 22. сообщения перезаписываются на IBM MQ
- 23. .NET IBM MQ Listener не подтвержденное сообщение и чтение с начала очереди
- 24. mq slow persistent message reading
- 25. Websphere MQ Message Бесконечный процесс
- 26. IBM WAS7.x для IBM MQ 8
- 27. IBM Websphere Message Broker и Mule ESB
- 28. Создать прослушиватель в IBM WebSphere MQ v5.3
- 29. IBM MQ DLQ сообщения причина MQRC 3023
- 30. IBM MQ против Apache Kafka
Если вы знаете, как сделать это для JMS, зачем вам сделать его MQ-специфическим? – skaffman
Эй вы можете мне рассказать, как подключиться к IBM MQ с помощью JMS, например, я хочу знать, как указать диспетчер очереди, канал и т. Д. –