java - 如何使用 spring 配置异步和同步事件发布者

标签 java spring asynchronous

我正在尝试使用spring events 实现一个事件框架。我知道spring 事件框架的默认行为是同步的。但是在 spring 上下文初始化期间,如果它找到一个 id 为 applicationEventMulticaster 的 bean,它的行为是异步的。

现在我想在我的应用程序中同时拥有同步和异步事件发布者,因为某些事件需要同步发布。我尝试使用 SysncTaskExecutor 配置同步事件多播器,但我找不到将其注入(inject) AsyncEventPublisher 的 applicationEventPublisher 属性的方法。 我的spring配置文件如下

<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor" destroy-method="shutdown">
        <property name="corePoolSize" value="5" />
        <property name="maxPoolSize" value="10" />
        <property name="WaitForTasksToCompleteOnShutdown" value="true" />
    </bean>  

    <bean id="syncTaskExecutor" class="org.springframework.core.task.SyncTaskExecutor" />

    <bean id="customEventPublisher" class="x.spring.event.CustomEventPublisher" />
    <bean id="customEventHandler" class="x.spring.event.CustomEventHandler" />  
    <bean id="eventSource" class="x.spring.event.EventSource" /> 
    <bean id="responseHandler" class="x.spring.event.ResponseHandler" /> 
    <bean id="syncEventSource" class="x.spring.event.syncEventSource" /> 


    <bean id="applicationEventMulticaster" class="org.springframework.context.event.SimpleApplicationEventMulticaster">
        <property name="taskExecutor" ref="taskExecutor" />         
    </bean>    

    <bean id="syncApplicationEventMulticaster" class="org.springframework.context.event.SimpleApplicationEventMulticaster">
        <property name="taskExecutor" ref="syncTaskExecutor" />         
    </bean>    

谁能帮帮我?

最佳答案

我只需要自己解决这个问题。默认情况下,事件是异步发送的,除非你实现了一个标记接口(interface),在我的例子中,我称之为 SynchronousEvent。你的配置中也需要一个“执行者”(我省略了我的,因为它非常定制)。

@EnableAsync
@SpringBootConfiguration
public class BigFishConfig {

    @Autowired AsyncTaskExecutor executor;

    @Bean
    public ApplicationEventMulticaster applicationEventMulticaster() {
        log.debug("creating multicaster");
        return new SimpleApplicationEventMulticaster() {
            @Override
            public void multicastEvent(final ApplicationEvent event, @Nullable ResolvableType eventType) {
                ResolvableType type = eventType != null ? eventType : ResolvableType.forInstance(event);
                if (event instanceof PayloadApplicationEvent 
                        && ((PayloadApplicationEvent<?>) event).getPayload() instanceof SynchronousEvent) 
                    getApplicationListeners(event, type).forEach(l -> invokeListener(l, event));
                else 
                    getApplicationListeners(event, type).forEach(l -> executor.execute(() -> invokeListener(l, event)));
            }
        };
    }
...

关于java - 如何使用 spring 配置异步和同步事件发布者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26276009/

相关文章:

.net - 将重要代码转换为新的 .NET 异步模式 - 如何处理产量循环

java - 在 Jersey 2.x 中过滤器实现不起作用?

java - 如何在 Java 中将字符串评估为数组?

java - SuperCSV 的输出不可读?

java - Spring Security Role - 用户只能更改自己的数据吗?

javascript - 使用 jQuery 并行执行多个 promise 后等待完成

java - 无法从放心响应中获取 Json 对象(json 格式)

java - Firebase 实时数据库 long 值始终返回 0,即使它不是

java - Spring - 使用@Configurable 和@Value 注释用新运算符创建对象

Java NIO - 非阻塞 channel 与异步 channel