我们有一个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秒
答案 0 :(得分:1)
我们需要重新启动整个应用才能读取记录。
最常见的原因是听众线程被卡住了#34;在用户代码(//process text message
)中。您可以使用jstack
或jvisualvm
或类似内容进行线程转储,以查看该主题正在执行的操作。
另一种可能性(像这样的低容量应用程序)是网络(很可能是网络中某个位置的路由器)静默关闭空闲套接字,因为它已经使用了一段时间。如果容器(实际上是代理的JMS客户端库)不知道套接字已经死了,它将永远不会再收到任何消息。
第一个解决方案是修复代码;第二种方法的解决方案是在连接上启用某种心跳或保持活动,这样当网络/路由器没有真正的"时,它就不会关闭套接字。在它上面的交通。
您需要查阅经纪人有关配置心跳/保持活动的文档。