springboot集成rabbitMQ

这篇博客介绍了如何在SpringBoot项目中集成RabbitMQ,包括RabbitMQ的安装、POM配置、消息发送与接收类的创建,以及对象序列化的注意事项。通过这些步骤,你可以构建一个简单的MQ发送和接收示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先你要自己安装一个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.

 

知识使我快乐

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值