Spring 的ApplicationEvent 机制 实现了简单消息事件通知机制,如果不是分布式的单机应用,用这个就够了。
我们使用的情况是, 要与异步接口集成,需要不断轮训任务状态,并根据状态变化,处理业务,这一部分我们使用
ApplicationEvent机制结合Async 实现。
我们的难点其实是如下:
在spring 编程中竟然用到了 tcp 分包重组的思想
场景:
1. 有一个异步接口, uploadAndCal 接口,返回任务状态, 然后client 轮训任务状态,如果成功则 next action。
这个异步接口也是奇怪,上传的数据太大竟然不返回,这叫什么异步接口?
于是对于一份大数据,我们竟然要拆分成 N 次进行 上传。
在这里就有一个问题,对于 N个异步调用,如何编程实现, N个子任务成功了,才进行下一步任务。
其实我没想到好的办法,但是觉得和tcp 传输 的机制非常像。 一个大的package,拆分成10个小包,
通过网络传出去,10个包顺序完全混乱,在接收端再由专门的程序进行重组。如果有10个包都收到了就转发出去。
我们的场景和这个非常像。 10个包 就是10个异步调用,顺序不保障,并且每一个都有可能失败,需要retry。
实现的思路。
1. 上传是 数据 切成 N 分, 对应N个 任务,每个任务都给他们一个 batchId。那么通过这个batchId就可以分组。
同时,每个任务也给他一个 batchSize,和 sequenceNum.
2. 对于每个subtask 调用数据上传的api, 获得 taskId,然后丢入到轮询服务中。
3. 轮询服务查询任务状态,并发布消息。
4. 消息消费者, 对于每个消息都会检查 batchId, 并且把 相同的 subTask 组合在一起,如果达到N个subTask全部成功的条件
就进行下一步业务。如果收到N个subTask消息,其中有失败的,则向retry服务发送消息,由其进行定时重试。
目前使用这种方法实现了业务要求,对于异步框架不太熟悉,不知道大家有没有没更好的方法,或者成熟的框架可以使用。










网友评论