Java Websphere MQ消息无限进程
我不熟悉消息队列。我正在尝试使用下面的代码从MQ队列获取消息 我正在创建一个连接,并使用该连接从队列中获取每条消息。这样做是否正确,我是否需要提交连接 无限for循环是始终从队列接收消息的正确方法,对吗? 请给我忠告Java Websphere MQ消息无限进程,java,jms,ibm-mq,Java,Jms,Ibm Mq,我不熟悉消息队列。我正在尝试使用下面的代码从MQ队列获取消息 我正在创建一个连接,并使用该连接从队列中获取每条消息。这样做是否正确,我是否需要提交连接 无限for循环是始终从队列接收消息的正确方法,对吗? 请给我忠告 try { createMQConnection(); // getting mq connection createMQSession(); // getting mq session createMQDestination(); // getting m
try {
createMQConnection(); // getting mq connection
createMQSession(); // getting mq session
createMQDestination(); // getting mq destination
for ( ; ; ) { // infinite loop to receive message from Queue
consumer = session.createConsumer(mqQueue);
jmsTextMessage = (JMSTextMessage) consumer.receive(100);
// Calling application method to process the requested message from queue
}
} catch (Exception e) {
throw e;
} finally {
// closing consumer
// closing session
// closing connection
}
我会选择多线程应用程序,其中每个线程执行以下操作: 1) 连接到队列管理器 2) 为队列创建使用者 3) 设置消息侦听器以异步接收消息。如果不适合,则使用receive()方法进行同步消息接收 4) 消息消耗完成后,请进行清理 这样做的好处是:从各自队列接收消息的线程不会因任何原因被阻塞 这样做对吗 定义“正确”。根据业务需求,这可能是正确的,也可能是可怕的。例如,如果等待时间为100ms,消息深度为零,代码将超时,抛出2033错误(MQRC_NO_MSG_可用),关闭会话,然后退出。这就是你想要的吗 通常,有一个
try
/catch
块包含GET
,它处理瞬时错误,如RC=2033
,前提是即使队列为空,程序仍保持运行。不过,在这种情况下,通常会将超时设置为10秒左右。在100毫秒超时的情况下,如果修改应用程序使其保持运行,那么编写的应用程序绝对会影响侦听器
此外,异常处理不会显示任何用于打印链接异常的代码。JMS异常是多级数据构造,其中传输提供程序的本机错误代码位于异常的链接部分。如果错误处理没有查看链接的异常,它甚至无法区分MQRC=2033
(无消息)与MQRC=2035
(授权错误)之间的区别。其中一个是暂时的,应该通过程序存活下来,另一个总是致命的。至少,代码应该打印链接的异常,或者打印一条消息,说明没有找到链接的异常
因此,对于循环和处理设计,在不知道需求的情况下,不可能回答“正确”的值。关于异常处理,绝对不正确,因为不存在链接异常处理
…以及我是否需要提交连接
视情况而定。丢失或复制邮件可以吗?如果是这样,则不需要事务处理。使用事务处理会话可以防止消息丢失,但不能防止重复。使用XA 2阶段提交可以防止消息丢失和重复。其思想是选择满足业务需求和相应代码的服务类别(通常称为“最多一次”、“至少一次”或“一次且仅一次”)
无限for循环是始终从队列接收消息的正确方法,对吗
这是一种方法。对于高可用性和高吞吐量,通常有两个或多个应用程序实例在同一队列上侦听。这样,如果一个应用程序服务器实例发生故障(无论是计划内还是计划外),另一个实例将继续为队列提供服务。通常,所有这些实例都会在队列上侦听大约10秒的超时
通常情况下,队列上的GET
指定MQGMO\u FAIL\u IF\u QUIESCING
,这允许QMgr在MQ管理员尝试关闭QMgr时中断应用程序。如果未指定此选项,则关闭QMgr的唯一方法是要求它强制断开未完成的连接,这只能作为最后手段
当消息到达队列时,还可能导致MQ触发应用程序启动。当应用程序在JEE服务器上运行时,通常不会执行此操作,但对于单机应用程序非常有用。如果使用receive()而不使用参数,则应无限等待。我也不认为你每次都需要创造消费者。检查IBMThanks和noted中的示例。因为我正在为每个循环一个接一个地阅读多个队列。谢谢并注意到Shashi。。对不起,我不熟悉多线程应用程序。即使我需要编写infinte循环以正确获取消息,以及是否需要提交连接。请告知meDid您的意思是提交事务?关于无限循环问题-您可以有一个循环运行,直到在队列中找不到消息为止。如果队列中没有消息,receive()方法将返回空消息。您可以检查该条件并退出循环。记住receive(),即没有任何等待时间的receive将无限期地等待消息。直到消息到达队列中,呼叫才会返回。我是说session.commit()。。何时需要执行session.commit?我知道多线程在多队列实现时更有用。单线程足以从一个队列中逐个读取消息,对吗?如果您使用的是事务会话,则需要提交,即您指定true作为createSession调用的第一个参数。请参阅此链接:谢谢您的回复。