【发布时间】:2022-01-22 23:56:44
【问题描述】:
我将 IBM MQ 与 Spring Boot 结合使用,并尝试使用 setDeliveryDelay(time) 方法延迟消息。 此功能仅在 JMS 2.0 中受支持,我遇到了这个问题,因为我正在使用 JMS 1.1 运行,我不知道如何升级到 2.0
我正在使用这个依赖项
implementation(group: 'com.ibm.mq', name: 'mq-jms-spring-boot-starter', version: '2.6.2')
并创建这个 bean:
@Bean("mqTemplate")
public JmsTemplate jmsClient(ConnectionFactory connectionFactory) throws JMSException {
System.out.println(connectionFactory.createConnection().getMetaData().toString());
JmsTemplate temp = new JmsTemplate(connectionFactory);
return temp;
}
然后我简单的设置延迟并发送消息:
jmsTemplate.setDeliveryDelay(101010);
jmsTemplate.convertAndSend(queue, message);
在启动时我可以看到:
| com.ibm.msg.client.jms.internal.JmsConnectionMetaDataImpl@71f29d91 :-
| | XMSC_JMS_MAJOR_VERSION :- 1
| | XMSC_JMS_MINOR_VERSION :- 1
| | XMSC_JMS_VERSION :- 1.1
| | XMSC_MAJOR_VERSION :- 6
| | XMSC_MINOR_VERSION :- 0
| | XMSC_OBJECT_IDENTITY :- 1911725457
| | XMSC_PROVIDER_NAME :- IBM MQ
| | XMSC_VERSION :- 6.0
| | XMSC_WMQ_COMMAND_LEVEL :- 910
| | XMSC_WMQ_PROVIDER_VERSION :- 6.0.0.0
如您所见,XMSC_JMS_VERSION 是 1.1,当我尝试发送到队列时出现以下错误:
JMSCC5008: Use of the JMS2.0 Function 'Delayed Delivery' is not supported with this instance of this connection
这是有道理的,因为我没有使用 JMS 2.0,但是我可以将 JMS 版本从 1.1 更改为 2.0 吗?
【问题讨论】:
-
您的类路径中有哪些 JMS API jar?例如,我将
javax.jms-api-2.0.1.jar与com.ibm.mq.allclient-9.2.0.4.jar一起使用。 -
我有
javax.jms-api-2.0.1.jar和com.ibm.mq.allclient-9.2.4.0.jar。这会是个问题吗? -
你也在使用连接池吗?我记得在某处看到一个帖子说 pooled-jms 选项与 JMS2 不兼容。虽然 spring 的 CachingConnectionFactory 没问题。
-
没有明确的“创建 JMS2 连接”选项。它是根据您调用的方法完成的。 createConnection 是一个 JMS1 方法; createContext 是 JMS2 的等价物。如果我让 Spring 为我创建,一切似乎都可以正常工作
-
@John 确保您连接到的
SVRCONN的SHARECNV值为 1 或更高,如果设置为 0,它会将您连接到的队列管理器视为 v6 队列管理器'不支持延迟交付。
标签: spring-boot jms ibm-mq spring-jms