gpt4 book ai didi

.net - 重用 IBM.WMQ.MQQueue 对象

转载 作者:行者123 更新时间:2023-12-02 03:14:04 30 4
gpt4 key购买 nike

我们正在使用 IBM 的 WebSphere MQ 的 .NET API。

创建 MQQueueManager 对象显然是一项昂贵的操作,因此我们缓存并重用这些对象的池。

目前,对于每个请求,我们访问所需的队列:

//obtain queueManager from pool
IBM.WMQ.MQQueue requestQ= queueManager.AccessQueue(requestQName, mqOptions);
IBM.WMQ.MQQueue responseQ= queueManager.AccessQueue(responseQName, mqOptions);

完成后关闭它们:

requestQ.Close();
responseQ.Close();

这是最佳实践,还是我们还应该池化和重用 MQQueue 对象(除了队列管理器之外)? AccessQueue() 似乎是客户端上的廉价操作。

最佳答案

答案取决于您的线程模型和事务性。一般来说,消息传递客户端应该始终使用事务性,即使这只是单阶段提交。原因是结果存在模糊性,否则可能会导致消息重复或丢失。我对此提供了更详细的解释 in another answer .

问题在于事务是连接范围的。当您提交时,您会对整个连接执行此操作。安全地跨多个线程使用相同的连接将阻止事务的使用,从而使应用程序面临丢失或重复消息的风险。由于队列句柄仅在特定连接的上下文中有效,因此它们继承自线程模型和连接池。

服务提供程序应用程序最常见的模型是在输入队列上维护每个线程的连接,并动态打开/放置/关闭输出队列。例如,在单个工作单元中...

  1. 阅读下一条请求消息
  2. 使用回复信息获取目的地
  3. 打开回复队列
  4. 输入回复
  5. 提交
  6. 销毁回复目标对象,从而关闭回复队列

在这种情况下,连接不会不断重建,输入队列也不会关闭。但是,它确实需要每个线程维护一个专用连接。

关于.net - 重用 IBM.WMQ.MQQueue 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4393753/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com