rabbitmq 学习(五) spring-boot-rabbit同时连接多个rabbitmq服务器收发消息

上一遍博客介绍了使用spring-boot连接单个rabbitmq服务器发送和接收消息,但是在实际的项目中我们可能需要同时连接多个不同的rabbitmq服务器发送和接收消息。今天简单介绍下如何使用spring-boot连个多个rabbitmq服务器发送和接收消息。
1.配置文件中配置2个rabbitmq连接信息(这里我在2台虚拟机上安装rabbitmq)

server:
  port: 8091
spring:
  application:
    name: rabbit-spring-boot
  rabbitmq:
    dev:
      host: 192.168.98.22
      port: 5672
      username: root
      password: root
    test:
     host: 192.168.98.23
     port: 5672
     username: root
     password: root

2.创建rabbitmq连接配置类

@Configuration
public class RabbitMqConfig {
	 // 注意这里使用了primary注解
	 //  声明连接工厂连接开发服务器
	@Primary
	@Bean(name = "devConnectionFactory")
	public ConnectionFactory devConnectionFactory(@Value("${spring.rabbitmq.dev.host}") String host,
	                                           @Value("${spring.rabbitmq.dev.port}") int port,
	                                           @Value("${spring.rabbitmq.dev.username}") String username,
	                                           @Value("${spring.rabbitmq.dev.password}") String password) {
	                                           // 使用@Value直接读取配置文件中的信息
		CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
		connectionFactory.setHost(host);
		connectionFactory.setPort(port);
		connectionFactory.setUsername(username);
		connectionFactory.setPassword(password);
		connectionFactory.setVirtualHost("/");
		connectionFactory.setPublisherConfirms(true);
		connectionFactory.setPublisherReturns(true);
		return connectionFactory;
	}
	//  声明连接工厂连接测试服务器
	@Bean(name = "testConnectionFactory")
	public ConnectionFactory testConnectionFactory(@Value("${spring.rabbitmq.test.host}") String host,
	                                              @Value("${spring.rabbitmq.test.port}") int port,
	                                              @Value("${spring.rabbitmq.test.username}") String username,
	                                              @Value("${spring.rabbitmq.test.password}") String password) {
		CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
		connectionFactory.setHost(host);
		connectionFactory.setPort(port);
		connectionFactory.setUsername(username);
		connectionFactory.setPassword(password);
		connectionFactory.setVirtualHost("/");
		connectionFactory.setPublisherConfirms(true);
		connectionFactory.setPublisherReturns(true);
		return connectionFactory;
	}
	//  声明开发服务器rabbitTemplate
	@Bean(name = "devRabbitTemplate")
	public RabbitTemplate devRabbitTemplate(@Qualifier("devConnectionFactory") ConnectionFactory connectionFactory) {
		RabbitTemplate rabbitTemplate=new RabbitTemplate(connectionFactory);
		return rabbitTemplate;
	}
	//  声明测试服务器连接 rabbitTemplate
	@Bean(name = "testRabbitTemplate")
	public RabbitTemplate testRabbitTemplate(@Qualifier("testConnectionFactory") ConnectionFactory connectionFactory) {
		RabbitTemplate rabbitTemplate=new RabbitTemplate(connectionFactory);
		return rabbitTemplate;
	}

	/**
	 * 声明dev containerFactory
	 * @param rabbitListenerContainerFactoryConfigurer
	 * @param connectionFactory
	 * @return
	 */
	@Bean(name = "devContainerFactory")
	public SimpleRabbitListenerContainerFactory devSimpleRabbitListenerContainerFactory(
			SimpleRabbitListenerContainerFactoryConfigurer rabbitListenerContainerFactoryConfigurer,
			@Qualifier("devConnectionFactory") ConnectionFactory connectionFactory) {
		SimpleRabbitListenerContainerFactory containerFactory=new SimpleRabbitListenerContainerFactory();
		rabbitListenerContainerFactoryConfigurer.configure(containerFactory,connectionFactory);
		return containerFactory;
	}

	/**
	 * 声明  test containerFactory
	 * @param rabbitListenerContainerFactoryConfigurer
	 * @param connectionFactory
	 * @return
	 */
	@Bean(name = "testContainerFactory")
	public SimpleRabbitListenerContainerFactory testSimpleRabbitListenerContainerFactory(
			SimpleRabbitListenerContainerFactoryConfigurer rabbitListenerContainerFactoryConfigurer,
			@Qualifier("testConnectionFactory") ConnectionFactory connectionFactory) {
		SimpleRabbitListenerContainerFactory containerFactory=new SimpleRabbitListenerContainerFactory();
		rabbitListenerContainerFactoryConfigurer.configure(containerFactory,connectionFactory);
		return containerFactory;
	}

	@Bean
	public RestTemplate restTemplate() {
		return new RestTemplate();
	}
}

3.创建消息生产者

@Component
public class RabbitMQProducer {
	//  指定dev服务器rabbitTemplate
	@Resource(name = "devRabbitTemplate")
	AmqpTemplate devAmqpTemplate;
	//  指定test服务器rabbitTemplate
	@Resource(name = "testRabbitTemplate")
	AmqpTemplate testAmqpTemplate;

	@Value("${open-care.rabbitmq.exchange.name}")
	String exchangeName;
	@Value("${open-care.rabbitmq.queue1-name}")
	String queueName;

	public void send(Object object) {
		try {
			Message message= MessageBuilder.withBody(JSON.toJSONString(object).getBytes("UTF-8"))
					.setContentType(MessageProperties.CONTENT_TYPE_JSON)
					.setContentEncoding("UTF-8")
					.setMessageId(UUID.randomUUID().toString()).build();
			// 指定exchange交换器名称为fanout_exchange(fanout交换器没有路由键)
			devAmqpTemplate.send("fanout_exchange","",message);
			//  使用devAmqpTemplate将消息发送到开发服务器
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	}

	public void sendMessage(Object object) {
		try {
			Message message= MessageBuilder.withBody(JSON.toJSONString(object).getBytes("UTF-8"))
					.setContentType(MessageProperties.CONTENT_TYPE_JSON)
					.setContentEncoding("UTF-8")
					.setMessageId(UUID.randomUUID().toString()).build();
			// 指定交换器名称为fanout_exchange(fanout交换器没有路由键)
			testAmqpTemplate.send("fanout_exchange","",message);
			// 使用testAmqpTeplate将消息发送到测试服务器
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	}
}

4.创建消息消费者

@Component
public class RabbitMQConsumer {
	@RabbitHandler
	@RabbitListener(queues = "q.test1",containerFactory = "devContainerFactory")//  指定队列名称和容器工厂,接收开发服务器队列q.test1中的消息
	public void receive(Object object) {
		Message message=(Message)object;
		byte bytes[]=null;
		if (message != null) {
			bytes=message.getBody();
		}
		try {
			String msg=new String(bytes,"UTF-8");
			System.out.println("192.168.98.22 q.test1------------------------"+msg);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	}

	@RabbitHandler
	@RabbitListener(queues = "q.test2",containerFactory = "devContainerFactory")//  指定队列名称和容器工厂,接收开发服务器队列q.test2中的消息
	public void receiveQueue1(Object object) {
		Message message=(Message)object;
		byte bytes[]=null;
		if (message != null) {
			bytes=message.getBody();
		}
		try {
			String msg=new String(bytes,"UTF-8");
			System.out.println("192.168.98.22 q.test2------------------------"+msg);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	}

	@RabbitHandler
	@RabbitListener(queues = "q.test3",containerFactory = "devContainerFactory")//  指定队列名称和容器工厂,接收开发服务器队列q.test3中的消息
	public void receiveQueue2(Object object) {
		Message message=(Message)object;
		byte bytes[]=null;
		if (message != null) {
			bytes=message.getBody();
		}
		try {
			String msg=new String(bytes,"UTF-8");
			System.out.println("192.168.98.22 q.test3------------------------"+msg);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	}

	@RabbitHandler
	@RabbitListener(queues = "q.test1",containerFactory = "testContainerFactory")
	//  指定队列名称和容器工厂,接收测试服务器队列q.test1中的消息
	public void receive23message(Object object) {
		Message message=(Message)object;
		byte bytes[]=null;
		if (message != null) {
			bytes=message.getBody();
		}
		try {
			String msg=new String(bytes,"UTF-8");
			System.out.println("192.168.98.23 q.test1------------------------"+msg);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	}

	@RabbitHandler
	@RabbitListener(queues = "q.fanout1",containerFactory = "testContainerFactory")//  指定队列名称和容器工厂,接收测试服务器队列q.fanout1中的消息
	public void receiveFanoutQueue(Object object) {
		Message message=(Message)object;
		byte bytes[]=null;
		if (message != null) {
			bytes=message.getBody();
		}
		try {
			String msg=new String(bytes,"UTF-8");
			System.out.println("192.168.98.23 q.fanout1------------------------"+msg);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	}
}
  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
eue)和绑定(Binding)的配置。以下是示例代码: ``` @Configuration public class RabbitMQConfig { // 定义交换器名称 public static final String EXCHANGE_NAME = "my_exchange"; // 定义队列名称 public static final String SMS_QUEUE_NAME = "sms_queue"; public static final String EMAIL_QUEUE_NAME = "email_queue"; // 定义路由键 public static final String SMS_ROUTING_KEY = "sms"; public static final String EMAIL_ROUTING_KEY = "email"; // 配置交换器 @Bean public DirectExchange directExchange() { return new DirectExchange(EXCHANGE_NAME); } // 配置短信队列 @Bean public Queue smsQueue() { return new Queue(SMS_QUEUE_NAME); } // 配置邮件队列 @Bean public Queue emailQueue() { return new Queue(EMAIL_QUEUE_NAME); } // 配置短信队列绑定 @Bean public Binding smsBinding() { return BindingBuilder.bind(smsQueue()).to(directExchange()).with(SMS_ROUTING_KEY); } // 配置邮件队列绑定 @Bean public Binding emailBinding() { return BindingBuilder.bind(emailQueue()).to(directExchange()).with(EMAIL_ROUTING_KEY); } } ``` 在上述代码中,我们使用了Direct交换器,定义了sms_queue和email_queue两个队列,以及sms和email两个路由键。我们还通过@Bean注解将它们配置到Spring容器中。 接下来,我们需要在application.properties中添加RabbitMQ连接配置: ``` spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest ``` 最后,我们需要实现一个消息生产者Controller,示例代码如下: ``` @RestController public class MessageController { @Autowired private AmqpTemplate amqpTemplate; @GetMapping("/sendSms") public String sendSms() { String message = "Hello, this is a SMS message!"; amqpTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME, RabbitMQConfig.SMS_ROUTING_KEY, message); return "Send SMS message: " + message; } @GetMapping("/sendEmail") public String sendEmail() { String message = "Hello, this is an email message!"; amqpTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME, RabbitMQConfig.EMAIL_ROUTING_KEY, message); return "Send email message: " + message; } } ``` 在上述代码中,我们使用了AmqpTemplate接口的convertAndSend方法将消息发送到RabbitMQ中。通过访问/sendSms和/sendEmail接口,我们可以向sms_queue和email_queue发送消息。 以上就是一个简单的Spring Boot + RabbitMQ消息生产者的实现。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值