카테고리 없음

[Spring] rabbitMQ

Journey Jeong 2023. 5. 31. 12:23

DoC : https://spring.io/guides/gs/messaging-rabbitmq/

 

 

[01. 프로젝트 생성] 

- webflux 는 비동기서버 별도 추가

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.1.0'
	id 'io.spring.dependency-management' version '1.1.0'
}

group = 'com.green'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-webflux'
	implementation 'org.springframework.boot:spring-boot-starter-amqp'
	compileOnly 'org.projectlombok:lombok'
	developmentOnly 'org.springframework.boot:spring-boot-devtools'
	annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testImplementation 'org.springframework.amqp:spring-rabbit-test'
}

tasks.named('test') {
	useJUnitPlatform()
}

[02. application.properties ] 

- host: 엔드포인트

- port: 번호 

- username 

- password

 

* RabbiMQ 사이트 접속하여, Queue & Exchange & Binding 하기 - RabbitMQ 웹 콘솔 링크 클릭하여 로그인 

- Queue 생성

 

- Exchange add

 

- Key Binding 

 

 

 

spring.rabbitmq.host=엔드포인트주소(~~.amazonaws.com)
spring.rabbitmq.port=5671(포트번호)
spring.rabbitmq.username=UserName
spring.rabbitmq.password=Password

spring.rabbitmq.template.default-receive-queue=myshop.message.queue(queue name) 
spring.rabbitmq.template.exchange=myshop.message(exchange name) 
spring.rabbitmq.template.routing-key=green.nowon.#(binding name) 

#기본적으로 amazon MQ에서는 SSL 을 지원하는 브로커로 생성됩니다. 
spring.rabbitmq.ssl.enabled=true

 

 

 

 

 

[03. Config class 생성]

 

 

1) 클래스에 아래 어노테이션 적용 

- @Configuration

- @EnableRabbit 

 

2) SimpleRabbitListenerContainerFactory

- @Bean 

@Bean
SimpleRabbitListenerContainerFactory simpleRabbitListenerContainerFactory(ConnectionFactory connectionFactory){
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
System.out.println(">>>>:"+ connectionFactory);
factory.setConnectionFactory(connectionFactory);
factory.setMessageConverter(messageConverter());
return factory;
}

 

3) MessageConverter

- @Bean 

@Bean
MessageConverter messageConverter() {
return new Jackson2JsonMessageConverter();
}

 

>>

package com.green.nowon.rabbit;

import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


//spring Boot 의 자동구성을 사용하여 ConnectionFactory, RabbitTemplate 생성 
@Configuration
@EnableRabbit
public class RabbitMQConfig {

	@Bean
	MessageConverter messageConverter() {
		return new Jackson2JsonMessageConverter();
	}
	
	@Bean
	SimpleRabbitListenerContainerFactory simpleRabbitListenerContainerFactory(ConnectionFactory connectionFactory){
		SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
		System.out.println(">>>>:"+ connectionFactory);
		factory.setConnectionFactory(connectionFactory);	
		factory.setMessageConverter(messageConverter());
		return factory;
	}
}

 

 

[04. 수신기 할 class 생성]

 

1) @component

- 클래스에 어노테이션 적용하기

2) @RabbitListener

- 수신할 메서드 생성하여 어노테이션 적용

- 어노테이션에 (queses = "${}") 

@RabbitListener(queues = "${spring.rabbitmq.template.default-receive-queue}")
public void receiveMessage(String message) {
System.out.println(">>>> 수신된 메시지: "+ message);
}

 

package com.green.nowon.rabbit;

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
public class Receiver {
	
	@RabbitListener(queues = "${spring.rabbitmq.template.default-receive-queue}")
	public void receiveMessage(MyMessage message) {
		System.out.println(">>>> 수신된 메시지: "+ message);
	}

}

 

 

 

 

[05. 발신기 만들기]

 

1) MyMessage

@Data
public class MyMessage {
	
	private String name;
	private String content;
}

 

2) 발신기 : Runner.class

 

package com.green.nowon.rabbit;

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
@Component
public class Runner implements CommandLineRunner{
	
	private final RabbitTemplate rabbitTemplate;
	
	@Value("${spring.rabbitmq.template.exchange}")
	private String exchange;
	
	 @Override
	  public void run(String... args) throws Exception {
		 System.out.println("메시지 발신 합니다!!!!!!!");
		 MyMessage message=new MyMessage();
		 message.setName(exchange);
		 message.setContent(exchange);
		 rabbitTemplate.convertAndSend(exchange,"green.nowon.hello","hello! RabbitMQ");
		 															//메시지
	  }
}