我正在尝试在weblogic 10r3服务器上调试Web应用程序hostde。该应用程序通过Java Message Driven Beans从外部IBM JMS Queue(类名:com.ibm.mq.jms.MQQueue
)接收输入。
我写了一个小的测试应用程序来连接到该队列并发送测试消息。问题是现在测试消息生成异常,并以某种方式将其放回队列并一次又一次地循环。这会产生许多异常,导致日志不可读。
首先,我尝试通过在我的测试应用程序上构建使用者来删除有害消息,但代码在consumer.receive()
上无限期地阻塞。
然后我尝试将JMSexpiration
设置为某个数字而不是默认值0,但最后消息仍然使用0作为到期。
欢迎所有想法,非常感谢
代码概述了JMS生产者:
static String rawTradeUpload = "some long chunk of data"
Hashtable ht = new Hashtable();
ht.put(Context.INITIAL_CONTEXT_FACTORY,
weblogic.jndi.WLInitialContextFactory.class.getName());
//ht.put(Context.PROVIDER_URL, "t3://gprimeap1d.eur.nsroot.net:12016");
ht.put(Context.PROVIDER_URL, "t3://gprimeap1d.eur.nsroot.net:12001");
ht.put(Context.SECURITY_PRINCIPAL, "weblogic");
ht.put(Context.SECURITY_CREDENTIALS, "welcome5");
Connection con = null;
Session s = null;
try {
if(ctx == null)
ctx = new InitialContext(ht);
ConnectionFactory myConnFactory = null;
Queue myQueue = null;
myConnFactory = (ConnectionFactory) ctx
.lookup("SwiftConnectionFactory");
con = myConnFactory.createConnection();
s = con.createSession(false, Session.AUTO_ACKNOWLEDGE);
myQueue = (Queue) ctx
.lookup("IncomingSwiftFxQueue");
MessageProducer producer = s.createProducer(myQueue);
Message msg = s.createTextMessage(rawTradeUpload);
producer.send(msg);
s.close();
con.close();
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
答案 0 :(得分:0)
您是否尝试过设置重新传递限制并定义错误队列目标,以便在x尝试之后,容器会将消息移动到错误队列?这允许您保持主队列不受有害消息和专用错误队列的影响,以浏览/调试问题。
答案 1 :(得分:0)
在IBM WebSphere MQ队列管理器上配置回退队列和重新传递设置非常简单。设置BOThreshold和BO队列名称以及本地队列。毕竟,也许你可能会说服他们进行这种设置 - 你们都可以从这个解决方案中受益,尽可能地工作,对吗?
否则,为什么不尝试捕获所有异常,如果它们发生,则将失败的消息重新排队到WebLogic上的错误队列。似乎是一个不错的选择。
如果您需要接收,请拨打超时电话。
Message msg = consumer.receive(1000L); // wait for a message for 1 sec, then continue.