Programing/JAVA

Jedis subscribe 구현 시 다음 로직 실행 안되는 문제

리커니 2019. 11. 5. 17:28
반응형

 

Jedis subscribe 구현 시 다음 로직 실행 안되는 문제

 

단일로 subscribe 할 경우에는 아무 문제 없이 잘 수행됩니다.

하지만, 2개 이상의 subscribe를 하거나 별도의 로직을 subscribe 다음에 구현 할 때는 문제가 발생합니다.

 

아래서 예시로 들 내용 이전에 아래의 Link를 참고하세요.

 

Link : SpringBoot Redis(Jedis) 활용 Publish/Subscribe pub/sub 구현 방법

 

SpringBoot Redis(Jedis) 활용 Publish/Subscribe pub/sub 구현 방법

SpringBoot Redis(Jedis) 활용 Publish/Subscribe pub/sub 구현 방법 [Spec] IDE : Eclipse Mars.2 Release (4.5.2) SpringBoot : 2.0.2.RELEASE Jedis : 2.9.0 Dependency Tool : Gradle 참고! Redis는 특정서버..

aljjabaegi.tistory.com

 

 

[@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();
}

 

반응형