diff --git a/Springboot-RabbitMQ/README.MD b/Springboot-RabbitMQ/README.MD new file mode 100644 index 0000000000000000000000000000000000000000..5df32735348bf08d74f6d5a5d8b5217d8205e0ee --- /dev/null +++ b/Springboot-RabbitMQ/README.MD @@ -0,0 +1 @@ +# 本案例实现SpringBoot整合RabbitMq \ No newline at end of file diff --git a/Springboot-RabbitMQ/pom.xml b/Springboot-RabbitMQ/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..539c82ec8b13acd1dba26ccb321d7138d81dee75 --- /dev/null +++ b/Springboot-RabbitMQ/pom.xml @@ -0,0 +1,58 @@ + + 4.0.0 + com.button + Springboot-RabbitMQ + 0.0.1-SNAPSHOT + jar + + SpringBoot整合Rabbitmq + + UTF-8 + UTF-8 + 1.8 + + + org.springframework.boot + spring-boot-starter-parent + 2.0.1.RELEASE + + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-amqp + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-devtools + true + true + + + + + + org.springframework.boot + spring-boot-maven-plugin + + -Dfile.encoding=UTF-8 + true + + + + + + \ No newline at end of file diff --git a/Springboot-RabbitMQ/src/main/java/com/button/boot/rabbitmq/SpringBootRabbitMqApplication.java b/Springboot-RabbitMQ/src/main/java/com/button/boot/rabbitmq/SpringBootRabbitMqApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..465710ea479b910ba220e6592b92dd77b008a7e1 --- /dev/null +++ b/Springboot-RabbitMQ/src/main/java/com/button/boot/rabbitmq/SpringBootRabbitMqApplication.java @@ -0,0 +1,11 @@ +package com.button.boot.rabbitmq; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringBootRabbitMqApplication { + public static void main(String[] args) { + SpringApplication.run(SpringBootRabbitMqApplication.class, args); + } +} diff --git a/Springboot-RabbitMQ/src/main/java/com/button/boot/rabbitmq/config/RabbitMqConfigure.java b/Springboot-RabbitMQ/src/main/java/com/button/boot/rabbitmq/config/RabbitMqConfigure.java new file mode 100644 index 0000000000000000000000000000000000000000..0560ac0b658980eb0f412ce20a8db88a0e047fa0 --- /dev/null +++ b/Springboot-RabbitMQ/src/main/java/com/button/boot/rabbitmq/config/RabbitMqConfigure.java @@ -0,0 +1,77 @@ +package com.button.boot.rabbitmq.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.amqp.rabbit.connection.CachingConnectionFactory; +import org.springframework.amqp.rabbit.connection.ConnectionFactory; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; + +@Configuration +public class RabbitMqConfigure { + + @Value("${spring.rabbitmq.host}") + private String host; + + @Value("${spring.rabbitmq.port}") + private int port; + + @Value("${spring.rabbitmq.username}") + private String username; + + @Value("${spring.rabbitmq.password}") + private String password; + + public static final String EXCHANGE_A = "exchange_A"; + public static final String QUEUE_A = "QUEUE_A"; + public static final String ROUTINGKEY_A = "routingKey_A"; + + @Bean + public ConnectionFactory connectionFactory() { + CachingConnectionFactory connectionFactory = new CachingConnectionFactory(host, port); + connectionFactory.setUsername(username); + connectionFactory.setPassword(password); + connectionFactory.setVirtualHost("/"); + connectionFactory.setPublisherConfirms(true); + return connectionFactory; + } + + @Bean + @Scope("prototype") // 必须是prototype类型 + public RabbitTemplate rabbitTemplate() { + return new RabbitTemplate(connectionFactory()); + } + + /** + * 针对消费者配置 1. 设置交换机类型 2. 将队列绑定到交换机 + * + * FanoutExchange: 将消息分发到所有的绑定队列,无routingkey的概念 + * HeadersExchange :通过添加属性key-value匹配 + * DirectExchange:按照routingkey分发到指定队列 + * TopicExchange:多关键字匹配 + */ + @Bean + public DirectExchange defaultExchange() { + return new DirectExchange(EXCHANGE_A); + } + + /** + * 获取队列A + * + * @return + */ + @Bean + public Queue queueA() { + return new Queue(QUEUE_A, true); // 队列持久 + } + + @Bean + public Binding binding() { + return BindingBuilder.bind(queueA()).to(defaultExchange()).with(ROUTINGKEY_A); + } +} diff --git a/Springboot-RabbitMQ/src/main/java/com/button/boot/rabbitmq/manager/RabbitMqProducer.java b/Springboot-RabbitMQ/src/main/java/com/button/boot/rabbitmq/manager/RabbitMqProducer.java new file mode 100644 index 0000000000000000000000000000000000000000..d5f4e27a8fe74479e35978549e202be7b3014f1f --- /dev/null +++ b/Springboot-RabbitMQ/src/main/java/com/button/boot/rabbitmq/manager/RabbitMqProducer.java @@ -0,0 +1,45 @@ +package com.button.boot.rabbitmq.manager; + +import java.util.UUID; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.amqp.rabbit.support.CorrelationData; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.button.boot.rabbitmq.config.RabbitMqConfigure; + +@Component +public class RabbitMqProducer implements RabbitTemplate.ConfirmCallback { + private final Logger logger = LoggerFactory.getLogger(RabbitMqProducer.class); + // 由于rabbitTemplate的scope属性设置为ConfigurableBeanFactory.SCOPE_PROTOTYPE,所以不能自动注入 + private RabbitTemplate rabbitTemplate; + + /** + * 构造方法注入rabbitTemplate + */ + @Autowired + public void msgProducer(RabbitTemplate rabbitTemplate) { + this.rabbitTemplate = rabbitTemplate; + rabbitTemplate.setConfirmCallback(this); //rabbitTemplate如果为单例的话,那回调就是最后设置的内容 + } + + public void sendMsg(String content) { + CorrelationData correlationId = new CorrelationData(UUID.randomUUID().toString()); + // 把消息放入ROUTINGKEY_A对应的队列当中去,对应的是队列A + rabbitTemplate.convertAndSend(RabbitMqConfigure.EXCHANGE_A, RabbitMqConfigure.ROUTINGKEY_A, content, correlationId); + } + + @Override + public void confirm(CorrelationData correlationData, boolean ack, String cause) { + logger.info("消息回调id={}", correlationData); + if (ack) { + logger.info("消息成功消费"); + } else { + logger.info("消息消费失败,cause={}", cause); + } + } + +} diff --git a/Springboot-RabbitMQ/src/main/java/com/button/boot/rabbitmq/manager/RabbitMqReceiver.java b/Springboot-RabbitMQ/src/main/java/com/button/boot/rabbitmq/manager/RabbitMqReceiver.java new file mode 100644 index 0000000000000000000000000000000000000000..e35283e0212b242f9f58717a086c5bc383763046 --- /dev/null +++ b/Springboot-RabbitMQ/src/main/java/com/button/boot/rabbitmq/manager/RabbitMqReceiver.java @@ -0,0 +1,20 @@ +package com.button.boot.rabbitmq.manager; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.amqp.rabbit.annotation.RabbitHandler; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Component; + +import com.button.boot.rabbitmq.config.RabbitMqConfigure; + +@Component +@RabbitListener(queues = RabbitMqConfigure.QUEUE_A) +public class RabbitMqReceiver { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @RabbitHandler + public void process(String content) { + logger.info("接收到QUEUE_A中的消息. content={}", content); + } +} diff --git a/Springboot-RabbitMQ/src/main/resources/application.yml b/Springboot-RabbitMQ/src/main/resources/application.yml new file mode 100644 index 0000000000000000000000000000000000000000..bb88047accfdfa07587190af24e5e283732edd7a --- /dev/null +++ b/Springboot-RabbitMQ/src/main/resources/application.yml @@ -0,0 +1,16 @@ +server: + servlet: + context-path: /rabbit + port: 8080 + uri-encoding: utf-8 + +logging: + file: logback.xml + +#对于rabbitMQ的支持 +spring: + rabbitmq: + host: ***.***.***.**** + port: 5672 + username: admin + password: ********* \ No newline at end of file diff --git a/Springboot-RabbitMQ/src/main/resources/logback.xml b/Springboot-RabbitMQ/src/main/resources/logback.xml new file mode 100644 index 0000000000000000000000000000000000000000..2a8edfbb6a700fb95e3bcfc484f18a0c11ab8b52 --- /dev/null +++ b/Springboot-RabbitMQ/src/main/resources/logback.xml @@ -0,0 +1,31 @@ + + + + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -%msg%n + + + + ${LOG_HOME}/springboot_rabbitmq.log + + + ${LOG_HOME}/springboot_rabbitmq.log.%d{yyyy-MM-dd}.%i.log + + + 100MB + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{50} -%msg%n + + + + + + + + \ No newline at end of file diff --git a/Springboot-RabbitMQ/src/test/java/com/button/boot/rabbitmq/test/RabbitMqTest.java b/Springboot-RabbitMQ/src/test/java/com/button/boot/rabbitmq/test/RabbitMqTest.java new file mode 100644 index 0000000000000000000000000000000000000000..acc6901aa7b7d4062543ba6cf6f825a432971bc7 --- /dev/null +++ b/Springboot-RabbitMQ/src/test/java/com/button/boot/rabbitmq/test/RabbitMqTest.java @@ -0,0 +1,26 @@ +package com.button.boot.rabbitmq.test; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import com.button.boot.rabbitmq.manager.RabbitMqProducer; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class RabbitMqTest { + private static final Logger LOGGER = LoggerFactory.getLogger(RabbitMqTest.class); + + @Autowired + private RabbitMqProducer rabbitMqProducer; + @Test + public void test1() { + LOGGER.info("开始发送消息."); + rabbitMqProducer.sendMsg("SpringBoot整合RabbitMq"); + LOGGER.info("消息发送成功."); + } +}