Spring Batch - 并非所有记录都通过 MQ 检索进行处理

2024-01-06

我对 Spring 和 Spring Batch 相当陌生,所以如果您有任何疑问,请随时提出任何澄清问题。

我发现 Spring Batch 存在问题,无法在测试或本地环境中重新创建。我们的日常工作是通过 JMS 连接到 Websphere MQ 并检索一组记录。此作业使用开箱即用的 JMS ItemReader。我们实现了自己的 ItemProcessor,但除了日志记录之外它没有做任何特殊的事情。没有任何过滤器或处理会影响传入记录。

问题是,在 MQ 上的 10,000 多条日常记录中,通常只有大约 700 条左右(每次的确切数字不同)会记录在 ItemProcessor 中。所有记录均已成功从队列中拉出。每次记录的记录数量都不同,并且似乎没有规律。通过将日志文件与 MQ 中的记录列表进行比较,我们可以看到我们的作业正在“处理”看似随机的记录子集。第一条记录可能会被选取,然后跳过 50 条记录,然后连续 5 条记录,依此类推。每次作业运行时,模式都不同。也没有记录任何异常。

在本地主机中运行相同的应用程序并使用相同的数据集进行测试时,ItemProcessor 成功检索并记录了所有 10,000 多条记录。该作业在生产中运行 20 到 40 秒(也不是恒定的),但在测试和本地需要几分钟才能完成(这显然是有道理的,因为它要处理更多的记录)。

因此,这是难以解决的问题之一,因为我们无法重现它。一个想法是实现我们自己的 ItemReader 并添加额外的日志记录,以便我们可以查看记录是否在读取器之前或之后丢失 - 我们现在所知道的是 ItemProcessor 只处理记录的子集。但即使这样也不能解决我们的问题,而且考虑到它甚至不是一个解决方案,实施它也有点及时。

还有其他人见过这样的问题吗?任何可能的想法或故障排除建议将不胜感激。以下是我们用来参考的一些 jar 版本号。

  • 春季 - 3.0.5.RELEASE
  • Spring 集成 - 2.0.3.RELEASE
  • 春季批次 - 2.1.7.RELEASE
  • Activemq-5.4.2
  • Websphere MQ - 7.0.1

预先感谢您的意见。

编辑:根据请求,处理器代码:

public SMSReminderRow process(Message message) throws Exception {

    SMSReminderRow retVal = new SMSReminderRow();
    LOGGER.debug("Converting JMS Message to ClaimNotification");
    ClaimNotification notification = createClaimNotificationFromMessage(message);

    retVal.setShortCode(BatchCommonUtils
            .parseShortCodeFromCorpEntCode(notification.getCorpEntCode()));
    retVal.setUuid(UUID.randomUUID().toString());
    retVal.setPhoneNumber(notification.getPhoneNumber());
    retVal.setMessageType(EventCode.SMS_CLAIMS_NOTIFY.toString());

    DCRContent content = tsContentHelper.getTSContent(Calendar
            .getInstance().getTime(),
            BatchCommonConstants.TS_TAG_CLAIMS_NOTIFY,
            BatchCommonConstants.TS_TAG_SMSTEXT_TYP);

    String claimsNotificationMessage = formatMessageToSend(content.getContent(),
            notification.getCorpEntCode());

    retVal.setMessageToSend(claimsNotificationMessage);
    retVal.setDateTimeToSend(TimeUtils
            .getGMTDateTimeStringForDate(new Date()));

    LOGGER.debug(
            "Finished processing claim notification for {}. Writing row to file.",
            notification.getPhoneNumber());
    return retVal;
}

JMS配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<bean id="claimsQueueConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="jms/SMSClaimNotificationCF" />
    <property name="lookupOnStartup" value="true" />
    <property name="cache" value="true" />
    <property name="proxyInterface" value="javax.jms.ConnectionFactory" />
</bean>

<bean id="jmsDestinationResolver"
    class="org.springframework.jms.support.destination.DynamicDestinationResolver">
</bean>

<bean id="jmsJndiDestResolver" 
    class=" org.springframework.jms.support.destination.JndiDestinationResolver"/>  

<bean id="claimsJmsTemplate" class="org.springframework.jms.core.JmsTemplate">
    <property name="connectionFactory" ref="claimsQueueConnectionFactory" />
    <property name="defaultDestinationName" value="jms/SMSClaimNotificationQueue" />
    <property name="destinationResolver" ref="jmsJndiDestResolver" />
    <property name="pubSubDomain">
        <value>false</value>
    </property>
    <property name="receiveTimeout">
        <value>20000</value>
    </property>
</bean>

一般来说,正确配置后,MQ 不会丢失消息。那么问题是“正确配置”是什么样子的?

通常,丢失消息是由非持久性或非事务性 GET 引起的。

如果非持久消息正在遍历 QMgr 到 QMgr 通道并且NPMSPEED(FAST)设置后,如果错误丢失,MQ 将不会记录错误。这就是这些选项的用途,因此不会出现错误。

修复:设置NPMSPEED(NORMAL)在 QMgr 到 QMgr 通道上或使消息持久化。

如果客户端在同步点之外获取消息,则消息可能会丢失。这与 MQ 无关,这只是消息传递的一般工作方式。如果您告诉 MQ 破坏性地从队列中获取一条消息,并且它无法将该消息传送到远程应用程序,那么 MQ 回滚该消息的唯一方法是在同步点下检索该消息。

修复:使用事务处理会话。

还有一些根据经验而产生的附加注释。

  • 每个人都发誓消息持久性设置为他们认为的那样。但是当我停止应用程序并手动检查消息时very经常是not预期是什么。很容易验证,所以不要假设。
  • 如果消息在队列上回滚,则直到 MQ 或 TCP 使孤立通道超时才会发生这种情况。这可能长达 2 小时,因此请调整通道参数和 TCP Keepalive 以减少该时间。
  • 检查 MQ 的错误日志(QMgr 而非客户端的错误日志)以查找有关事务回滚的消息。
  • 如果您仍然无法确定消息的去向,请尝试使用支持Pac MA0W http://ibm.co/SupptPacMA0W。该跟踪作为出口运行,它是极其可配置。你可以追踪所有GET仅对单个队列进行操作。输出是人类可读的形式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Batch - 并非所有记录都通过 MQ 检索进行处理 的相关文章

  • 使用 Ant 将非代码资源添加到 jar 文件

    我正在将 java 应用程序打包成 jar 文件 我正在使用 ant 和 eclipse 我实际上需要在 jar 中直接在根文件夹下包含几个单独的非代码文件 xml 和 txt 文件 而不是与代码位于同一位置 我正在尝试使用includes
  • 使用 GWT 读取非常大的本地 XML 文件

    我正在使用 GWT 构建我的第一个 Java 应用程序 它必须从一个非常大的 XML 文件中读取数据 当我尝试发送对文件中信息的请求时遇到问题 并且我不太确定它是否与文件的大小或我的语义有关 在我的程序中 我有以下内容 static fin
  • Spring Boot自动装配存储库始终为空[重复]

    这个问题在这里已经有答案了 每次我进入我的服务类时 存储库似乎都没有自动连接 因为它不断抛出 NullPointerException 谁能帮我检查一下我缺少什么吗 这是我的代码 演示应用程序 java package com exampl
  • 来自十六进制代码的 Apache POI XSSFColor

    我想将单元格的前景色设置为十六进制代码中的给定颜色 例如 当我尝试将其设置为红色时 style setFillForegroundColor new XSSFColor Color decode FF0000 getIndexed 无论我在
  • 如何使用 Hibernate (EntityManager) 或 JPA 调用 Oracle 函数或过程

    我有一个返回 sys refcursor 的 Oracle 函数 当我使用 Hibernate 调用该函数时 出现以下异常 Hibernate call my function org hibernate exception Generic
  • 套接字的读写如何同步?

    我们创建一个套接字 在套接字的一侧有一个 服务器 在另一侧有一个 客户端 服务器和客户端都可以向套接字写入和读取 这是我的理解 我不明白以下事情 如果服务器从套接字读取数据 它在套接字中是否只看到客户端写入套接字的内容 我的意思是 如果服务
  • 生成的序列以 1 开头,而不是注释中设置的 1000

    我想请求一些有关 Hibernate 创建的数据库序列的帮助 我有这个注释 下面的代码 在我的实体类中 以便为合作伙伴表提供单独的序列 我希望序列以 1000 开头 因为我在部署期间使用 import sql 将测试数据插入数据库 并且我希
  • 从 GitHub 上托管的 Spring Cloud Config Server 访问存储库的身份验证问题

    我在 GitHub 上的存储库中托管配置 如果我将回购公开 一切都好 但如果我将其设为私有 我将面临 org eclipse jgit errors TransportException https github com my user m
  • @Autowire注释的问题(空)

    我在验证器类中自动连接的两个服务有问题 这些服务工作正常 因为在我的控制器中是自动连接的 我有一个 applicationContext xml 文件和 MyApp servlet xml 文件 我的基础包是 es unican meteo
  • 读取电子邮件的文本文件转换为 Javamail MimeMessage

    我有一个电子邮件原始来源的文本文件 直接从 gmail 复制 如果您单击 查看原始文件 您就会看到它 我想读入该文件并将其转换为 MimeMessage 如果您好奇为什么 我设置了 JavaMaildir 并且需要用电子邮件填充它的收件箱以
  • Freemarker 和 Struts 2,有时它计算为序列+扩展哈希

    首先我要说的是 使用 Struts2 Freemarker 真是太棒了 然而有些事情让我发疯 因为我不明白为什么会发生这种情况 我在这里问是因为也许其他人有一个想法可以分享 我有一个动作 有一个属性 说 private String myT
  • 流中的非终结符 forEach() ?

    有时 在处理 Java Stream 时 我发现自己需要一个非终端 forEach 来触发副作用但不终止处理 我怀疑我可以用 map item gt f item 之类的方法来做到这一点 其中方法 f 执行副作用并将项目返回到流中 但这似乎
  • 使用布尔值进行冒泡排序以确定数组是否已排序

    我有以下用于冒泡排序的代码 但它根本不排序 如果我删除布尔值那么它工作正常 我知道 由于我的 a 0 小于所有其他元素 因此没有执行交换 任何人都可以帮助我解决这个问题 package com sample public class Bub
  • Hamcrest Matchers - 断言列表类型

    问题 我目前正在尝试使用 Hamcrest Matchers 来断言返回的列表类型是特定类型 例如 假设我的服务调用返回以下列表 List
  • Java中HashMap和ArrayList的区别?

    在爪哇 ArrayList and HashMap被用作集合 但我不明白我们应该在哪些情况下使用ArrayList以及使用时间HashMap 他们两者之间的主要区别是什么 您具体询问的是 ArrayList 和 HashMap 但我认为要完
  • 如何使用play框架上传多个文件?

    我在用play framework 2 1 2 使用java我正在创建视图来上传多个文件 我的代码在这里 form action routes upload up enctype gt multipart form data
  • 配置“DataSource”以使用 SSL/TLS 加密连接到 Digital Ocean 上的托管 Postgres 服务器

    我正在尝试托管数据库服务 https www digitalocean com products managed databases on 数字海洋网 https en wikipedia org wiki DigitalOcean 创建了
  • 在浏览器刷新中刷新检票面板

    我正在开发一个付费角色系统 一旦用户刷新浏览器 我就需要刷新该页面中可用的统计信息 统计信息应该从数据库中获取并显示 但现在它不能正常工作 因为在页面刷新中 java代码不会被调用 而是使用以前的数据加载缓存的页面 我尝试添加以下代码来修复
  • 洪水填充优化:尝试使用队列

    我正在尝试创建一种填充方法 该方法采用用户指定的初始坐标 检查字符 然后根据需要更改它 这样做之后 它会检查相邻的方块并重复该过程 经过一番研究 我遇到了洪水填充算法并尝试了该算法 它可以工作 但无法满足我对 250 x 250 个字符的数
  • 在java中使用多个bufferedImage

    我正在 java 小程序中制作游戏 并且正在尝试优化我的代码以减少闪烁 我已经实现了双缓冲 因此我尝试使用另一个 BufferedImage 来存储不改变的游戏背景元素的图片 这是我的代码的相关部分 public class QuizApp

随机推荐

  • 使用 pdfmake 在段落周围添加边框

    我正在通过生成pdfpdfmake http bpampuch github io pdfmake 假设我有这样的 pdf 内容 var docDefinition content Lorem ipsum dolor sit amet co
  • Python 中的字符串是池化的吗?

    Python 是否有一个所有字符串的池 并且它们 字符串 是单例吗 更准确地说 在下面的代码中 是在内存中创建了一个还是两个字符串 a str num b str num 字符串在 Python 中是不可变的 因此实现可以决定是否实习 这是
  • heroku 上的 Hapi 服务器无法绑定端口

    我正在为 ReactJS 应用程序开发 Hapi 服务器 但当我尝试部署到 Heroku 时 收到 R10 错误 无法在启动后 60 秒内绑定到 PORT 到底是怎么回事 我正在使用 process env PORT 我也尝试过 parse
  • Web 应用程序安全的好指南? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我非常擅长制作网络应用程序 并且知道如何在客户端 服务器等之间传输数据 尽管学习如何使数据交换更安全 但我需要一些帮助 这就是为什么我有点害怕发
  • 如何在 C++ 中存储变量数据

    我正在创建一个存储有关特定数据源的元数据的类 元数据采用树状结构 与 XML 的结构非常相似 元数据值可以是整数 小数或字符串值 我很好奇 C 中是否有一种好方法来存储这种情况的变体数据 我希望变体使用标准库 因此我避免使用可用的 COM
  • Numba:如何抑制

    我的 numba 代码中不断出现此错误 Warning 101 0 Unused argument self 我的 numba 代码如下 如何抑制错误消息 autojit def initialise output data self in
  • 使用 $switch 将分数添加到 MongoDB 聚合

    我正在尝试根据哪个值向我的 mongodb 聚合添加一个分数name字段匹配 例如 如果name与 sitt 完全匹配 得分为100 如果name匹配 sitt i 得分为 50 这是我的代码 db getCollection tags a
  • 构造函数参数的求值顺序[重复]

    这个问题在这里已经有答案了 假设我有这门课 struct A A int int int 我这样初始化它 A a b c 功能在哪里a b and c 全部返回int 应该a 之前被调用b and b before c 我对标准中的以下段落
  • Three.js - 获取鼠标单击的 X、Y 和 Z 坐标

    我在用着版本68三个 js 我想单击某处并获取 X Y 和 Z 坐标 我按照此处的步骤操作 但它们给我的 Z 值为 0 鼠标 画布 X Y 到 Three js 世界 X Y Z https stackoverflow com questi
  • tweepy OAuthHandler 错误

    我是新来的 对 python 没有经验 如果问题很微不足道 很抱歉 我有这个简单的脚本 用于获取给定 Twitter 用户的关注者 import time import tweepy consumer key xxx consumer se
  • 为什么我们需要虚拟表?

    我正在寻找一些有关虚拟表的信息 但找不到任何易于理解的内容 有人能给我一些很好的例子和解释吗 如果没有虚拟表 您将无法使运行时多态性发挥作用 因为对函数的所有引用都将在编译时绑定 一个简单的例子 struct Base virtual vo
  • Ajax 调用以 Base64 字符串形式返回 PDF 文件

    我在 Angular JS 环境中使用 ajax 来调用本地文件 pdf 文件 调用成功 但是ajax调用返回的数据是乱码 不确定我这里使用的术语是否正确 但就像使用文本编辑器打开pdf文件一样 无论如何 我可以得到 base64 字符串的
  • 使用Retrofit 2.0和RxJava获取响应状态代码

    我正在尝试升级到 Retrofit 2 0 并在我的 android 项目中添加 RxJava 我正在进行 api 调用 并希望在服务器出现错误响应时检索错误代码 Observable
  • 初始化列表与初始化方法

    在 C 中至少有两种初始化类的方法 1 初始化列表 struct C int i C i 0 2 初始化方法 struct D int i C init void init i 0 我需要时不时地重新初始化我的类的对象 使用第二种解决方案
  • C:为什么 LLVM 从左到右计算 printf,而 GCC 从右到左计算?

    正如这个问题中所述 LLVM和GCC 不同输出相同的代码 https stackoverflow com questions 15929795 llvm and gcc different output same code LLVM 和 G
  • Android - 从另一个活动完成活动

    有什么办法 如何从堆栈中完成某些活动 我有服务 它会查找更新 当找到更新时 它会打开更新活动 其中会出现安装提示 但是安装出现后我想完成更新活动 因为没有必要仍然在堆栈上 Thanks 如果更新活动正在启动另一个安装活动 那么您可能需要覆盖
  • 反应式的“缓冲直到安静”行为?

    我的问题有点像内格尔算法 https en wikipedia org wiki Nagle 27s algorithm是为了解决问题而创建的 但不完全是为了解决问题 我想要的是缓冲OnNext通知来自IObservable
  • 创建具有相同键和值的对象,而不重复数据

    在ES6中 我们可以这样做 const key foo const myObj key myObj gt foo foo So key 相当于 key key 但是 我们怎样才能创建同一个对象而不需要key多变的 我想要有类似的东西 foo
  • 使用应用程序期间可达性连接丢失时弹出警报(IOS xcode swift)

    我是 IOS 应用程序开发的初学者 希望 在使用应用程序期间失去可达性连接时弹出警报 IOS xcode swift 但我只在启动我的应用程序时收到弹出警报 当互联网连接丢失时 使用我的应用程序时不会弹出警报 请各位好心人帮忙 谢谢 我做了
  • Spring Batch - 并非所有记录都通过 MQ 检索进行处理

    我对 Spring 和 Spring Batch 相当陌生 所以如果您有任何疑问 请随时提出任何澄清问题 我发现 Spring Batch 存在问题 无法在测试或本地环境中重新创建 我们的日常工作是通过 JMS 连接到 Websphere