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