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

我正在尝试使用spring事件实现事件框架,后来我知道spring事件框架的默认行为是sync.但是在春季上下文初始化期间,如果它找到ID为applicationEventMulticaster的bean,则其行为为Async.

现在,我希望在我的应用程序中同时具有同步和异步事件发布者,因为某些事件需要同步发布.我尝试使用SysncTaskExecutor配置同步事件多播程序,但找不到将其注入到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>    

有人可以帮我从这里出去吗 ?

最佳答案
不,您不能这样做,spring initApplicationEventMulticaster只能初始化一个,而BeanName必须是applicationEventMulticaster.因此您可以选择以下执行器之一:

 -org.springframework.core.task.SyncTaskExecutor

 -org.springframework.core.task.SimpleAsyncTaskExecutor

 -您自己的执行器:org.springframework.scheduling.concurrent.ThreadPoolTask​​Executor

无论如何,您都可以修改org.springframework.context.event.SimpleApplicationEventMulticaster
添加逻辑,然后您可以控制是否需要同步/异步

    /**
 * Initialize the ApplicationEventMulticaster.
 * Uses SimpleApplicationEventMulticaster if none defined in the context.
 * @see org.springframework.context.event.SimpleApplicationEventMulticaster
 */
protected void initApplicationEventMulticaster() {
    ConfigurableListableBeanFactory beanFactory = getBeanFactory();
    if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
        this.applicationEventMulticaster =
                beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
        if (logger.isDebugEnabled()) {
            logger.debug("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");
        }
    }
    else {
        this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
        beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
        if (logger.isDebugEnabled()) {
            logger.debug("Unable to locate ApplicationEventMulticaster with name '" +
                    APPLICATION_EVENT_MULTICASTER_BEAN_NAME +
                    "': using default [" + this.applicationEventMulticaster + "]");
        }
    }
}

转载注明原文:java-如何使用Spring配置异步和同步事件发布者 - 代码日志