如何在多线程应用程序中为每个连接使用多个会话



假设我有一个连接c和许多会话对象s1s2.。 sn,每个线程在不同的线程中工作t1t2... 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会自动处理它(这意味着我的推理是错误的(?
  • 如何设计我的应用程序,以便我不必每次想要发送消息和异步侦听回复时都调用stopstart
  • 根据上面引用的文本,如果连接处于异步模式,我无法调用createProducer()createConsumer()。还有哪些方法我不能调用?文档不会以这种方式对方法进行分类:

此外,文档没有明确说明是什么使会话异步。它说:

"会话不是通过向使用者分配消息侦听器来异步的。仅当调用 Connection.Start 方法时,会话才会变为异步。

我在这里看到两个问题:

  • 调用c.start()会使所有会话异步,而不仅仅是一个会话。
  • 如果我调用c.start()但没有将任何消息侦听器分配给使用者,会话是否仍然是异步的?

似乎我有很多问题,所以如果有人能为我提供文档部分或部分的链接,这些部分或部分解释了具有如此微小细节的 XMS 对象,那就太好了。

这说,

"根据规范,在连接上调用stop((,close((,在会话上调用setMessageListener((等必须等到所有消息处理完成,也就是说,直到所有已经输入的onMessage((调用退出。因此,如果有人尝试在 onMessage(( 中执行此操作,则在设计上会出现死锁。

但我不确定这些信息是否真实,因为我没有在 IBM 文档中找到此信息。

我更喜欢KIS规则。 为什么不为每个线程使用 1 个连接? 因此,代码不必担心线程之间的冲突。

最新更新