Programing/JAVA
Jedis subscribe 구현 시 다음 로직 실행 안되는 문제
리커니
2019. 11. 5. 17:28
반응형
Jedis subscribe 구현 시 다음 로직 실행 안되는 문제
단일로 subscribe 할 경우에는 아무 문제 없이 잘 수행됩니다.
하지만, 2개 이상의 subscribe를 하거나 별도의 로직을 subscribe 다음에 구현 할 때는 문제가 발생합니다.
아래서 예시로 들 내용 이전에 아래의 Link를 참고하세요.
Link : SpringBoot Redis(Jedis) 활용 Publish/Subscribe pub/sub 구현 방법
[@SpringBootApplication 중간 로직]
try{
SubServer server1 = ctx.getBean(SubServer.class);
server1.start();
System.out.println("첫번째 서버 실행");
}catch(Exception e) {
LOGGER.error("SIP Server Starting Error", e);
}
try{
SubServer server2 = ctx.getBean(SubServer.class);
server2.start();
System.out.println("두번째 서버 실행");
}catch(Exception e) {
LOGGER.error("CoAP Server Starting Error", e);
}
위와 같은 코드가 있다고 합시다.
2개의 class에 start 메소드는 같은 형태 입니다.
[start method]
public void start(){
try {
CommonGlobalVariable.jedis.getResource().subscribe(new JedisPubSub() {
@Override
public void onMessage(String channel, String message) {
System.out.println(channel);
System.out.println(message);
}
}, 체널명);
} catch (Exception e) {
LOGGER.error("Redis subscribe Error!!!", e);
}
}
위의 어플리케이션을 실행하면, 첫 번째 서버만 실행이 되고,
두번째 서버는 동작하지 않습니다.
멀티 로직을 수행하기 위해서는 start 메소드를 Thread로 처리해 주어야 합니다.
[예시 첫번째]
public void start(){
JedisPubSub sub = new JedisPubSub() {
@Override
public void onMessage(String channel, String message) {
System.out.println(channel);
System.out.println(message);
}
};
new Thread(new Runnable() {
@Override
public void run() {
Jedis jedis = CommonVariable.jedis.getResource();
try {
jedis.subscribe(sub, 체널명);
} catch (Exception e) {
LOGGER.error("Jedis Subscribe Error", e);
}finally {
if(jedis!=null) jedis.close();
}
}
}).start();
}
[예시 두번째]
public void start(){
new Thread(new Runnable() {
@Override
public void run() {
CommonVariable.jedis.getResource().subscribe(new JedisPubSub() {
@Override
public void onMessage(String channel, String message) {
try {
System.out.println(channel);
System.out.println(message);
} catch (Exception e) {
LOGGER.error("Jedis Subscribe Error", e);
}
}
}, 체널명);
}
}).start();
}
반응형