如何在多线程应用程序中为每个连接使用多个会话?
How to use multiple sessions per connection in a multi-threaded application?
假设我有一个连接 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()
,是因为我 不确定 是否有任何其他threads 已在连接上调用 start
(使 all 会话异步 - 是吗?)并根据 the documentation:
"If synchronous calls, such as creation of a consumer or producer, must be made on an asynchronous session, the Connection.Stop must be called. A session can be resumed by calling the Connection.Start method to start delivery of messages."
所以在步骤的开头调用 stop
,然后在最后调用 start
似乎是合理的,因此代码似乎是正确的(至少对我而言)。但是,当我仔细考虑时,我认为代码有问题,因为它不能确保在 t3
完成所有步骤之前没有其他线程调用 start
。
所以我的问题是:
- 我需要使用互斥量来确保吗?或者 XMS 自动处理它(这意味着我的推理是错误的)?
- 如何设计我的应用程序,这样我就不必每次都调用
stop
和 start
来异步发送消息和收听回复?
- 根据上面引用的文本,如果连接处于异步模式,我无法调用
createProducer()
和 createConsumer()
。我不能调用的其他方法是什么?文档没有按这种方式对方法进行分类:
另外,文档没有明确说明什么使会话异步。它说 this:
"A session is not made asynchronous by assigning a message listener to a consumer. A session becomes asynchronous only when the Connection.Start method is called."
我在这里看到两个问题:
- 调用
c.start()
使 所有 个会话异步,而不仅仅是一个。
- 如果我调用
c.start()
但没有将任何消息侦听器分配给消费者,会话是否仍然是异步的?
看来我有很多问题,所以如果有人可以向我提供文档的部分或部分的链接,这些部分或部分会详细说明 XMS 对象,那就太好了。
This 说,
"According to the specification, calling stop(), close() on a Connection, setMessageListener() on a Session etc. must wait till all message processing finishes, that is till all onMessage() calls which have already been entered exit. So if anyone attempts to do that operation inside onMessage() there will be a deadlock by design."
但我不确定该信息是否真实,因为我没有在 IBM 文档中找到该信息。
我更喜欢 KIS 规则。为什么不为每个线程使用 1 个连接?因此,代码不必担心线程之间的冲突。
假设我有一个连接 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()
,是因为我 不确定 是否有任何其他threads 已在连接上调用 start
(使 all 会话异步 - 是吗?)并根据 the documentation:
"If synchronous calls, such as creation of a consumer or producer, must be made on an asynchronous session, the Connection.Stop must be called. A session can be resumed by calling the Connection.Start method to start delivery of messages."
所以在步骤的开头调用 stop
,然后在最后调用 start
似乎是合理的,因此代码似乎是正确的(至少对我而言)。但是,当我仔细考虑时,我认为代码有问题,因为它不能确保在 t3
完成所有步骤之前没有其他线程调用 start
。
所以我的问题是:
- 我需要使用互斥量来确保吗?或者 XMS 自动处理它(这意味着我的推理是错误的)?
- 如何设计我的应用程序,这样我就不必每次都调用
stop
和start
来异步发送消息和收听回复? - 根据上面引用的文本,如果连接处于异步模式,我无法调用
createProducer()
和createConsumer()
。我不能调用的其他方法是什么?文档没有按这种方式对方法进行分类:
另外,文档没有明确说明什么使会话异步。它说 this:
"A session is not made asynchronous by assigning a message listener to a consumer. A session becomes asynchronous only when the Connection.Start method is called."
我在这里看到两个问题:
- 调用
c.start()
使 所有 个会话异步,而不仅仅是一个。 - 如果我调用
c.start()
但没有将任何消息侦听器分配给消费者,会话是否仍然是异步的?
看来我有很多问题,所以如果有人可以向我提供文档的部分或部分的链接,这些部分或部分会详细说明 XMS 对象,那就太好了。
This 说,
"According to the specification, calling stop(), close() on a Connection, setMessageListener() on a Session etc. must wait till all message processing finishes, that is till all onMessage() calls which have already been entered exit. So if anyone attempts to do that operation inside onMessage() there will be a deadlock by design."
但我不确定该信息是否真实,因为我没有在 IBM 文档中找到该信息。
我更喜欢 KIS 规则。为什么不为每个线程使用 1 个连接?因此,代码不必担心线程之间的冲突。