【问题标题】:Use JMS 2.0 to use delivery delay with IBM MQ使用 JMS 2.0 通过 IBM MQ 使用交付延迟
【发布时间】: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_VERSION1.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.jarcom.ibm.mq.allclient-9.2.0.4.jar 一起使用。
  • 我有javax.jms-api-2.0.1.jarcom.ibm.mq.allclient-9.2.4.0.jar。这会是个问题吗?
  • 你也在使用连接池吗?我记得在某处看到一个帖子说 pooled-jms 选项与 JMS2 不兼容。虽然 spring 的 CachingConnectionFactory 没问题。
  • 没有明确的“创建 JMS2 连接”选项。它是根据您调用的方法完成的。 createConnection 是一个 JMS1 方法; createContext 是 JMS2 的等价物。如果我让 Spring 为我创建,一切似乎都可以正常工作
  • @John 确保您连接到的 SVRCONNSHARECNV 值为 1 或更高,如果设置为 0,它会将您连接到的队列管理器视为 v6 队列管理器'不支持延迟交付。

标签: spring-boot jms ibm-mq spring-jms


【解决方案1】:

确保您连接到的SVRCONN 具有1 或更高的SHARECNV 值,如果它设置为0,客户端会将连接到的队列管理器视为 v6 队列管理器,它没有不支持 JMS 2.0 功能,包括延迟交付、共享订阅。它也不支持 IBM MQ 自动重新连接逻辑和双向心跳消息。

【讨论】:

    【解决方案2】:

    只是继续对话,但我想做一些格式化...

    我将我的 maven 依赖项更改为:

        <dependency>
            <groupId>com.ibm.mq</groupId>
            <artifactId>com.ibm.mq.allclient</artifactId>
            <version>9.1.0.6</version>
        </dependency>
    

    到:

        <dependency>
            <groupId>com.ibm.mq</groupId>
            <artifactId>mq-jms-spring-boot-starter</artifactId>
            <version>2.6.2</version>
        </dependency>
    

    这仍然导致:

    com.ibm.msg.client.jms.internal.JmsConnectionMetaDataImpl@70988f36  :-
    XMSC_IS_Z_SERIES           :-  false
    XMSC_JMS_MAJOR_VERSION     :-  2
    XMSC_JMS_MINOR_VERSION     :-  0
    XMSC_JMS_VERSION           :-  2.0
    XMSC_MAJOR_VERSION         :-  8
    XMSC_MINOR_VERSION         :-  0
    XMSC_OBJECT_IDENTITY       :-  1889046326
    XMSC_PROVIDER_NAME         :-  IBM MQ JMS Provider
    XMSC_VERSION               :-  8.0.0.0
    XMSC_WMQ_COMMAND_LEVEL     :-  910
    XMSC_WMQ_PROVIDER_VERSION  :-  8.0.0.0
    

    带有短信属性:

    JMSMessage class: jms_text
    JMSType:          null
    JMSDeliveryMode:  1
    JMSDeliveryDelay: 0
    JMSDeliveryTime:  0
    JMSExpiration:    0
    

    我不知道如何将XMSC_VERSION 设置为 6.0。我没有看到客户端代码或mqclient.ini 之类的选项。

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2019-12-31
      • 2023-03-05
      • 2011-07-01
      • 1970-01-01
      • 2015-10-27
      • 2011-08-16
      • 2019-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多