Hello

Java Service Bus 사용 본문

azure

Java Service Bus 사용

nari0_0 2020. 11. 30. 21:34
728x90

Service Bus는 MS 에서 제공하는 메시지 broker다.

메시지 broker는 송신자의 메시지 프로토콜로부터의 메시지를 수신자의 메시지 프로토콜로 변환하는 중간 컴퓨터 프로그램 모듈이다. 수신자와 송신자 사이에서 중재 역할을 해준다.

 

service bus는 queue 와 topic 두개의 네임스페이스를 지원한다.

- queue는 수신자와 송신자 1:1로 이루어져 있으며 수신 어플리케이션이 처리 할 수 있을 때 까지 메시지를 저장한다.

- topic은 여러개의 수신자(구독)으로 구성이 가능하며 메시지의 복사본을 수신할 수 있다.

 

 

 

여러개의 어플리케이션에 메시지를 보내기 위해 topic을 사용했다.

topic은 수신하기 위해 SubscriptionClient를 사용한다. 메시지 수신을 위한 코드 작성입니다.

Service Bus 에서 메시지를 수신받아 특정 조건에 맞다면 reload()를 할 수 있도록 작성했다.
메시지 작성 시 label 필드를 사용해 key를 담아 전송한다.
IMessage 객체에서 필요한 값을 꺼내 label이 reload로 작성된 메시지만 reload 메소드를 호출 할 수 있도록 했다.
@Configration
public class SubscriptionConfig{
	
    @Value("${message.connectionstring}")
    private String connectString;
    
    @Value("${message.topic}")
    private String topic;
    
    @Value("${message.subscription}")
    private String subscription;
    
    @Autowrite
    private SomeService service;
    private ExecutorService executorService = Executors.newCachedThreadPool();
    
	@Bean
	SubscriptionClient subscriptionClient(){
    	//통신을 위한 client 작성
		SubscriptionClient client = new SubscriptionClient(
        	new ConnectionStringBuilder(
            	connectString,
                topic + "/subscriptions/" + subscription
            ), ReceiveMode.PEEKLOCK);
            
            client.registerMessageHandler(new IMessageHandler() {
				@Override
				public CompletableFuture<Void> onMessageAsync(IMessage message) {
					//메시지 수신 후 동작 code 작성...
					if(message.getLabel().equals("reload")){
						service.reload();
					}
					return receiveClient.completeAsync(message.getLockToken());
				}

			public void notifyException(Throwable throwable, ExceptionPhase exceptionPhase) {
				logger.info("exceptionPhase => {}",exceptionPhase);
				logger.info("exception => {}",throwable);
				throw new RuntimeException(throwable)
			}
		}, new MessageHandlerOptions(1,false,Duration.ofMinutes(1L)),executorService);
	}
}

 

 

728x90