「这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战」。
在很多实际业务开发过程中都会用到异步处理的概念,为什么要用到异步处理?异步和同步是相反的结果,同步则是在发起一个调用后,会等到这个过程有结果了才返回;那么相反的异步就是发起一个调用后,不会立刻得到结果,这个结果会通过其他形式返回,或者是用回调函数处理结果。
异步处理的好处就是能调用方不受结果的限制,能正常调用完成,而结果方也可以自由时间返回结果,延长这个调用过程。常常用于一些后置逻辑的处理,比如定时任务、延迟消息等等。
下面介绍一种常用的异步处理框架设计。
简单的逻辑就是利用mq消息和定时任务设计的一个异步处理机制。
首先处理完业务逻辑后,发送mq消息,然后是消费mq消息,可以是在本项目中也可以是另外起一个项目去消费。然后将初始的数据写入数据库(包括是否异步处理、是否失败重试、重试次数、失败重试时间、状态等等)。
然后就是通过定时任务遍历这些数据,获取符合条件的数据进行后续的逻辑处理。
看起来其实挺简单的,下图可能更清晰的解释一下这个框架。
贴上一些代码实现逻辑,不会太完整,大家还是要自己亲自写过才能真的运用起来。
@StreamListener(value = Test.INPUT, condition = "headers['tag']=='test_tag' and headers['bizCode']=='TEST'")
/**
* 获取任务数据
*/
@Scheduled(fixedDelay = 10000, initialDelay = 1000)
public void handleTodo() {
logger.info("handleTodo");
//获取初始化状态或者待执行状态的任务清单
for (TestSchContext testSch : TestSchContext.finder.todo()) {
TestSchService.execute(context);
}
}