Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Websphere MQ消息无限进程_Java_Jms_Ibm Mq - Fatal编程技术网

Java Websphere MQ消息无限进程

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

我不熟悉消息队列。我正在尝试使用下面的代码从MQ队列获取消息

我正在创建一个连接,并使用该连接从队列中获取每条消息。这样做是否正确,我是否需要提交连接

无限for循环是始终从队列接收消息的正确方法,对吗? 请给我忠告

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调用的第一个参数。请参阅此链接:谢谢您的回复。