java - Spring 3.0如何做后台计算?

标签 java spring scheduling

在 Spring 应用程序中,我想做一些后台计算。任务是我保存一个实体(比如说 GPS 坐标),然后我想查询 Web 服务以获取所有坐标之间的距离并将它们存储在数据库中以供以后使用。存储实体后,有可能无法连接到将用于计算距离的 Web 服务。

我认为这可以通过在系统中引入一个作业(比如 cron 作业)来完成。一旦我们希望在后台发生某些事情,我们就会将其放入作业队列中。队列将尝试执行它收到的第一个作业,作业将连接到 Web 服务,如果由于某种原因失败,它会保留在队列中并告诉队列它失败了。然后,队列可以在指定的重试时间后执行。当作业成功完成时,将从作业队列中取出。

我清楚需求,但不确定使用哪种技术。 JMX、JMS、Spring 任务调度程序、Spring 集成、混合/匹配或全部。

这看起来类似于 How to create background process in spring webapp?但不完全

编辑 让我们进一步添加一点。还可以为每个 CSV 文件批量添加这些 GPS 坐标(通过 CSV 文件),每个条目都将在文件中进行处理(顺序将是先到先得的文件和每个条目)。删除情况可以更简单,因为预计不会删除任何内容(但可以稍后处理)

最佳答案

如果您“仅”需要异步执行,那么 duffymo 建议的 JMS 方法绝对是一个很好的解决方案(消息传递有保证,它是容错的,事务性的,等等)。但是,如果发生故障,消息将回滚并立即传送,除非您配置重新传送延迟重新传送限制。但是,虽然一些 JMS 提供商确实提供了此类功能(例如 MQ、WebLogic、JBoss),但据我所知,这并不是一个标准功能(例如,GlassFish OpenMQ 不提供此功能)。您需要考虑到这一点。

另一种方法是使用调度程序(特别是如果您还想延迟或安排作业执行) - 我在这里考虑使用 Quartz - 并在失败时重新安排作业(Quartz 完全支持这一点)。 Spring 还提供了 Quartz 的良好集成。

关于java - Spring 3.0如何做后台计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2217413/

相关文章:

java - webdriver 中的一系列多个操作

java - 获取 OSGi 包上下文的最佳技术?

Java:如何忽略具有 null 的字段并仅通过修改后的属性传递

multithreading - 操作系统调度程序如何重新获得CPU的控制权?

在进程上下文中调用 kmap_atomic()

java - Hibernate外键约束多对一问题

JAVA_HOME 应该指向 JDK 而不是 JRE + JAVA_HOME 未正确定义

spring - java.lang.IllegalStateException : ApplicationEventMulticaster not initialized

c# - Quartz.Net - 每 3 个月

java - 从属性文件创建 Ant 本地属性