Spring AMQP

2020. 4. 19. 22:14Spring Micro Services/RabbitMQ

반응형

Spring Boot에서 Spring AMQP 를 이용하여서 Producer와 Consumer를 구현해 보도록 하겠다.

 

전체적인 프로젝트소스는 아래 사이트에서 다운받으시면 됩니다.

소스: https://github.com/roopy1210/springboot-mvc-rabbitmq/tree/master/springboot-mvc-rabbitmq

 

프로젝트 설정

메이븐 모듈 프로젝트로 설정한다.

프로젝트 구조는 아래와 같다.

 

 

PRODUCER

Exchage Type과 Queue 설정을 위한 환경설정 클래스인 RabbitMQConfig.java 프로그램을 작성한다.

package com.roopy.producer.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitMQConfig {

	@Bean
	public Queue queue() {
		return new Queue(Constants.QUEUE_NAME, false);
	}
	
	@Bean
	public DirectExchange exchange() {
		return new DirectExchange(Constants.EXCHANGE_NAME);
	}

	
	@Bean
	Binding binding(Queue queue, DirectExchange exchange) {
		return BindingBuilder.bind(queue).to(exchange).with(Constants.QUEUE_NAME);
	}

}

 

RabbitTemplate을 이용하여 메세지 전송을 하기위한 ProducerService.java 프로그램을 작성한다.

package com.roopy.producer.service;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.roopy.producer.config.Constants;

@Service
public class ProducerService {
	
	private final Logger LOGGER = LoggerFactory.getLogger(this.getClass());
	
	@Autowired
	private RabbitTemplate rabbitTemplate;
	
	public void sayHello(String name) {
		String message = "Hello, " + name + "!";
		
		rabbitTemplate.convertAndSend(Constants.EXCHANGE_NAME, Constants.QUEUE_NAME, message);
		LOGGER.debug("[x] Sent {} : {}", Constants.QUEUE_NAME, message);
	}
	
}

 

마지막으로 사용자가 RestAPI를 통하여서 호출 할 수 있도록 ProducerController.java 프로그램을 작성한다.

package com.roopy.producer.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.roopy.producer.service.ProducerService;

@RestController
public class ProducerController {
	
	@Autowired
	private ProducerService service;
	
	@RequestMapping("/hello/{name}")
	public String hello(@PathVariable String name) {
		
		service.sayHello(name);
		
		return "Hello, " + name + "!";
		
	}
	
}

 

CONSUMER

RabbitListener를 이용하여서 메세지를 수신할 수 있도록 ConsumerApplication.java 프로그램을 작성한다.

package com.roopy.consumer;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import com.roopy.consumer.config.Constants;

@SpringBootApplication
public class ConsumerApplication {
	
	private final Logger LOGGER = LoggerFactory.getLogger(this.getClass());
	
	public static void main(String[] args) {
		SpringApplication.run(ConsumerApplication.class, args);
	}
	
	@RabbitListener(queues = Constants.QUEUE_NAME)
	public void receiveMessage(String msg) {
		LOGGER.info("[x] Received {}", msg);
	}
}

 

 

프로젝트 실행

 

PRODUCER 실행

ProducerApplication을 실행한다.

브라우저에서 아래의 그림과 같이 실행한다.

 

CONSUMER 실행전에 실제로 Exchange와 Queue가 생성되었는지 확인해보자

 

Exchange 생성확인

Queue 생성확인

 

Queue 메세지확인

위의 Queue 목록에서 hello를 누르면 아래의 그림과 같이 Producer에서 생성한 메세지를 확인 할 수 있다.

 

 

Consumer 실행

ConsumerApplication을 실행한다.

위에서 확인한데로 hello Queue에 있는 메세지가 전송되는 것을 확인 할 수 있다.

 

지금 까지 RabbitMQ에 대해서 살펴보았다.

처음에 Get Started를 통해서 전반적인 개념을 이해하고 Spring 에서 구현해보니 왜 이렇게 구현되었는지 얼마나 편하게 구현 할 수 있는지 느끼게 되었다.

Spring Framework이 편리하게 되어 있지만 기본적인 개념을 이해하는것도 많이 중요한거 같다.

반응형

'Spring Micro Services > RabbitMQ' 카테고리의 다른 글

Topic  (0) 2020.04.19
Routing  (0) 2020.04.19
Publish/Subscribe  (0) 2020.04.19
Work Queues  (0) 2020.04.19
Hello World  (0) 2020.04.19