[스프링 3.0] @Async 사용하기
봄싹 사이트에서 스터디 개설/변경, 모임 개설/변경 시에 알림 서비스로 이메일, 구글 메신저, 트위터로 알림 메시지를 전송합니다. 그런데, 사용자가 많아지다보니 해당 작업을 완료하는데 걸리는 시간이 너무 길어졌습니다. 불편해졌죠. 사실 관리자 권한이 있는 사람들만 만드는거라, 스터디 참여자 입장에서는 그런 불편을 알 수가 없을테지만, 저희는 내부적으로 좀 불편해 하고 있었습니다.
그러던 중 보게 된 것이 바로 @Async.. 딱 원하던 기능입니다.
필요한 빈 설정은
<!-- ============================================================= -->
<!-- Spring 3.0 @Task @Async -->
<!-- ============================================================= -->
<task:annotation-driven executor="myExecutor" scheduler="myScheduler"/>
<task:executor id="myExecutor" />
<task:scheduler id="myScheduler" />
적용하려면, 원래 작업을 별도의 클래스로 빼내고 그것을 참조하도록 수정하는 것이 좋겠습니다. 안그럼 동작하질 않더라구요,
@Service
public class BeanService {
public void normal(){
System.out.println("===========================");
System.out.println(Thread.currentThread());
System.out.println("===========================");
System.out.println("do it");
this.more();
}
@Async
public void more() {
System.out.println("===========================");
System.out.println(Thread.currentThread());
System.out.println("===========================");
System.out.println("more");
}
}
예를 들어, 위와 같은 경우 normal() 내부에서 more()를 호출할 경우에는 @Async가 적용되지 않습니다.
more()를 직접 호출할 떄는 적용됩니다.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class AsyncAnnoTest {
@Autowired BeanService beanService;
@Test
public void async(){
assertThat(beanService, is(notNullValue()));
beanService.normal();
beanService.more();
}
}
대충 만든 테스트로 돌려보면 다음과 같은 결과를 볼 수 있습니다.