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