繁体   English   中英

使用spring在Ibm Websphere MQ中实现重试逻辑

[英]Implementing retry logic in Ibm Websphere MQ with spring

我正在使用Spring和Webphere MQ处理以下配置以进行消息传递。

我需要为场景实现重试逻辑,我从队列接收消息并将消息数据放到Elastic搜索服务器上(搜索服务器是非事务性的),如果搜索服务器关闭,我必须回滚再次向队列发送消息,并在一段时间间隔后处理该消息(例如:30秒)。 这个重试必须完成5次。 5次之后,消息必须放在死信队列中。我们使用Tomcat作为服务器。

我们使用spring integration jms:message-driven-channel-adapter进行消息接收

如何使用spring和Websphere MQ实现此行为?

我已遍历了许多站点,我可以找到对Active MQ的支持,但不支持IBM MQ。

<bean id="mqConnectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory">
        <property name="hostName">
            <value>${queue_hostname}</value>
        </property>
        <property name="port">
            <value>${queue_port}</value>
        </property>
        <property name="queueManager">
            <value>${queue_manager}</value>
        </property>
        <property name="transportType">
            <value>1</value>
        </property>
    </bean>

    <!-- JMS Queue Connection Factory -->
    <bean id="jmsQueueConnectionFactory"
        class="org.springframework.jms.connection.SingleConnectionFactory102">
        <property name="targetConnectionFactory">
            <ref bean="mqConnectionFactory" />
        </property>
        <property name="pubSubDomain">
            <value>false</value>
        </property>
    </bean>

    <!-- JMS Destination Resolver -->
    <bean id="jmsDestinationResolver"
        class="org.springframework.jms.support.destination.DynamicDestinationResolver">
    </bean>

    <!-- JMS Queue Template -->
    <bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate102">
        <property name="connectionFactory">
            <ref bean="jmsQueueConnectionFactory" />
        </property>
        <property name="destinationResolver">
            <ref bean="jmsDestinationResolver" />
        </property>
        <property name="pubSubDomain">
            <value>false</value>
        </property>
        <property name="receiveTimeout">
            <value>20000</value>
        </property>
    </bean>

JMS规范中没有关于延迟重新传递的内容。 一些经纪人有自定义机制/政策来实施它; 你必须看看经纪人文件。

如前所述,您可以使用传递计数标题在经过一些重试后放弃。

编辑

回应下面的评论......

仅当您使用的是支持JMS 2.0的MQ版本时 - 看起来您使用的是需要JmsTemplate102旧版本。 1.0.2是古老的; 1.1已经出了多年; Spring已经支持JMS 2.0近3年了。 如果您有JMS 2.0代理(和客户端库),请在JmsTemplate bean上设置deliveryDelay 然后,配置出站通道适配器以通过jms-template属性使用该模板。

为了获得重新传递计数的可见性,要么将整个消息传递到您的服务中,要么使用POJO方法将其配置为获取该标头...

public MyReply process(@Payload MyObject foo,
              @Header("JMSXRedeliveryCount") int redeliveryCOunt) {
    ...
}

同样,这是一个JMS 2.0功能(标题),尽管一些代理在1.1中提供它。

IBM MQ没有延迟重新传递,但一种选择是考虑使用延迟传递的JMS2.0概念。 这不会设置redelivered标志,因此不会使用任何退出逻辑,但它会实现定时行为。

例如,当无法处理消息时,应用程序可能会延迟重新排队。 5分钟后再也不会再看到这一点。 应用程序可能必须使用计数器标记消息。 两者都可以在交易会话下完成

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM