1、配置pom文件
此过程可以使用spring start project选择需要的web、和rabbitMQ模块快速构建
最终pom.xml如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.whwe</groupId>
<artifactId>rabbitmq-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>rabbitmq-demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2、配置编写配置文件
server:
port: 9001
spring:
application:
rabbitmq:
host: 192.168.20.129
port: 5672
username: guest
password: guest
virtualHost: /
3、声明交换机、队列等配置信息
package com.whwe.rabbitmqdemo.config;
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @ClassName RabbitmqConfig
* @Description TODO
* @Author yueyiming
* @Date 2019/4/26 16:24
* @Version 1.0
* https://blog.csdn.net/hzau_itdog
**/
@Configuration
public class RabbitmqConfig {
//对列名称
public static final String QUEUE_INFORM_EMAIL = "queue_inform_email";
public static final String QUEUE_INFORM_SMS = "queue_inform_sms";
//交换机
public static final String EXCHANGE_TOPICS_INFORM = "exchange_topics_inform";
//声明队列
@Bean(QUEUE_INFORM_EMAIL)
public Queue QUEUE_INFORM_EMAIL() {
return new Queue(QUEUE_INFORM_EMAIL);
}
@Bean(QUEUE_INFORM_SMS)
public Queue QUEUE_INFORM_SMS() {
return new Queue(QUEUE_INFORM_SMS);
}
//声明交换机
@Bean(EXCHANGE_TOPICS_INFORM)
public Exchange exchange() {
return ExchangeBuilder.topicExchange(EXCHANGE_TOPICS_INFORM).durable(true).build();
}
//绑定队列和交换机
@Bean
public Binding binding_email(@Qualifier(EXCHANGE_TOPICS_INFORM) Exchange exchange, @Qualifier(QUEUE_INFORM_EMAIL) Queue queue) {
return BindingBuilder.bind(queue).to(exchange).with("inform.sms.email").noargs();
}
}
使用rabbitTemplate发送消息
@RestController
public class TestController {
@Autowired
private RabbitTemplate rabbitTemplate;
@RequestMapping("/test")
public String test(){
rabbitTemplate.convertAndSend(RabbitmqConfig.EXCHANGE_TOPICS_INFORM,"inform.sms.email","发了消息");
return"success";
}
}
编写消费者
package com.whwe.rabbitmqdemo.config;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import java.io.UnsupportedEncodingException;
/**
* @ClassName ConsumerRabbit
* @Description TODO
* @Author yueyiming
* @Date 2019/4/28 9:48
* @Version 1.0
* https://blog.csdn.net/hzau_itdog
**/
@Component
public class ConsumerRabbit {
@RabbitListener(queues = {RabbitmqConfig.QUEUE_INFORM_EMAIL})
public void receiveMsg(String msg, Message message, Channel channel) throws UnsupportedEncodingException {
System.out.println(msg);
System.out.println(message.getBody());
System.out.println(new String(message.getBody(),"utf-8"));
}
}
启动访问 http://127.0.0.1:9001/test
发现如下错误
com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - inequivalent arg 'auto_delete' for queue 'queue_inform_sms' in vhost '/': received 'false' but current is 'true', class-id=50, method-id=10)
at com.rabbitmq.client.impl.ChannelN.asyncShutdown(ChannelN.java:516) ~[amqp-client-5.4.3.jar:5.4.3]
at com.rabbitmq.client.impl.ChannelN.processAsync(ChannelN.java:346) ~[amqp-client-5.4.3.jar:5.4.3]
at com.rabbitmq.client.impl.AMQChannel.handleCompleteInboundCommand(AMQChannel.java:178) ~[amqp-client-5.4.3.jar:5.4.3]
at com.rabbitmq.client.impl.AMQChannel.handleFrame(AMQChannel.java:111) ~[amqp-client-5.4.3.jar:5.4.3]
at com.rabbitmq.client.impl.AMQConnection.readFrame(AMQConnection.java:670) ~[amqp-client-5.4.3.jar:5.4.3]
at com.rabbitmq.client.impl.AMQConnection.access$300(AMQConnection.java:48) ~[amqp-client-5.4.3.jar:5.4.3]
at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:597) ~[amqp-client-5.4.3.jar:5.4.3]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_202]
原因是vhost的权限并未设置
使用如下命令
rabbitmqctl set_permissions -p / guest "." "." "."