JMS - 无法从队列中检索消息。间歇地发生

时间:2015-12-23 01:08:47

标签: oracle11g jms spring-jms jmstemplate

我们有一个Java类,它监听数据库(Oracle)队列表,并在该队列中放置记录时对其进行处理。它在UAT和开发环境中正常工作。在生产中部署时,有时无法从队列中读取记录。插入记录时,它无法检测到记录,并且记录仍保留在队列中。这很少发生,但它发生了。如果我给出统计数据,在一天排队的30个记录中,大约有8个没有记录。我们需要重新启动整个应用程序才能读取记录。

这是我班级的代码片段。

public class SomeListener implements MessageListener{

public void onMessage(Message msg){
     InputStream input = null;
    try {
        TextMessage txtMsg = (TextMessage) msg;
        String text = txtMsg.getText(); 
        input = new ByteArrayInputStream(text.getBytes());
    } catch (Exception e1) {
        // TODO Auto-generated catch block
        logger.error("Parsing from the queue.... failed",e1);
        e1.printStackTrace();
    }

    //process text message
}

}

奇怪的是我们无法从日志中找到任何异常痕迹。

有人可以帮忙吗?我们将receiveTimeout设置为10秒

1 个答案:

答案 0 :(得分:1)

  

我们需要重新启动整个应用才能读取记录。

最常见的原因是听众线程被卡住了#34;在用户代码(//process text message)中。您可以使用jstackjvisualvm或类似内容进行线程转储,以查看该主题正在执行的操作。

另一种可能性(像这样的低容量应用程序)是网络(很可能是网络中某个位置的路由器)静默关闭空闲套接字,因为它已经使用了一段时间。如果容器(实际上是代理的JMS客户端库)不知道套接字已经死了,它将永远不会再收到任何消息。

第一个解决方案是修复代码;第二种方法的解决方案是在连接上启用某种心跳或保持活动,这样当网络/路由器没有真正的"时,它就不会关闭套接字。在它上面的交通。

您需要查阅经纪人有关配置心跳/保持活动的文档。