springboot整合rabbitmq

本文介绍了Spring Boot整合RabbitMQ的方法,包括新建项目、添加依赖和配置。还阐述了多种消息模式,如直连模式下队列由消费者创建;任务模式可设置公平分发;广播、路由和动态路由模式也有提及,动态路由中*和#有不同匹配规则。

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

springboot整合rabbitmq

新建springboot项目,添加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

添加配置

spring:
  rabbitmq:
    host: 192.168.137.100
    port: 5672
    username: guest
    password: guest
    virtual-host: /mes

这样就可以用个了,这个配置和直接连接时是一样的

helloword(直连)

//使用springboot的测试类,然后注入RabbitTemplate模板类
@Autowired
private RabbitTemplate rabbitTemplate;

@Test
void helloWorldProvider(){
    rabbitTemplate.convertAndSend("hello","hhh");//给hello队列发送消息
}
@Component//交给spring容器管理
@RabbitListener(queuesToDeclare = @Queue("hello"))//监听hello队列,在@Queue中还有很多的参数,就是原来申明时的那些参数
public class Consumer {

    @RabbitHandler//接收到消息时的回调方法
    public void getMessage(String message){
        System.out.println(message);
    }
}

如果直接运行生产者,没有消费者的话,在web管理界面是看不到队列信息的,只有当消费者有了才会出现队列,也就是说是消费者创建的队列

work queue (任务)

//使用springboot的测试类,然后注入RabbitTemplate模板类
@Autowired
private RabbitTemplate rabbitTemplate;

@Test
void workProvider(){
    for (int i = 0; i < 5; i++) {
        rabbitTemplate.convertAndSend("work","这里是work模型"+i);//给work队列发送5条消息
    }
}
@Component("workConsumer")//前面定义了一个consumer,所以这里就另写一个
public class Consumer {

	@RabbitListener(queuesToDeclare = @Queue("work"))
	public void consumer1(String message){
		System.out.println("consumer1:"+message);
	}

	@RabbitListener(queuesToDeclare = @Queue("work"))
	public void consumer2(String message){
		System.out.println("consumer2:"+message);
	}
}
//平均分配
consumer1:这里是work模型0
consumer2:这里是work模型1
consumer1:这里是work模型2
consumer2:这里是work模型3

这种模型默认是轮询分发,如果有100条消息,消费者1需要消费50条,消费者2需要消费50条,如果消费者1处理任务时间太长,我们需要消费者2多处理一点,消费1少处理一点,能者多劳,可以添加吐下配置,设置为1后,会使用公平分发,也就是你现在空了就消费,没空我就不给你消息消费

spring:
  rabbitmq:
    listener:
      simple:
        prefetch: 1

fanout (广播)

//使用springboot的测试类,然后注入RabbitTemplate模板类
@Autowired
private RabbitTemplate rabbitTemplate;

@Test
void fanoutProvider() {
	rabbitTemplate.convertAndSend("fanout", "", "这里是fanout模型");
}
@Component("fanoutConsumer")
public class Consumer {
	@RabbitListener(bindings = {
			@QueueBinding(value = @Queue,//直接使用@Queue就是创建的临时队列
					exchange = @Exchange(value = "fanout", type = "fanout"))
	})
	public void consumer1(String message) {
		System.out.println("consumer1"+message);
	}

	@RabbitListener(bindings = {
			@QueueBinding(value = @Queue,
					exchange = @Exchange(value = "fanout", type = "fanout"))
	})
	public void consumer2(String message) {
		System.out.println("consumer2"+message);
	}
}
consumer2这里是work模型
consumer1这里是work模型

Routing (路由)

//使用springboot的测试类,然后注入RabbitTemplate模板类
@Autowired
private RabbitTemplate rabbitTemplate;

@Test
void routingProvider() {
	rabbitTemplate.convertAndSend("routing", "red", "这里是routing模型");
}
@Component("routingConsumer")
public class Consumer {
	@RabbitListener(bindings = {
			@QueueBinding(value = @Queue,
					exchange = @Exchange(value = "routing",type = "direct"),
					key = {"red","green","blue"})
	})
	public void consumer1(String message) {
		System.out.println("consumer1"+message);
	}


	@RabbitListener(bindings = {
			@QueueBinding(value = @Queue,
					exchange = @Exchange(value = "routing",type = "direct"),
					key = {"red","green"})
	})
	public void consumer2(String message) {
		System.out.println("consumer2"+message);
	}

	@RabbitListener(bindings = {
			@QueueBinding(value = @Queue,
					exchange = @Exchange(value = "routing",type = "direct"),
					key = {"green","blue"})
	})
	public void consumer3(String message) {
		System.out.println("consumer3"+message);
	}
	
	@RabbitListener(bindings = {
			@QueueBinding(value = @Queue,
					exchange = @Exchange(value = "routing",type = "direct"),
					key = {"green","blue"})
	})
	public void consumer4(String message) {
		System.out.println("consumer4"+message);
	}
}
red
consumer4这里是routing模型
consumer2这里是routing模型
consumer1这里是routing模型
----
green
consumer3这里是routing模型
consumer1这里是routing模型
consumer2这里是routing模型
----
blue
consumer1这里是routing模型
consumer3这里是routing模型
consumer4这里是routing模型

Topics (动态路由)

//使用springboot的测试类,然后注入RabbitTemplate模板类
@Autowired
private RabbitTemplate rabbitTemplate;

@Test
void topicProvider() {
	rabbitTemplate.convertAndSend("topic", "red.green.blue", "这里是topic模型");
}
@Component("topicConsumer")
public class Consumer {
	@RabbitListener(bindings = @QueueBinding(value = @Queue,
			exchange = @Exchange(value = "topic", type = "topic"),
			key ={"red.*.blue"}))
	public void consumer1(String message) {
		System.out.println("consumer1"+message);
	}

	@RabbitListener(bindings = @QueueBinding(value = @Queue,
			exchange = @Exchange(value = "topic", type = "topic"),
			key ={"red.#"}))
	public void consumer2(String message) {
		System.out.println("consumer2"+message);
	}

	@RabbitListener(bindings = @QueueBinding(value = @Queue,
			exchange = @Exchange(value = "topic", type = "topic"),
			key ={"#.blue"}))
	public void consumer3(String message) {
		System.out.println("consumer3"+message);
	}

	@RabbitListener(bindings = @QueueBinding(value = @Queue,
			exchange = @Exchange(value = "topic", type = "topic"),
			key ={"*.green.blue"}))
	public void consumer4(String message) {
		System.out.println("consumer4"+message);
	}
}
red.green.blue
consumer4这里是topic模型
consumer1这里是topic模型
consumer3这里是topic模型
consumer2这里是topic模型
----
red.green
consumer2这里是topic模型
----
green.blue
consumer3这里是topic模型

*:代表一个单词,可以为任何单词,但是不能为空,不然匹配不到
#:代表任何,可以有,可以没有,也就是代表0到多个单词

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值