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

2023-12-20

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

我需要实现一个场景的重试逻辑,其中我从队列接收消息并将消息数据放到弹性搜索服务器(搜索服务器是非事务性的),如果搜索服务器关闭,我必须回滚消息再次放入队列并在一段时间间隔(例如: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 规范中没有任何关于延迟重新传递的内容。一些经纪商有自定义机制/策略来实施它;您必须查看经纪人文档。

正如之前所说,您可以使用传递计数标头在重试一定次数后放弃。

EDIT

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

仅当您使用支持 JMS 2.0 的 MQ 版本时 - 看起来您使用的是非常旧的版本,需要JmsTemplate102。 1.0.2 是古老的; 1.1 已经推出多年了; Spring支持JMS 2.0已经近3年了。如果您有 JMS 2.0 代理(和客户端库),请设置JmsTemplate bean 上的传递延迟 http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jms/core/JmsTemplate.html#setDeliveryDelay-long-。然后,通过以下方式配置出站通道适配器以使用该模板jms-template财产。

为了了解重新传递计数,请将整个消息传递到您的服务中,或者使用 POJO 方法将其配置为获取该标头...

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 spring 在 Ibm Websphere MQ 中实现重试逻辑 的相关文章

随机推荐

  • DotNetOpenAuth:Web 表单、入门

    我想弄清楚如何获得 DotNetOpenAuth http www dotnetopenauth net http www dotnetopenauth net 在我的网络表单应用程序中工作 我不明白从哪里开始 我的 Login aspx
  • 根据 ng-click 索引更改图像 src AngularJS

    我有这个 angularJS 代码 指令模板定义 li img src img ImgTest li 另外 我的指令代码有 link function scope elem attrs scope ImgTest Img 1 单击 ng 后
  • Python如何扩展“str”并重载其构造函数? [复制]

    这个问题在这里已经有答案了 我有一个字符序列 如果你愿意的话 可以是一个字符串 但我想存储有关字符串来源的元数据 另外我想提供一个简化的构造函数 我尝试过延长str谷歌会为我解决尽可能多的课程 到了这个地步 我就放弃了 class WcSt
  • 如何在 Kotlin 中创建线程池

    我想在 Kotlin 中创建一个线程池 我在互联网上搜索了几个小时 但找不到一个例子 谁能提供例子 谢谢 val executor Executors newFixedThreadPool 5 for i in 0 9 val worker
  • 如何将 lombok 和 JPAMetalModel 处理器与 Maven 共存

    如何使用Lombok https projectlombok org 当 JPAMetaModelEntityProcessor 注释处理器在 Maven 构建中激活时 Maven 配置
  • nasm - 无法在 macOS Mojave 上将目标文件与 ld 链接

    我正在尝试组装一个简单的 Hello World 它在以前的 macOS 版本中运行良好 global start section text start mov rax 0x02000004 mov rdi 1 mov rsi msg mo
  • 如何在 Bootstrap Vue 的卡组组中制作滑块?

    我使用本教程制作卡片组 https bootstrap vue js org docs components card card deck groups https bootstrap vue js org docs components
  • 基于子图像高度的 DIV 高度在底部添加了一些额外的像素

    为什么图像的父 div 底部有一些额外的像素 如何在不硬编码父 div 高度的情况下删除像素 http jsfiddle net 6x8Dm http jsfiddle net 6x8Dm HTML div class wrapper di
  • 调度多个 .NET Core 控制台应用程序

    我能够安排测试 NET Core 控制台应用程序 将程序 脚本设置为 dotnet 将参数设置为 mytestnetcoreconsoleapp dll 并将启动目录设置为包含 dll 的目录 不过 对于多个控制台应用程序来说 这样做是否正
  • 我们可以在没有 JavaScript 的情况下制作“打印”按钮吗?

    我们可以在没有 JavaScript 的情况下制作 打印 按钮吗 打开浏览器打印窗口 HTML 没有针对锚标记或输入按钮 或其他任何内容 的内置 打印 操作 因此 JavaScript 是您的方式 您还可以为用户提供有关如何使用 文件 gt
  • 从 git 存储库获取版本号

    我们有一个构建系统 它使用 svn ID 作为需要五位数字的 VM 构建器设备的输入 当我从 git 构建时 我一直通过计算 git 存储库中的提交数量来伪造这一点 这只是一种工作 我正在努力弄清楚 如何从 git 存储库中获取唯一的 5
  • 验证 Windows Phone 应用内购买收据

    我正在开发 Windows Phone 8 应用程序 我的应用程序将包含应用内购买 我试图理解收据的概念 据我了解 当有人在我的应用程序内购买产品后 会生成收据
  • 使用 C# 从网站下载文件

    我正在尝试使用以下代码从网站下载文件 WebClient webClient new WebClient webClient DownloadFile http www nseindia com content historical EQU
  • -bash: ./deploy.sh: 权限被拒绝,错误:脚本返回退出代码 126

    我正在尝试使用 Jenkins 实现持续部署 这涉及到将 jar 文件发送到远程服务器 并在远程服务器上启动该 jar 文件 问题是我不断收到访问被拒绝错误 并且我已经尝试了远程和本地服务器上的每个帐户似乎都不起作用 我犯了同样的错误 詹金
  • 为什么选择选择更改多个提交?

    我这里有 2 个分支 即分支 1 和分支 2 分支1增加了很多新功能 分支2也很稳定 今天 我只想将分支 1 中的 1 个功能合并到分支 2 中 所以 我只是跑git cherry pick
  • Drupal 7 - 如何从模块加载模板文件?

    我正在尝试在 Drupal 7 中构建自己的模块 所以我创建了一个名为 moon 的简单模块 function moon menu items array items moon array title gt description gt t
  • LINQ to Entities 在 DateTime.DayOfWeek 上加入

    想象两个表 班次 RANK S DAY Shifts 包含一个 ShiftDate 列 它是DateTime并且 RANK S DAY 有一个DayOfWeek柱子 我需要加入 int ShiftDate DayOfWeek equals
  • toUpperCase() 没有使字符串大写

    我不知道我做错了什么 但不知何故 toUpperCase 字符串函数在我的浏览器上不起作用 或者我弄错了什么 var string kjsdgfiIJHBVSFIU string toUpperCase console log string
  • Android - mediarecorder 的最大 maxfilesize 是多少?

    Android 对于 Android 媒体记录器 setMaxFileSize 可以设置的最大文件大小是多少 我知道它在 4147483650 和 5147483650 之间 为什么首先要有限制 我正在录制到 SDCARD 在运行之前检测卡
  • 使用 spring 在 Ibm Websphere MQ 中实现重试逻辑

    我正在使用 Spring 和 Websphere MQ 进行以下消息传递配置 我需要实现一个场景的重试逻辑 其中我从队列接收消息并将消息数据放到弹性搜索服务器 搜索服务器是非事务性的 如果搜索服务器关闭 我必须回滚消息再次放入队列并在一段时