假设我有一个连接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
(使所有会话异步 - 对吗?(并且根据文档:
"如果必须在异步会话上进行同步调用,例如创建使用者或生产者,则必须调用 Connection.Stop。可以通过调用 Connection.Start 方法来恢复会话以开始传递消息。
因此,在步骤开始时调用stop
然后在最后调用start
似乎是合理的,因此代码似乎是正确的(至少对我来说(。但是,当我更多地考虑它时,我认为代码有问题,因为它不能确保在t3
完成所有步骤之前没有其他线程调用start
。
所以我的问题是:
- 我是否需要使用互斥锁来确保它?还是XMS会自动处理它(这意味着我的推理是错误的(?
- 如何设计我的应用程序,以便我不必每次想要发送消息和异步侦听回复时都调用
stop
和start
? - 根据上面引用的文本,如果连接处于异步模式,我无法调用
createProducer()
并createConsumer()
。还有哪些方法我不能调用?文档不会以这种方式对方法进行分类:
此外,文档没有明确说明是什么使会话异步。它说:
"会话不是通过向使用者分配消息侦听器来异步的。仅当调用 Connection.Start 方法时,会话才会变为异步。
我在这里看到两个问题:
- 调用
c.start()
会使所有会话异步,而不仅仅是一个会话。 - 如果我调用
c.start()
但没有将任何消息侦听器分配给使用者,会话是否仍然是异步的?
似乎我有很多问题,所以如果有人能为我提供文档部分或部分的链接,这些部分或部分解释了具有如此微小细节的 XMS 对象,那就太好了。
这说,
"根据规范,在连接上调用stop((,close((,在会话上调用setMessageListener((等必须等到所有消息处理完成,也就是说,直到所有已经输入的onMessage((调用退出。因此,如果有人尝试在 onMessage(( 中执行此操作,则在设计上会出现死锁。
但我不确定这些信息是否真实,因为我没有在 IBM 文档中找到此信息。
我更喜欢KIS规则。 为什么不为每个线程使用 1 个连接? 因此,代码不必担心线程之间的冲突。