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) 个答案