Spring框架事件

我正在阅读spring框架文档,并发现了一个使用ApplicationContext在Spring中引发事件的部分。 在阅读了几段后,我发现春季事件同步发生。 有没有办法提出异步事件? 非常感谢您的帮助。 我正在寻找类似的东西,这将有助于我完成我的模块。

最简单的异步ApplicationListener:

出版商:

@Autowired private SimpleApplicationEventMulticaster simpleApplicationEventMulticaster; @Autowired private AsyncTaskExecutor asyncTaskExecutor; // ... simpleApplicationEventMulticaster.setTaskExecutor(asyncTaskExecutor); // ... ApplicationEvent event = new ApplicationEvent(""); simpleApplicationEventMulticaster.multicastEvent(event); 

监听器:

 @Component static class MyListener implements ApplicationListener public void onApplicationEvent(ApplicationEvent event) { // do stuff, typically check event subclass (instanceof) to know which action to perform } } 

您应该将ApplicationEvent与您的特定事件一起子类化。 您可以在xml文件中配置SimpleApplicationEventMulticaster及其taksExecutor。

您可能希望在侦听器类中实现ApplicationEventPublisherAware,并在事件构造函数中传递源对象(而不是空字符串)。

可以通过实现ApplicationEventMulticaster (请参阅Javadoc )及其底层(辅助)类层次结构来实现替代通知策略。 通常,您使用基于JMS的通知机制(如David已建议的那样)或附加到Spring的TaskExecuter抽象(请参阅Javadoc )。

Spring本身(AFAIK)同步工作,但你可以做的是创建自己的ApplicationListener代理 – 一个实现这个接口的类,但不是处理事件,它只是通过发送到另一个(或新的)线程来委派它,发送JMS消息等

尝试在resources.groovy中覆盖ApplicationEventMulticaster bean,以便它使用线程池:

这样的事情对我有用,即我用过

 import java.util.concurrent.* import org.springframework.context.event.* beans = { applicationEventMulticaster(SimpleApplicationEventMulticaster) { taskExecutor = Executors.newCachedThreadPool() } }