我正在使用Spring开发Java项目。数据库是Oracle 我们在连接到远程队列的容器中配置了一个Message侦听器。以下是我们在触发onMessage后执行的步骤
如果队列中收到的消息是好的并且由于我们方面的某些问题,我们无法处理它,我们没有办法在等待一段时间后重新处理消息[假设触发了该问题的问题错误得到解决]。
以下是提出的新设计。 1.解析消息 2.使用标志在数据库中插入消息。说“false”[只有在成功处理邮件时才会更改标志。]
要添加的新进程,查询数据库以标记为“false”[一次一个]的记录,处理它并将标志更新为true。如果处理失败,请重试可配置的时间来处理相同的记录。如果没有更多记录要处理或已经用尽重试次数,该过程可能会死亡......
请建议合理的设计,尽早处理邮件,检测标记为“false”的记录
答案 0 :(得分:1)
这可以在Spring中使用@Async
注释完成。此注释允许在插入完成后异步启动任务。
这意味着在@Async
操作运行时,插入的线程不会阻塞,并且它将立即返回。
根据配置的任务执行程序,@Async
将在单独的线程中执行,这是您在这种情况下所需的。我建议从SimpleAsyncTaskExecutor
开始,参见here可用的不同任务执行程序。
另请查看此Spring tutorial以获取更多信息。
答案 1 :(得分:1)
由于您已经在使用Spring Integration,为什么不将增强的消息发送到新的频道并在那里进行处理?如果通道是QueueChannel
,则处理将是同步的。还有重试功能。