구아바의 Concurrency중에 AbstractService라는게 있는데 일단 Concurrency(컨커런시)는 뭔가 계속 떠있는 것을 의미한
스프링 앱을 만들어서 서버에 올린다는 것은 올린 스프링앱이 죽지않고 서버에 계속 떠있으면서 24/7로 죽지 않고 뭔가를 계속 하도록 만들기 위해서이다.
이를테면 사용자의 api request를 받는다던지, 1초에 한번씩 db에 select를 날려서 변경을 감지한다던지 등 주로 이런 작업이다.
그럴려면 뭔가 띄워야 하는데 대체로 자바에서는 Thread를 띄운다. 그런데 이 Thread를 좀 더 관리하기 쉽게 띄울려면 구아바의 AbstractService
를 사용한다.
컨커런시(Concurrency)는 구글에 찾아보면 패러럴(Paraller)하고 비교하는게 나오는데 아래 짤을 보면 차이점을 짐작 해볼 수 있다.
일단 AbstractService를 extends한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import com.google.common.util.concurrent.AbstractService; @Service public class StreamEngine2 extends AbstractService { @Override protected void doStart() { } @Override protected void doStop() { } } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | import com.google.common.util.concurrent.AbstractService; import org.springframework.context.SmartLifecycle; import org.springframework.stereotype.Service; @Service public class StreamEngine2 extends AbstractService implements SmartLifecycle { @Override protected void doStart() { } @Override protected void doStop() { } @Override public boolean isAutoStartup() { return false; } @Override public void stop(Runnable callback) { } @Override public void start() { } @Override public void stop() { } @Override public int getPhase() { return 0; } } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | import com.google.common.util.concurrent.AbstractService; import lombok.extern.slf4j.Slf4j; import org.springframework.context.SmartLifecycle; import org.springframework.stereotype.Service; @Service @Slf4j public class StreamEngine2 extends AbstractService implements SmartLifecycle { @Override protected void doStart() { } @Override protected void doStop() { } @Override public boolean isAutoStartup() { return true; } @Override public void stop(Runnable callback) { } @Override public void start() { log.info("hello"); } @Override public void stop() { } @Override public int getPhase() { return 0; } } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | import com.google.common.util.concurrent.AbstractService; import lombok.extern.slf4j.Slf4j; import org.springframework.context.SmartLifecycle; import org.springframework.stereotype.Service; @Service @Slf4j public class StreamEngine2 extends AbstractService implements SmartLifecycle { @Override protected void doStart() { log.info("---doStart()---"); } @Override protected void doStop() { } @Override public boolean isAutoStartup() { return true; } @Override public void stop(Runnable callback) { } @Override public void start() { log.info("hello"); this.startAsync(); } @Override public void stop() { } @Override public int getPhase() { return 0; } } | cs |
그 다음에 할 것은 AbstractService를 실행 해주기 위해서 start() method에 this.startAsync();를 실행 한다.
이제 스프링 부트 앱을 띄우면 아래와 같은 결과가 나온다.
결과
hello ---doStart()--- |
'Language > JAVA' 카테고리의 다른 글
java 파일로 저장하기, 한줄씩 불러오기 (0) | 2018.05.29 |
---|---|
java 랜덤 1~5까지 10개 만들기 (0) | 2018.05.25 |
Spring Boot에서 Bean Service를 띄울 때 구아바 AbstractService자동으로 띄우기 (0) | 2018.05.11 |
LMAX Disruptor 튜터리얼 (0) | 2018.05.10 |
java uuid만들기 (0) | 2018.05.09 |
Spring Boot DynamoDb연동하기 (0) | 2018.05.08 |