rabbitMQ安装及整合springBoot
安装
这里只接贴一个安装流程博文windows10环境下的RabbitMQ安装步骤
安装所需的两个文件:
[百度云链接] https://pan.baidu.com/s/1DCXisERe5T4yUbIGdGR-jA
提取码 dsnm
在springBoot使用
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
第一步:导入依赖
@Configuration
public class RabbitConfig {
@Bean
public RabbitTemplate createRabbitTemplate(ConnectionFactory connectionFactory){
RabbitTemplate rabbitTemplate = new RabbitTemplate();
rabbitTemplate.setConnectionFactory(connectionFactory);
//设置开启Mandatory,才能触发回调函数,无论消息推送结果怎么样都强制调用回调函数
rabbitTemplate.setMandatory(true);
rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
@Override
public void confirm(CorrelationData correlationData, boolean ack, String cause) {
System.out.println("ConfirmCallback: "+"相关数据:"+correlationData);
System.out.println("ConfirmCallback: "+"确认情况:"+ack);
System.out.println("ConfirmCallback: "+"原因:"+cause);
}
});
rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
@Override
public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
System.out.println("ReturnCallback: "+"消息:"+message);
System.out.println("ReturnCallback: "+"回应码:"+replyCode);
System.out.println("ReturnCallback: "+"回应信息:"+replyText);
System.out.println("ReturnCallback: "+"交换机:"+exchange);
System.out.println("ReturnCallback: "+"路由键:"+routingKey);
}
});
return rabbitTemplate;
}
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
RabbitTemplate template = new RabbitTemplate(connectionFactory);
template.setMessageConverter(new Jackson2JsonMessageConverter());
return template;
}
@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setMessageConverter(new Jackson2JsonMessageConverter());
return factory;
}
}
第二步:配置bean,注意,这里的三个不是必须的,如果之后消费者出现了
No method found for class java.lang.String
的错误,就加上这个,然后再消费者的注解里面加一个参数,指向rabbitListenerContainerFactory即可
@Configuration
public class DirectRabbitConfig {
//队列 起名:TestDirectQueue
@Bean
public Queue PushFaceQueue() {
// durable:是否持久化,默认是false,持久化队列:会被存储在磁盘上,当消息代理重启时仍然存在,暂存队列:当前连接有效
// exclusive:默认也是false,只能被当前创建的连接使用,而且当连接关闭后队列即被删除。此参考优先级高于durable
// autoDelete:是否自动删除,当没有生产者或者消费者使用此队列,该队列会自动删除。
// return new Queue("TestDirectQueue",true,true,false);
//一般设置一下队列的持久化就好,其余两个就是默认false
return new Queue("PushFaceQueue",true);
}
//Direct交换机 起名:TestDirectExchange
@Bean
DirectExchange PushFaceExchange() {
// return new DirectExchange("TestDirectExchange",true,true);
return new DirectExchange("PushFaceExchange",true,false);
}
//绑定 将队列和交换机绑定, 并设置用于匹配键:TestDirectRouting
@Bean
Binding bindingDirect() {
return BindingBuilder.bind(PushFaceQueue()).to(PushFaceExchange()).with("PushFaceKey");
}
@Bean
DirectExchange lonelyDirectExchange() {
return new DirectExchange("lonelyDirectExchange");
}
第三步:创建Exchange 和 Queue 并 用 routingKey 进行关联起来
要是觉得光用这个不够,看看这个
我就是按这个来走的,里面还有几个别的类型的交换机,我这边没有涉及到
//使用RabbitTemplate,这提供了接收/发送等等方法
@Autowired
RabbitTemplate rabbitTemplate;
//在controller的方法里面使用即可
rabbitTemplate.convertAndSend("PushFaceExchange", "PushFaceKey", pushMap);
第四步:导入RabbitTemplate 并使用,pushMap 是个Object,可以放任何类型
@Component
public class PushFaceController {
@RabbitHandler
@RabbitListener(queues = "PushFaceQueue", containerFactory="rabbitListenerContainerFactory")//监听的队列名称 TestDirectQueue
public void process(Map<String,Object> msgMap) throws Exception {
//todo
}catch (Exception e){
e.printStackTrace();
}
}
在这里进行消费,我将RabbitListener放到方法级,并加了一个containerFactory=“rabbitListenerContainerFactory” 就是因为上面出的那个问题,如果没有问题的话,可以在@Component下面加上,最好处理业务的时候加一个try catch进行处理异常,否则会造成队列无限积累,无法消费