Spring JMS Websphere MQ打开输入计数问题

时间:2016-08-11 19:05:21

标签: spring jms ibm-mq

我将Spring 3.2.8与JDK 6和Websphere MQ 7.5.0.5一起使用。在我的应用程序中,我通过ThreadPool使用jmsTemplate进行一些jms调用。首先,我面临的条件是"当前队列深度"当我点击jms电话时,计数会增加。我通过ThreadPool跟踪我正在启动的所有对象,并中断或取消所有线程/未来对象。所以这个"当前队列深度"数控制。

现在问题是"打开输入计数"值几乎增加到我发送的请求数。当我停止服务器时,此计数变为0。

在所有这些情况下,我能够发送请求并获得响应,直到80和我的ThreadPool大小为30.在达到80的请求计数后,我一直收到未来对象拒绝的错误,并且无法接收响应。实际上,对于剩余的呼叫,会收到空响应。

请建议。

2 个答案:

答案 0 :(得分:2)

我在我的应用程序中使用队列,并且已经应用​​了关联ID的过滤器。我在上面阅读了更多内容,并在我们拨打jmsTemplate.receiveSelected (queue, filter)时发现,这对性能产生了严重影响。删除此过滤器后,线程连接问题已解决。但是现在过滤对我来说仍然是一个问题。

现在我将以不同的方式应用过滤器,但有一些应用程序的限制但不使用receiveSelected而是使用jmsTemplate.receive

9月14日更新

全部 - 我发现这是一个解决方案,并希望在此发布。

我的一位同事帮助纠正了这个问题,这是非常有帮助的。我们在调试后观察到如果cacheConsumer为true则基于

的组合
  

queue + message-selector + session

消费者被Spring缓存。甚至调用close()方法也没有做任何事情;基本上是空方法并导致线程被挂起/卡住。

在将cacheConsumer设置为false后,我将我的代码恢复为原始的jmsTemplate.receiveSelected (destination, messageSelector),现在当我点击100次请求时,线程数在多次迭代测试期间仅增加到5到10之间。

所以 - 需要仔细使用这个属性。

希望这会有所帮助!!

答案 1 :(得分:0)

  

首先,我面临“当前队列深度”计数增加的条件   我打了jms电话。我通过ThreadPool跟踪了我发起的所有对象   并中断或取消所有线程/未来对象。

我不知道你在说什么,但你不应该使用/监控应用程序中的“当前队列深度”值。糟糕,糟糕的设计。只有MQ监控工具才能使用它。

  

现在问题是“开放输入计数”值几乎增加到了数字   我发送的请求。当我停止服务器时,此计数变为0。

编程错误。你正在“一次又一次地打开一个队列,然后发一条消息”。你把一些代码放到CLOSE队列或者更好的方法,重新开放队列!!!!!!!