WSO2 2.2.0 Message Broker中的消息重试和死信队列

时间:2015-06-01 14:54:14

标签: wso2 message broker

我们正在评估WSO2堆栈,特别是Message Broker v 2.2.0,并且无法使消息重试限制正常工作。

根据此文档页面,一旦客户端拒绝了10次消息,它将从队列中删除并放置在死信队列中。

https://docs.wso2.com/display/MB220/Maximum+Delivery+Attempts

拒绝的定义是:
a)在使用Session.CLIENT_ACKNOWLEDGE或
的情况下不发送确认 b)在使用交易会话的情况下回滚交易。

使用WSO2示例客户端代码,我们无法使用客户端确认模式或诱导故障的任意组合来观察此行为。消息在队列中保持活动状态,可以多次从该队列中获取。确认它或提交会话会将其从队列中删除。

任何人都可以确认此功能是否真的有效,如果有,请告诉我们客户端必须做些什么来触发它。我们一直在测试使用WSO2提供的示例客户端代码和未经修改的开箱即用服务器配置:

https://docs.wso2.com/display/MB220/Sending+and+Receiving+Messages+Using+Queues

任何帮助都会受到赞赏,因为我们无法继续使用WSO2而不了解系统的这一方面是如何工作的。

1 个答案:

答案 0 :(得分:0)

此功能正常运行。为了测试您需要在示例代码中对提供的接收器客户端进行一些修改。

  1. 添加给定的系统属性
  2. 将abknlowdgment模式更改为CLIENT_ACK
  3. 获取消息10次而不将ACK发送到服务器
  4. 通过这些更改,您可以满足您的要求。

    这里我将在QueueReceiver类中发布修改后的方法

    public void receiveMessages() throws NamingException, JMSException {
        Properties properties = new Properties();
        System.setProperty("AndesAckWaitTimeOut", "30000");
        properties.put(Context.INITIAL_CONTEXT_FACTORY, QPID_ICF);
        properties.put(CF_NAME_PREFIX + CF_NAME, getTCPConnectionURL(userName, password));
        System.out.println("getTCPConnectionURL(userName,password) = " + getTCPConnectionURL(userName, password));
        InitialContext ctx = new InitialContext(properties);
        // Lookup connection factory
        QueueConnectionFactory connFactory = (QueueConnectionFactory) ctx.lookup(CF_NAME);
        QueueConnection queueConnection = connFactory.createQueueConnection();
        queueConnection.start();
        QueueSession queueSession =
                queueConnection.createQueueSession(false, QueueSession.CLIENT_ACKNOWLEDGE);
        //Receive message
        Queue queue =  queueSession.createQueue(queueName);
        MessageConsumer queueReceiver = queueSession.createConsumer(queue);
        int count =0;
        while (count < 12) {
            TextMessage message = (TextMessage) queueReceiver.receive();
            System.out.println("Got message ==>" + message.getText());
            count++;
        }
        queueReceiver.close();
        queueSession.close();
        queueConnection.stop();
        queueConnection.close();
    }
    

    请注意,此修改只是为了证明该功能正在运行。