반응형

Event Handling in Spring


(원문 위치 : http://www.tutorialspoint.com/spring/event_handling_in_spring.htm )

우리는 Spring의 core가 ApplicationContext라는 걸 앞에서 보아왔다. 이것은 bean의 완벽한 life cycle을 관리한다. ApplicationContext는 bean loading시 어떠한 형태의 event를 발생시킨다.(publish) 예를 들면, ContextStartedEvent는 context가 시작되었을때 발생되고, ContextStoppedEvent는 context가 중단되었을 때 발생한다.

ApplicationContext에서 event handling은 ApplicationEvent class와 ApplicationListener interface를 통해 제공된다. 그래서 bean이 ApplicationListener를 구현하면, ApplicationEvent가 ApplicationContext로 발생되는 매번, bean이 이것을 알게된다.

Spring은 아래와 같은 표준 event를 제공한다.
S.N.Spring Built-in Events & Description
1

ContextRefreshedEvent

ApplicationContext가 초기화 또는 갱신(refresh)되면 발생한다. 이 event는 ConfigurableApplicationContext interface의 refresh()함수를 사용하여 발생시킬 수 있다.

2

ContextStartedEvent

ConfigurableApplicationContext interface의 start() 함수를 사용하여  ApplicationContext가 실행되어지면 발생한다. 이것으로 database를 점검(poll)하거나 이 event를 수신한 이후 어떤 정지(stop)된 프로그램을 시작/재시작할 수 있다.

3

ContextStoppedEvent

ConfigurableApplicationContext interface의 stop() 함수를 사용하여 ApplicationContext가 정되었을 때 발생한다. 이 event 수신 이후 필요한 정리작업(housekeep work)를 할 수 있다.

4

ContextClosedEvent

ConfigurableApplicationContext interface의 close() 함수를 사용하여 ApplicationContext가 종료(close)되었을 때 발생한다. 종료된 context는 lifecycle의 끝에 도달한다 - 이것은 갱신 혹은 재시작할 수 없다.

5

RequestHandledEvent

제공한다 HTTP request가 서비스되어졌다는 것을 모든 bean에게 알려주는 web한정(web-specific) event이다.

Spirng의 event handling은 single-thread이다. 따라서 만약 event가 발생하면, 모든 수신자가 그 메시지를 받지않는한 프로세서는 block되고 더이상 진행되지 않을 것이다. 따라서 event를 사용하는 프로그램 설계시 주의해야 한다.

Listening to Context Events:

context event를 수신(listen)하기 위해서는 bean은 'onApplicationEvent()' 함수 단 하나를 갖는 ApplicationListener interface를 구현해야 한다. event가 어떻게 전파되고 코드에 특정 event에 기초한 작업을 하도록 하는 예제를 보자.

[003] HelloWorld Example 강좌를 참고하여 프로젝트를 생성한다.

HelloWorld.java:

package com.tutorialspoint;

public class HelloWorld {
   private String message;

   public void setMessage(String message){
      this.message  = message;
   }

   public void getMessage(){
      System.out.println("Your Message : " + message);
   }
}

CStartEventHandler.java: AppicationListener interface를 구현하였다 - <ContextStartedEvent>에 의해 위 표준 event중  'ContextStartedEvent'를 수신하게 된다.

package com.tutorialspoint;

import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextStartedEvent;

public class CStartEventHandler 
   implements ApplicationListener<ContextStartedEvent>{

   public void onApplicationEvent(ContextStartedEvent event) {
      System.out.println("ContextStartedEvent Received");
   }
}

CStopEventHandler.javaAppicationListener interface를 구현하였다 - <ContextStoppedEvent>에 의해 위 표준 event중  'ContextStoppedEvent'를 수신하게 된다.

package com.tutorialspoint;

import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextStoppedEvent;

public class CStopEventHandler 
   implements ApplicationListener<ContextStoppedEvent>{

   public void onApplicationEvent(ContextStoppedEvent event) {
      System.out.println("ContextStoppedEvent Received");
   }
}

MainApp.javaApplicationContext가 아닌 ConfigurableApplicationContext를 이용하고 있음에 주의하라. context생성 후 context.start()/stop()에 의해 event가 발생한다.

package com.tutorialspoint;

import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
   public static void main(String[] args) {
      ConfigurableApplicationContext context = 
      new ClassPathXmlApplicationContext("Beans.xml");

      // Let us raise a start event.
      context.start();
	  
      HelloWorld obj = (HelloWorld) context.getBean("helloWorld");

      obj.getMessage();

      // Let us raise a stop event.
      context.stop();
   }
}

Beans.xml:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

   <bean id="helloWorld" class="com.tutorialspoint.HelloWorld">
      <property name="message" value="Hello World!"/>
   </bean>

   <bean id="cStartEventHandler" 
         class="com.tutorialspoint.CStartEventHandler"/>

   <bean id="cStopEventHandler" 
         class="com.tutorialspoint.CStopEventHandler"/>

</beans>

실행 결과는 다음과 같다.

ContextStartedEvent Received
Your Message : Hello World!
ContextStoppedEvent Received











반응형

+ Recent posts