博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring事件学习和浅析
阅读量:5895 次
发布时间:2019-06-19

本文共 3518 字,大约阅读时间需要 11 分钟。

hot3.png

业务场景:在一个业务系统中,订单提交后并计算该笔订单的手续费。

       为了下单这个逻辑的完整性和代码执行更高效,我们可以把“下单”和“计算手续费”拆分成两个不同的业务逻辑。

一、定义一个发布事件的工具类EventUtils

这个工具类只负责发布事件

public class EventUtils implements ApplicationContextAware {    private static ApplicationContext applicationContext;    @Override    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {        this.applicationContext = applicationContext;    }    public static void publishEvent(final ApplicationEvent event) {        if (TransactionSynchronizationManager.isActualTransactionActive()) {            TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {                @Override                public void afterCommit() {                    applicationContext.publishEvent(event);                    super.afterCommit();                }            });        } else {            applicationContext.publishEvent(event);        }    }}

二、定义一个事件模型

就是创建一个普通java类并继承org.springframework.context.ApplicationEvent,它主要负责数据传输

public class OrderSubmitEvent extends ApplicationEvent{    private static final long serialVersionUID = -726198855342137539L;    public OrderSubmitEvent(Object source) {        super(source);    }}

三、 定义一个订单服务类

@Servicepublic class OrderService {    static final Logger logger = LoggerFactory.getLogger(OrderService.class);    // 创建订单方法    ps:这只是测试代码,如果写正式代码建议定义接口    public void create(){        logger.info("OrderService.create");        // 执行创建订单逻辑        // do something...        // 要传输的信息,这里可以是object类型,我为了演示就直接传一个字符串过去        String message = "订单提交成功了!";        // 发布事件        EventUtils.publishEvent(new OrderSubmitEvent(message));        logger.info("OrderService.publishEvent");    }}

四、写监听器

既然订单创建好了并发布了事件,那我们就需要监听这个“订单已提交”的事件,去执行自己的逻辑,这个监听器需要实现 org.springframework.context.ApplicationListener 然后重写它的方法。

@Componentpublic class OrderSubmitListener implements ApplicationListener
{ final static Logger logger = LoggerFactory.getLogger(OrderSubmitListener.class); @Async @Override public void onApplicationEvent(OrderSubmitEvent orderCompleteEvent) { Object source = orderCompleteEvent.getSource(); logger.info("OrderSubmitListener onApplicationEvent source:[{}]", ToStringBuilder.reflectionToString(source)); }}

五、配置文件

直接贴代码,如果直接复制下面配置,需要修改一下你们的包路径

六、测试

@RestController@RequestMapping(value = "api/test",produces = "text/plain;charset=UTF-8")public class TestController {    static final Logger logger = LoggerFactory.getLogger(TestController.class);    @Autowired    private Configuration configuration;    @Autowired    private OrderService orderService;    @RequestMapping(value = "/index")    public String order(){        logger.info("TestController create order run");        orderService.create();        return "index";    }}

控制台结果:

17:10:53.936 [qtp1899280551-20] INFO  com.xxx.web.controller.TestController - TestController create order run17:10:53.937 [qtp1899280551-20] INFO  com.xxx.springevent.OrderService - OrderService.create17:10:53.947 [qtp1899280551-20] INFO  com.xxx.springevent.OrderSubmitListener - OrderSubmitListener onApplicationEvent source:[java.lang.String@73bd9107[value={订,单,提,交,成,功,了,!},hash=171729329]]17:10:53.947 [qtp1899280551-20] INFO  com.xxx.springevent.OrderService - OrderService.publishEvent

 

转载于:https://my.oschina.net/codingcloud/blog/1558848

你可能感兴趣的文章
我就是一个救火员(DBA救援)
查看>>
Centos7安装Gitlab10.0
查看>>
Windows Server 笔记(六):Active Directory域服务:域控制器安装
查看>>
FTP传输文件(hcl模拟器的操作)
查看>>
discuz X3登录流程分析
查看>>
javascript事件响应
查看>>
通过script标签实现JSONP跨域调用
查看>>
用jQuery实现Ajax
查看>>
***微信公众平台开发: 获取用户基本信息+OAuth2.0网页授权
查看>>
上传图片预览
查看>>
vim编辑器
查看>>
程序设计的一些原理
查看>>
iTerm的安装以及配置
查看>>
explore my oracle support using firefox 3.6
查看>>
《社交网站界面设计(原书第2版)》——1.7 反模式的重要性
查看>>
2016上半年DDoS攻击报告:DDoS攻击的规模和攻击频率都在不断攀升
查看>>
混合云、区块链、认知技术,还有哪一样前沿技术是IBM没提到的吗?
查看>>
呼叫中心现场管理人员注意事项
查看>>
nagios监控远程windows服务器
查看>>
lagp,lacp详解
查看>>