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