springboot(mvc)利用applicationEvent来解耦异步运行很实用。

摘要: 但一个对象的变化,触发另外一个事件。只是典型的观察者模式,在spring中也有很好的体现,ApplicationEvent 就是很好的一个实现。简单记录几个要点:1. 对象(事件)2. 监听对象3. 发布对象

但一个对象的变化,触发另外一个事件。只是典型的观察者模式,在spring中也有很好的体现,ApplicationEvent 就是很好的一个实现。简单记录几个要点:
1. 对象(事件)
2. 监听对象
3. 发布对象
分别写了几个简单的类来实现:
1. 事件本身

public class LogEvent extends ApplicationEvent {	
	private Logger logger = LoggerFactory.getLogger(this.getClass());

	public LogEvent(Object source) {
		super(source);
		logger.info("log event construstor function");
	}
}


2. 监听器
@Component
public class LogEventListener {	
	private Logger logger = LoggerFactory.getLogger(this.getClass());
	
	@Autowired
	private LogEventService logEventService;	
	@EventListener
	@Async
	public void onApplicationEvent(LogEvent logEvent) {
		logger.info("==>onAppliation Event begin");
		try {
			logEventService.testLogEvent();
		} catch (InterruptedException e) {			
			e.printStackTrace();
		}
		logger.info("==>onAppliation Event end");
	}
}

3. 触发监听,也就是发布事件, 我放在controller里测试
[code]
@RestController
@RequestMapping("/event")
public class EventController {
	
	@Autowired
	private ApplicationEventPublisher publisher;
	
	@RequestMapping("/log")
	public String testEventLog() {
		String s = "lalalala" + System.currentTimeMillis();
		LogEvent e = new LogEvent("lalalala" + System.currentTimeMillis());
		publisher.publishEvent(e);
		return s;
	}
}


4. 事件触发的service. 一个测试,模拟等待几秒
@Service
public class LogEventService {
	
	private Logger logger = LoggerFactory.getLogger(this.getClass());
	
	public void testLogEvent() throws InterruptedException {
		logger.info("==begin to asyn exec function");
		Thread.sleep(5000);
		logger.info("I am done");
		logger.info("==end to asyn exec function");		
	}
}


5. 如果想异步执行,还需要开启 @EnableAsync

上一篇: 做一个mysql监控系统应该掌握的一些基本语句
下一篇: 积木长恨歌
 评论 ( What Do You Think )
名称
邮箱
网址
评论
验证
   
 

 


  • 微信公众号

  • 我的微信

站点声明:

1、一号门博客CMS,由Python, MySQL, Nginx, Wsgi 强力驱动

2、部分文章或者资源来源于互联网, 有时候很难判断是否侵权, 若有侵权, 请联系邮箱:summer@yihaomen.com, 同时欢迎大家注册用户,主动发布无版权争议的 文章/资源.

3、鄂ICP备14001754号-3, 鄂公网安备 42280202422812号