java - 交易失败重审的处理
问题描述
我正在尝试实现重试失败的事务。为此,我们所做的事情是我的一个 EAR 尝试向第 3 方请求,如果失败,它将所有事务写入文件(在 CSV 文件中,每个请求以逗号分隔)。例如:肥皂请求 1 失败,肥皂请求 2 失败,
我的另一个 EAR 正在运行一个调度程序,它会读取所有事务。
如果我的文件处于读取或写入模式,则此时不会继续。如果它不是处于读取或写入模式,它将继续进行。为此,我们通过附加来更改文件名_locked
。因此,如果写入线程看到锁定的文件,它会创建一个新文件用于写入和读取过程会跳过该文件。
在阅读过程中,我们将所有失败的事务放入JMS
队列,消费者为每个请求再次向第三方发出请求。成功和失败的交易我必须写入其他目录,以便可以手动检查失败的交易(用于退款)。
问题:1)。我想知道如果我的服务器出现故障并且我没有得到第 3 方的响应怎么办。因此,从 开始ActiveMQ
,我的事务对象已经从队列中消耗,但在进一步处理中它丢失了。那么是否可以ActiveMQ
在收到回复后手动确认。但我认为这会减慢我对大量请求的请求响应处理。
2)如果我必须为每个请求重试 3 次怎么办。所以在我的脑海中,我会处理每个文件以处理失败的请求,我会写入名为RETRIED_ONCE的目录中的其他文件。
如果在RETRIED_ONCE中没有用于失败事务的 RETRIED_TWICE文件夹,我必须再次遍历。我会创建一个 CSV 文件并将其写入该文件夹。如果在 RETRIED_TWICE中重试任何事务,将进入失败文件夹,并且将手动查看这些事务。
我的调度程序每小时都会扫描这三个文件夹并相应地写入失败的事务。
还有比这更好的方法吗?
或者我应该为RETRIED_ONCE和RETRIED_TWICE创建两个JMS
队列。
解决方案
推荐阅读
- typescript - 什么设置导致 Neovim 在打字稿枚举中的格式不一致?
- python - “未定义函数名称”
- objective-c - 为什么 AudioUnit 在带闪电插头的耳机下每帧收集 940 字节
- vulkan - Vulkan 管道衍生品
- javascript - React Hooks 是否显着提高了 React Native 中移动应用程序的性能?
- delphi - 如何将 ANSI 字符串文件名转换为 windows 文件名
- java - 无法到达的语句是一种错误而不是Java中的警告?
- java - 如何修复 MathCalculationException 的异常问题?
- reactjs - ReactJS 钩子:如何在两个不同的 .js 文件中使用上下文?
- javascript - 创建单独的渲染视图