有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么JMS确认模式不能在ibm mq中广泛使用?

我想在通过JMS从ibm队列传递消息时使用确认模式

因此,我用以下方式配置上下文:

 private JMSContext createJmsContext() throws JMSException {
        JmsConnectionFactory cf;
        JmsFactoryFactory ff = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
        cf = ff.createConnectionFactory();
        cf.setStringProperty(WMQConstants.WMQ_HOST_NAME, props.getProperty(Q_HOST));
        cf.setIntProperty(WMQConstants.WMQ_PORT, Integer.valueOf(props.getProperty(Q_PORT)));
        cf.setStringProperty(WMQConstants.WMQ_CHANNEL, props.getProperty(Q_CHANNEL));
        cf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
        cf.setStringProperty(WMQConstants.WMQ_QUEUE_MANAGER, props.getProperty(Q_MANAGER));
        cf.setStringProperty(WMQConstants.WMQ_APPLICATIONNAME, "JmsPutGet (JMS)");
        cf.setBooleanProperty(WMQConstants.USER_AUTHENTICATION_MQCSP, true);
        cf.setIntProperty(WMQConstants.ACKNOWLEDGE_MODE, WMQConstants.CLIENT_ACKNOWLEDGE);
        return cf.createContext();
    }

以下是特殊参数:

cf.setIntProperty(WMQConstants.ACKNOWLEDGE_MODE, WMQConstants.CLIENT_ACKNOWLEDGE);

在代码逻辑中,我使用消息侦听器来处理消息:

consumer.setMessageListener(message -> {

            try {
                // business logic
                message.acknowledge();
            } catch (Throwable e) {

                try {
                    // saving unsuccessful message to special database
                } catch (Throwable e) {
                    // if database does not work, we want message to return back to queue and try process it again when database will work
                    sleep(60_000); // to prevent too many process requests, there is only one working thread, so we can pause it
                }

            }

        });

现在,这段代码不起作用:如果数据库失败,消息将丢失。我们无法通过JMS浏览找到它。为什么


共 (0) 个答案