当前位置:网站首页>采用注解+拦截器的方式进行异步执行的实现方式
采用注解+拦截器的方式进行异步执行的实现方式
2020-11-08 20:18:00 【osc_03803522】
背景
你可能在你的项目中用过Spring的@Async注解,以此来将部分方法转化为异步执行,从而提高请求的响应效率
但在服务架构不断的演进之中,这种丢入线程池处理的方式带来的缺陷也愈发明显:
- 不利于监控
- 如果意外停机,尚未处理的任务会尽数丢失
- 在集群中的某个节点要处理大量异步任务时,无法将压力分担到集群中其他节点
- 项目中若集成了使用ThreadLocal特性的模块或第三方组件,需要注意上下文丢失的问题
思路
使用消息队列作为异步任务的实现方式,这样我们就可以:
- 大量成熟的MQ中间件都提供了可视化管理平台,监控更加方便
- 可以用消息队列Header来保存上下文,如用户信息、token等
- 消息队列的发布-订阅模式可以最大程度利用集群的业务处理能力
- 更容易保证任务的顺序性
- 如果有服务节点宕机,可以利用消息确认、消息重试等机制保证任务执行的正确性
实现
为了保证业务代码和实现方案解耦,类似于@Aync方案,我们同样采用注解+拦截器的方式进行逻辑注入
@Around("@annotation(org.springframework.amqp.rabbit.annotation.RabbitListener)")
public Object cut(ProceedingJoinPoint pjp) throws Throwable {
...
}
实现思路大同小异,就是读取注解中的队列声明确认发布-订阅关系,然后以丢入消息队列来替换丢入线程池
private String resolveKey(Queue[] queues) {
String s = this.beanFactory.resolveEmbeddedValue(queues[0].value());
return (String) resolver.evaluate(s, evalContext);
}
rabbitTemplate.convertAndSend(resolveKey(queues), args[0]);
为消息队列注入Json转换器,方便对象传输
@Bean
public Jackson2JsonMessageConverter producerJackson2MessageConverter() {
return new Jackson2JsonMessageConverter();
}
如有需要,我们可以将上下文的用户信息、token等写入消息的Header中
private MessagePostProcessor beforePublishPostProcessor() {
return message -> {
// setting up context to message header
return message;
};
}
被异步调用的service代码:
@Service
@Slf4j
public class DemoService {
@RabbitListener(queuesToDeclare = @Queue("mytestqueue"))
public void checkSome(List<String> tagTuple) {
log.warn("check here {}", tagTuple);
}
}
调用service的controller:
@RestController
public class DemoController {
@Autowired
private DemoService demoService;
@RequestMapping("check")
public Integer checkSome() {
ArrayList<String> tagTuple = new ArrayList<>();
tagTuple.add("bar");
tagTuple.add("foo");
demoService.checkSome(tagTuple);
return 0;
}
}
执行查看效果
17:00:14.584TRACE[AbstractHandlerMapping.java:411]Mapped to org.smop.duplex.sample.DemoController#checkSome()
17:00:21.263WARN [DemoService.java:16]check here [bar, foo]
外部文件操作django的models
#外部文件使用django的models,需要配置django环境
import os
if __name__ == '__main__':
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "singletablehw.settings")
import django
django.setup()
from app01 import models
import datetime
obj_list = []
for i in range(1,10):
obj = models.Book(
title='葵花宝典第%s式'%i,
price=20 + i,
pub_date='198%s-11-11 00:00:00'%i,
# pub_date=datetime.datetime.now(),
publish= '吴老板出版社' if i < 5 else '太白出版社',
)
obj_list.append(obj)
models.Book.objects.bulk_create(obj_list)
url别名反向解析
#添加书籍
url(r'^add_book/', views.add_book,name='abook'), #name='abook' 别名
# 删除书籍
url(r'^delete_book/(\d+)/', views.delele_book,name='delete_book'),
视图:
from django.urls import reverse
reverse('别名') reverse('abook') -- /add_book/ #不带参数的
print(reverse('delete_book',args=(71,))) #/delete_book/71/ 带参数的
模板:
{% url 'abook' %} 无参数的
{% url 'delete_book' book.id %} 有参数的
版权声明
本文为[osc_03803522]所创,转载请带上原文链接,感谢
https://my.oschina.net/u/4797210/blog/4708314
边栏推荐
- Infix expression to suffix expression
- Is parameter passing in go language transfer value or reference?
- Regular backup of WordPress website program and database to qiniu cloud
- Django之简易用户系统(3)
- Deep copy
- getBytes之 LengthFieldBasedFrameDecoder服务端解析
- 快来看看!AQS 和 CountDownLatch 有怎么样的关系?
- AI香水来了,你会买吗?
- When to write disk IO after one byte of write file
- AI perfume is coming. Will you buy it?
猜你喜欢
IT industry salary has been far ahead! Ten years later, is the programmer still a high paying profession?
寻找性能更优秀的动态 Getter 和 Setter 方案
npm install 无响应解决方案
Django之简易用户系统(3)
go语言参数传递到底是传值还是传引用?
Flink系列(0)——准备篇(流处理基础)
Django's simple user system (3)
IT行业薪资一直遥遥领先!十年后的程序员,是否还是一个高薪职业?
函数分类大pk!sigmoid和softmax,到底分别怎么用?
解决go get下载包失败问题
随机推荐
为什么需要使用API管理平台
python开发qt程序读取图片的简单流程
第二章编程练习
线程池运用不当的一次线上事故
RSA asymmetric encryption algorithm
Interesting article sharing: what is the difference between C language and C + +, C?
动态规划之子序列问题解题模板
【杂谈】JS相关的线程模型整理
PAT_甲级_1056 Mice and Rice
Brief VIM training strategy
Simple process of reading pictures by QT program developed by Python
npm install 无响应解决方案
微信小程序相关
Countdownlatch explodes instantly! Based on AQS, why can cyclicbarrier be so popular?
使用Fastai开发和部署图像分类器应用
Part I - Chapter 1 Overview
Using GaN based oversampling technique to improve the accuracy of model for mortality prediction of unbalanced covid-19
【Elasticsearch 技术分享】—— 十张图带大家看懂 ES 原理 !明白为什么说:ES 是准实时的!
(O) Analysis of service manager (1) BinderInternal.getContextObject
I used Python to find out all the people who deleted my wechat and deleted them automatically