2012-06-27 71 views
0

我试图在weblogic 10r3服务器上调试web应用程序hostde。该应用程序通过Java消息驱动Bean接收来自外部IBM JMS队列(类名:com.ibm.mq.jms.MQQueue)的输入。JMS毒害信息删除

我写了一个小测试应用程序连接到该队列并发送测试消息。现在的问题是测试消息会产生异常,并以某种方式将其放回队列并一次又一次地循环。这产生了很多例外,导致日志不可读。

首先我想通过我的测试应用程序构建消费者删除带毒邮件,但代码块无限期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

嘿凯文,这里是生产者的代码,我也写了一个消费者和队列浏览器。它都是从同一个会话创建的 –

+0

感谢Peter和Zahir,我会向MQ团队咨询关于退出队列设置的信息。 –

回答

0

在IBM WebSphere MQ队列管理器上配置回退队列和重新传送设置非常简单。设置BOThreshold和BO队列名称以及本地队列。也许你可能说服他们做这个设置,毕竟你们都从这个解决方案中受益,可以像possbile一样工作,对吗?

否则,你为什么不尝试捕获所有异常,如果他们发生 - 重新排队失败的消息在WebLogic上的错误队列。似乎是一个不错的选择。

如果您需要接收,请使用超时调用。

Message msg = consumer.receive(1000L); // wait for a message for 1 sec, then continue. 
0

您是否尝试过设置再分发限制和界定错误队列目的地,这样以后X的尝试中,容器负责将消息移动到错误队列?这使您可以保持主队列不含有毒消息和专用的错误队列来浏览/调试问题。

+0

嘿查希尔,thx为您的答案,这将是一个很好的设置,可悲的是我不是维护队列的人,这是一个外国队列链接到外国系统。 –