首先你要自己安装一个RabbitMQ,这里是安装包
由于RabbitMQ是用Erlang语言编写的,因此需要先安装Erlang。
https://www.rabbitmq.com/install-windows.html
https://www.erlang.org/downloads
下面进入正题
首先是pom文件
<!-- amqp -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
rabbit的配置类,这个类里面可以配置messageconverter等。这里可以根据自己的需要补充
package com.wc.www.ScBus.mq;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**默认支持SimpleMessageConverter,
* java.lang.IllegalArgumentException: SimpleMessageConverter only supports String, byte[]
* and Serializable payloads, received: com.wc.www.ScBus.entity.Teacher
* @author Administrator
*
*/
@Configuration
public class RabbitConfig {
@Bean
public Queue helloQueue() {
return new Queue("helloMQ"); //配置一个名称为"hello"的Queue队列
}
/*
* @Bean public RabbitListenerContainerFactory<?>
* rabbitListenerContainerFactory(ConnectionFactory connectionFactory){
* SimpleRabbitListenerContainerFactory factory = new
* SimpleRabbitListenerContainerFactory();
* factory.setConnectionFactory(connectionFactory);
* factory.setMessageConverter(new Jackson2JsonMessageConverter()); return
* factory; }
*/
}
发送消息的类,包括直接使用队列和使用exchange两种。
其中如果要传递对象,对象要实现序列化。
package com.wc.www.ScBus.mq;
import java.util.Date;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.wc.www.ScBus.entity.Teacher;
@Component
public class SendMsg {
@Autowired
private AmqpTemplate rabbitTemplate;
public void send() {
Teacher t = new Teacher();
t.setAge(1);
String context = "hello queue" + new Date();
System.out.println("Sender : " + context);
//直接使用queues
this.rabbitTemplate.convertAndSend("helloMQ", context);
//使用exChange topic.exchange topic
//Routing Key:路由关键字,exchange根据这个关键字进行消息投递
ObjectMapper mapper = new ObjectMapper();
String json = "";
try {
json = mapper.writeValueAsString(t);
} catch (JsonProcessingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(json);
this.rabbitTemplate.convertAndSend("topic.exchange", "key.1", json);
//传递的实体类需要实现序列化
this.rabbitTemplate.convertAndSend("topic.exchange", "obj.1", t);
//this.rabbitTemplate.convertAndSend("consumer_queue", "hello exchange");
}
}
传递的对象
package com.wc.www.ScBus.entity;
import java.io.Serializable;
public class Teacher implements Serializable{
/**
*
*/
private static final long serialVersionUID = 4583428875472650137L;
private int id;
private String name;
private int age;
private int project;
private int leader;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getProject() {
return project;
}
public void setProject(int project) {
this.project = project;
}
public int getLeader() {
return leader;
}
public void setLeader(int leader) {
this.leader = leader;
}
}
接受消息的类
package com.wc.www.ScBus.mq;
import java.util.Map;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.messaging.handler.annotation.Headers;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Component;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.wc.www.ScBus.entity.Teacher;
@Component
public class ConsumerMsg {
@RabbitListener(queues = "helloMQ")
@RabbitHandler
public void process(@Payload String hello, @Headers Map<String, Object> header) {
System.out.println("Receiver queue : " + hello);
if (header.size() > 0) {
for (Map.Entry<String, Object> entry : header.entrySet()) {
//System.out.println("key : " + entry.getKey() + " == " + "value : " + entry.getValue());
}
}
}
/**
* 三种类型的Exchanges:direct,fanout,topic,每个实现了不同的路由算法(routing algorithm):
Direct exchange:完全根据key进行投递的叫做Direct交换机。如果Routing key匹配, 那么Message就会被传递到相应的queue中。其实在queue创建时,它会自动的以queue的名字作为routing key来绑定那个exchange。例如,绑定时设置了Routing key为”abc”,那么客户端提交的消息,只有设置了key为”abc”的才会投递到队列。
Fanout exchange:不需要key的叫做Fanout交换机。它采取广播模式,一个消息进来时,投递到与该交换机绑定的所有队列。
Topic exchange:对key进行模式匹配后进行投递的叫做Topic交换机。比如符号”#”匹配一个或多个词,符号””匹配正好一个词。例如”abc.#”匹配”abc.def.ghi”,”abc.”只匹配”abc.def”。
* @param hello
* @param header
*/
@RabbitListener(bindings = @QueueBinding(
exchange = @Exchange(value = "topic.exchange",durable = "true",type = "topic"),
value = @Queue(value = "consumer_queue",durable = "true"),
key = "key.#"
))
@RabbitHandler
public void processExchange(@Payload String t, @Headers Map<String, Object> header) {
System.out.println("Receiver exchange : " + t);
if (header.size() > 0) {
for (Map.Entry<String, Object> entry : header.entrySet()) {
//System.out.println("key : " + entry.getKey() + " == " + "value : " + entry.getValue());
}
}
}
@RabbitListener(bindings = @QueueBinding(
exchange = @Exchange(value = "topic.exchange",durable = "true",type = "topic"),
value = @Queue(value = "consumer_queue",durable = "true"),
key = "obj.#"
))
@RabbitHandler
public void processObject(@Payload Teacher t, @Headers Map<String, Object> header) {
System.out.println("Receiver exchange : " + t.getAge());
if (header.size() > 0) {
for (Map.Entry<String, Object> entry : header.entrySet()) {
//System.out.println("key : " + entry.getKey() + " == " + "value : " + entry.getValue());
}
}
}
}
一个调用MQ方法的接口
package com.wc.www.ScBus.mq;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@RequestMapping("/rabbitMQ")
@Controller
public class MQDemo {
@Autowired
private SendMsg sender;
@RequestMapping("/test")
public void hello() throws Exception {
sender.send();
}
}
完成上面的步骤,基本就实现了一个简单的MQ发送接收的demo.
知识使我快乐