2014-02-27 14 views
0

我正在使用Spring开发Java项目。数据库是Oracle 我们在连接到远程队列的容器中配置了一个消息监听器。以下是我们做一次的onMessage被触发触发Java进程检测记录会议特定条件

  1. 解析消息
  2. 在数据库中插入消息的步骤。
  3. 基于消息的内容做有关文件处理,数据库插入/更新等一些额外的过程..

如果队列中接收到的消息是好的,因为我们这边的一些问题,我们无法处理它,我们没有办法在等待一段时间后重新处理消息[假设触发错误的问题得到解决]。

以下是提出的新设计。 1.解析消息 2.使用标志将消息插入数据库中。说“错误”[该标志只有在邮件成功处理时才会被更改。]

要添加的新进程要查询数据库中标记为“false”的记录[一次一个],处理它并更新该标志为true。如果处理失败,请重试可配置的时间量以处理相同的记录。该过程可以死,如果没有更多的记录处理或已用尽的重试次数...

请提出合理的设计方案,其处理在尽可能早的时间检测标记为“假”的记录消息

  1. 触发一个java程序使用数据库触发器?[DBA是反对]
  2. 是否有数据库插入完成,也不会妨碍下一信息的检索之后,我们可以触发过程中onMessage方法的方法吗?
  3. 调度定期轮询数据库的作业吗?
+0

您的处理代码是否必须使用Java或可以使用PL/SQL? – OldProgrammer

+0

它必须在Java中 – user3255168

回答

1

这可以在春季用@Async注释完成。此注释允许在插入完成后异步启动任务。

这意味着在运行@Async操作时插入的线程不会被阻塞,并且它将立即返回。

根据配置的任务执行程序,@Async将在单独的线程中执行,这是您在这种情况下需要的。我建议从SimpleAsyncTaskExecutor开始,请参阅here可用的不同任务执行程序是什么。

查看此Spring tutorial了解更多信息。

1

由于您已经在使用Spring Integration,为什么不将增强型消息发送到新通道并在那里处理呢?如果频道是QueueChannel,则处理将是异步的。还有可用的重试功能。

+0

如果重试失败,应用程序预计会关闭。当应用程序再次出现时,我们需要处理消息。[当时消息在队列中不可用,因为我们不会在故障时将其推回到队列中] – user3255168

+0

当重试失败(但由您决定)时,不需要应用程序失败。我猜你已经在某个地方坚持了信息?因此,您可能需要有一个后台进程,或者只是启动时触发的一个单一操作,以处理仍然失败但未处理的消息。在这一点上,这是一个开放式问题,所以我认为你应该尝试一些,然后再回答更多关于特定主题的问题。 –

+0

感谢戴夫....更确切地说..我需要实现一个进程,只要它被插入到数据库中,就会从表中选择消息[数据被MQ监听器持久化]。实现这一点的最佳方式是反映好像消息刚刚从队列中出来[在非错误场景中]? – user3255168