2

假设我有一个连接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最后调用似乎是合理的,因此代码似乎是正确的(至少对我而言)。但是,当我仔细考虑时,我认为代码有问题,因为它不能确保在完成所有步骤start之前没有其他线程调用。t3

所以我的问题是:

  • 我需要使用互斥锁来确保它吗?还是 XMS 自动处理它(这意味着我的推理是错误的)?
  • 如何设计我的应用程序,这样我就不必每次都想发送消息并异步收听回复stop时调用?start
  • 根据上面引用的文本,如果连接处于异步模式,我无法createProducer()调用createConsumer()。还有哪些我不能调用的方法?该文档没有以这种方式对方法进行分类:

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

“通过将消息侦听器分配给消费者,不会使会话异步。仅当调用 Connection.Start 方法时,会话才会变为异步。”

我在这里看到两个问题:

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

看来我有很多问题,所以如果有人可以向我提供文档的部分或部分的链接,这些部分或部分解释了 XMS 对象的详细信息,那就太好了。

说,

“根据规范,在 Connection 上调用 stop()、close()、在 Session 上调用 setMessageListener() 等必须等到所有消息处理完成,即直到所有已输入的 onMessage() 调用退出。所以如果有人试图在 onMessage() 中执行该操作,那么设计上就会出现死锁。”

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

4

1 回答 1

2

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

于 2016-02-10T18:44:11.060 回答