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");
//메시지
}
}