【问题标题】:JMS poison message removalJMS 有害消息删除
【发布时间】:2012-06-29 03:10:17
【问题描述】:

我正在尝试在 weblogic 10r3 服务器上调试 web 应用程序 hostde。该应用正在通过 Java 消息驱动 Bean 接收来自外部 IBM JMS 队列(类名: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();
        }

【问题讨论】:

  • 您能否发布一些创建消息并将消息写入队列的代码部分?
  • 嘿凯文,这是生产者的代码,我也写了一个消费者和队列浏览器。它都是从同一个会话创建的
  • 感谢 Peter 和 Zahir,我将向 MQ 团队咨询有关回退队列设置的问题。

标签: java jms weblogic message-queue ibm-mq


【解决方案1】:

在 IBM WebSphere MQ 队列管理器上配置回退队列和重新传递设置非常简单。设置 BOThreshold 和 BO 队列名称以及本地队列。毕竟,也许您可​​以说服他们进行此设置 - 您都可以从该解决方案中受益,并尽可能地发挥作用,对吧?

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

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

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

【讨论】:

    【解决方案2】:

    您是否尝试过设置重新传递限制并定义错误队列目标,以便在尝试 x 次后,容器负责将消息移动到错误队列?这使您可以保持主队列没有有害消息,并使用专用的错误队列来浏览/调试问题。

    【讨论】:

    • 嘿 Zahir,谢谢你的回答,这将是一个不错的设置,遗憾的是我不是维护队列的人,它是一个外部系统的外部队列链接。
    猜你喜欢
    • 1970-01-01
    • 2013-09-30
    • 2012-03-20
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-05
    相关资源
    最近更新 更多