Jms 如何在多线程应用程序中为每个连接使用多个会话?

Jms 如何在多线程应用程序中为每个连接使用多个会话?,jms,ibm-mq,xms,jms-session,Jms,Ibm Mq,Xms,Jms Session,假设我有一个连接c和许多会话对象s1,s2sn,每个线程在不同的线程中工作t1,t2tn c | ------------------------------------------------- | | |

假设我有一个连接
c
和许多会话对象
s1
s2
sn
,每个线程在不同的线程中工作
t1
t2
<代码>tn

                                      c
                                      |
                -------------------------------------------------
                |          |          |                         |
             (t1,s1)    (t2,s2)    (t3,s3)      ......       (tn,sn)
现在,假设一个线程
t3
想要向特定队列
q3
发送消息,然后异步侦听回复。因此,它做了以下工作:

 1:   c.stop();

 2:   auto producer = s3.createProducer(s3.createQueue(q3));
 3:   auto text = s3.createTextMessage(message);
 4:   auto replyQueue = s3.createTemporaryQueue();
 5:   text.setJMSReplyTo(replyQueue);
 6:   producer.send(text);

 7:   auto consumer = s3.createConsumer(replyQueue);
 8:   consumer.setMessageListener(myListener);

 9:   c.start();
我之所以在开始时调用
c.stop()
,然后在结束时调用
c.start()
,是因为我不确定是否有任何其他线程在连接上调用了
start
(使所有会话都是异步的-是这样吗?)

如果必须在异步会话上进行同步调用,如创建使用者或生产者,则必须调用连接.Stop。可以通过调用连接.Start方法来恢复会话,以开始传递消息

因此,在步骤开始时调用
stop
,然后在最后调用
start
似乎是合理的,因此代码似乎是正确的(至少对我来说)。然而,当我进一步考虑它时,我认为代码有缺陷,因为它不能确保在
t3
完成所有步骤之前没有其他线程调用
start

因此,我的问题是:

  • 我需要使用互斥来确保它吗?或者XMS会自动处理它(这意味着我的推理是错误的)
  • 如何设计我的应用程序,使我不必每次都调用
    stop
    start
    来异步发送消息和收听回复
  • 根据上面引用的文本,如果连接处于异步模式,我无法调用
    createProducer()
    createConsumer()
    。还有哪些方法我不能调用?文档中没有以这种方式对方法进行分类:
此外,文档没有明确说明会话异步的原因。它说:

“通过将消息侦听器分配给使用者,会话不会变为异步。只有在调用Connection.Start方法时,会话才会变为异步。”

我在这里看到两个问题:

  • 调用
    c.start()
  • 如果我调用
    c.start()
    ,但没有将任何消息侦听器分配给使用者,会话是否仍然异步
我似乎有很多问题,所以如果有人能给我提供到文档中的部分或章节的链接就太好了,这些部分或章节用如此细微的细节解释了XMS对象

说,

“根据规范,在连接上调用stop()、close()、在会话上调用setMessageListener()等必须等到所有消息处理完成,也就是说,直到所有已输入的onMessage()调用退出。因此,如果有人试图在onMessage()内执行该操作,设计上会出现死锁。”


但我不确定这些信息是否真实,因为我没有在IBM文档中找到这些信息

我更喜欢KIS规则。为什么每个线程不使用一个连接?因此,代码不必担心线程之间的冲突。

为什么我不为每个线程使用一个连接呢?可能存在这样的情况:假设主服务器需要与多个工作服务器通信,那么如果我为每个线程使用一个连接,我可能最终使用N个连接(N可能足够大,以至于不可行或不切实际,对于大的某些定义,20、30或甚至更多)。此外,如果一个线程不经常使用连接,那么在多个线程之间共享此连接似乎是一种更好的策略,以最大限度地利用资源。您不太了解MQ。我有超过10000个客户端连接的队列管理器,队列管理器的性能没有问题。您的“大”什么都不是l年前,我编写了一个名为AQOL的助手应用程序,默认为8个线程(每个线程1个连接)。我已经用100个线程测试了它,没有问题。我在这里写到:注意:我已经为MQ创建了20多年的应用程序。所以,正如我所说,每个线程1个连接是一个更好的解决方案,但是,嘿,如果你想构建一个过于复杂的系统,我不能阻止你。哇……这似乎非常可信。现在我有另一个小问题:如果我能期望一个连接保持开放(和有效)数周/数月吗?或者我需要在发送每条消息之前检查它的状态(如果是,如何做到)?另外,创建会话/生产者/消费者/目的地是否昂贵?如果我创建会话/生产者/消费者/目的地过于频繁(如按消息创建),或者尽可能重用它们,这是否好?没有调用来检查连接是否仍然有效/活动。只需使用MQ中的重新连接逻辑。MQ中最昂贵的调用是MQCONN/X(即createQueueConnection(),用于JMS)。绝对不要对每条消息进行1次连接,而是重用连接/会话。