1
eric6356 2016-10-12 18:54:33 +08:00
听起来像消息队列
|
2
paulw54jrn 2016-10-12 18:58:45 +08:00
Spring Integration + Spring Batch + RabbitMQ?
|
3
sutra 2016-10-12 19:13:04 +08:00
首先这个架构设计有点不走寻常路。
你可以改架构: 前端 -> REST API -> Web App -> Message Queue(such as ActiveMQ) <- Syncer(Standalone process) 说明: 前端通过 REST API 调用 web app , web app 向消息队列增加一个消息; 有一个单独的进程,用来做同步工作,它一直运行着,监听消息队列并处理,在这个进程里做任务并发的调度。 回到你现在的架构,你现在是任务已经结束了,但是数据库里的任务标志位依旧显示运行中。很可能是因为任务执行过程中,进程 /线程意外终端,并没有去执行 finally block ,比如意外 crash 或者断电。那么就在你的启动任务进程 /线程的父进程 /线程自身启动时重置该标志位。 |
4
yesterdaysun OP @sutra 我现在用的是简单的 Spring Schedule, 每个任务启动一个异步的 taskExecutor, 感觉目前在调用频率上应该还用不上消息队列之类的.
但是意外中断这个问题要怎么解决呢, 你提到"就在你的启动任务进程 /线程的父进程 /线程自身启动时重置该标志位。", 那么我怎么知道重置的这个时候之前的任务是正常运行中还是已经中断了呢? |
5
sutra 2016-10-13 13:54:18 +08:00 via iPhone
@yesterdaysun 在你的 schedule 的 task 里直接执行就好了,并不需要数据库标识位, spring 的 schedule task 默认就是不会并发,不信你 sleep 试试。你只要把 schedule 独立出来(因为通常我们会把 webapp 搞多台服务器做负载均衡),确保只有一个进程就好了。
那么你的 webapp 和 schedule 是怎么通信的?数据库标识位?那没问题,你在 schdule task 开始时就认为任务不在执行,也为单进程和 spring schedule 已经能确保不并发了 。 |