Springboot + RabbitMQ

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>sprinf-boot-starter-ampq</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>sprinf-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>sprinf-boot-starter-logging</artifactId>
</dependency>
springboot中yml配置:
spring:
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
virtualHost: /
@Configuration
public Class RabbitmqConfig{
//声明交换机
@Bean("交换机名称")
public Exchange EXCHANGE_TOPICS_INFORM(){
//durable交换机是否持久化,mq重启后交换机依然存在
return ExchangeBuilder.topicExchange("交换机名称").durable(true).build();
}

//声明队列
@Bean("队列名称")
public Queue QUEUE_INFORM(){
return new Queue("队列名称")
}

//队列绑定交换机,指定routingKey
@Bean
public Binding BINDING_QUEUE_EXCHANGE(@Qualifier("队列名称") Queue queue,@Qualifier("交换机名称") Exchange exchange){
return Binding.build(queue).to(exchange).with("routingkey").noargs();
}
}

@SpringBootTest
@RunWith(SpringRunner.class)
public Class TestRabbitMq{
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
public void send(){
rabbitTemplate.convertAndSend("交换机名称","routingkey","信息内容");
}
}

@Component
public Class ReceiveHandler{

@RabbitListener(queues={"队列名称"})
public void receive(Message message,Channel channel,String msg){
System.out.println("receive message:" + msg);
}
}
当3台服务器进行负载均衡时,若想三台服务都接收到数据,则应有三个队列,所以队列名称不一样,但routingkey可以一样
---------------------------------------------------------------------------------------------------------------------------------------------
@RabbitListener注解指定消费方法,默认单线程监听队列,每次只消费一个消息,不能最大利用硬件资源
可以配置mq的容器工厂参数,增加并发处理量可实现多线程处理监听队列,实现多线程处理消息。
//消费者并发数量
public static final int DEFAULT_CONCURRENT = 10;

@Bean("customContainerFactory")
public SimpleRabbitListenerContainerFactory containerFactory(SimpleRabbitListenerContainerFactoryConfigurer configurer,
ConnectionFactory connectionFactory){
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConcurrentConsumers(DEFAULT_CONCURRENT);
factory.setMaxConcurrentConsumers(DEFAULT_CONCURRENT);
configurer.configure(factory,connectionFactory);
return factory;
}
在@RabbitListener注解中指定容器工厂:@RabbitListener(queues={"队列名称"},containerFactory="customContainerFactory")
posted @ 2019-11-05 15:08  袋子里的袋鼠  阅读(154)  评论(0)    收藏  举报