복붙노트

[SPRING] 봄을 사용하여 비동기 및 동기화 이벤트 게시자를 구성하는 방법

SPRING

봄을 사용하여 비동기 및 동기화 이벤트 게시자를 구성하는 방법

봄 이벤트를 사용하여 이벤트 프레임 워크를 구현하려고합니다. 봄 이벤트 프레임 워크의 기본 동작이 동기화되어 있다는 것을 알게되었습니다. 그러나 스프링 컨텍스트 초기화 중에 id가 applicationEventMulticaster 인 Bean을 찾으면 비동기로 동작합니다.

이제 일부 응용 프로그램에서 동기화 및 비동기 이벤트 게시자가 필요합니다. 일부 이벤트는 동기화 게시해야하기 때문입니다. SysncTaskExecutor를 사용하여 멀티 캐스터 동기화 이벤트를 구성하려고 시도했지만이를 내 AsyncEventPublisher의 applicationEventPublisher 속성에 삽입하는 방법을 찾을 수 없습니다. 내 봄 구성 파일은 아래와 같습니다.

<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>    

누구든지 나를 도울 수 있습니까?

해결법

  1. ==============================

    1.아니, 그럴 수 없어, initApplicationEventMulticaster는 단지 하나만 초기화하고 BeanName은 applicationEventMulticaster 여야합니다. 그래서 당신은 아래 중 하나를 선택할 수 있습니다. Executor :

    아니, 그럴 수 없어, initApplicationEventMulticaster는 단지 하나만 초기화하고 BeanName은 applicationEventMulticaster 여야합니다. 그래서 당신은 아래 중 하나를 선택할 수 있습니다. 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 + "]");
            }
        }
    }
    
  2. ==============================

    2.나는 stackoverflow와 편집을 위해 좋지 않다. 용서해주세요.

    나는 stackoverflow와 편집을 위해 좋지 않다. 용서해주세요.

    나는 당신이 잘 알 수있는 코멘트를 추가 할 필요가 없다. 이 동기화됩니다. 이 Executor는 작업을 순차적으로 실행하고 모든 작업에 대해 차단합니다.

     public class SyncTaskExecutor implements TaskExecutor, Serializable {
    
    /**
     * Executes the given {@code task} synchronously, through direct
     * invocation of it's {@link Runnable#run() run()} method.
     * @throws IllegalArgumentException if the given {@code task} is {@code null}
     */
    @Override
    public void execute(Runnable task) {
        Assert.notNull(task, "Runnable must not be null");
        task.run();
    }
    

    }

    이 클래스는 매우 크기 때문에 코드 섹션 만 선택합니다. threadFactory를 주면 (자),이 팩토리로부터 Thread를 취득하는지, 새로운 Thread를 작성합니다.

        protected void doExecute(Runnable task) {
        Thread thread = (this.threadFactory != null ? this.threadFactory.newThread(task) : createThread(task));
        thread.start();
    }
    

    이 클래스는 jdk5의 현재 pkg ThreadPoolTaskExecutor를 사용합니다. 스프링은 기능을 캡슐화합니다. Spring은 이런 식으로 훌륭하다. jdk6의 현재와 jdk7 '현재 pkg는 약간의 차이가있다. ThreadPool에서 Thread를 가져와 다시 사용하고 모든 작업을 비동기 적으로 실행합니다. 자세한 내용을 알고 싶으면 JKD 소스 코드를 참조하십시오.

  3. ==============================

    3.나는 튜토리얼 아래에서 시도 :

    나는 튜토리얼 아래에서 시도 :

    https://www.keyup.eu/en/blog/101-synchronous-and-asynchronous-spring-events-in-one-application

    그것은 동기화 및 비동기 멀티 캐스터를 만드는 데 도움이되고 이들에 대한 래퍼를 만듭니다. 래퍼 클래스 (DistributiveEventMulticaster)의 이름이 applicationEventMulticaster인지 확인하십시오.

  4. from https://stackoverflow.com/questions/26276009/how-to-configure-async-and-sync-event-publishers-using-spring by cc-by-sa and MIT license