那里有做网站,如何弄小程序,做免费的网站教程,网站开发的合同范本一、rabbitmq发送消息
一、简单模式
概述 一个生产者一个消费者模型 代码
//没有交换机#xff0c;两个参数为routingKey和消息内容
rabbitTemplate.convertAndSend(test1_Queue,haha);二、工作队列模式
概述 一个生产者#xff0c;多个消费者两个参数为routingKey和消息内容
rabbitTemplate.convertAndSend(test1_Queue,haha);二、工作队列模式
概述 一个生产者多个消费者消费者之间负载均衡模型 代码 //没有交换机两个参数为routingKey和消息内容rabbitTemplate.convertAndSend(test1_Queue,haha);三、发布订阅模式
概述
生产者把消息给交换机交换机把消息推送给与它绑定的所有队列消费者监听自己的队列模型 代码
//该模式下交换机与队列绑定无需routingkey,因此效率最高
rabbitTemplate.convertAndSend(fanout_Exchange,,lala);四、路由模式
概述
交换机与队列由routing key绑定生产者发送消息时指定交换机和routing key则对应的队列便会收到消息模型 代码 rabbitTemplate.convertAndSend(direct_Exchange,test1_Queue,lala);五、主题模式通配符模式
概述
交换机与队列由routing key绑定但routing key由通配符和具体的字符组成生产者输入具体的字符交换机根据routing key的规则模糊匹配到对应的队列则对应的队列会收到消息模型 代码
/*** 交换机与队列绑定* return*/
Bean
Binding truckHistoryBinding(){return BindingBuilder.bind(test1Queue()).to(topicExchange()).with(*.test1.*);
}GetMapping(/sendMessage)
public void sendMessage() {//需要字符串的模糊匹配效率最低rabbitTemplate.convertAndSend(topic_Exchange,aa.test1.cc,lala);
}二、rabbitmq接收消息
一、拉模式
概述 消费者可以主动拉取队列里的消息代码
rabbitTemplate.execute(channel-{//通过channel.basicGet方法可以单条获取消息其返回值时GetReponseGetResponse response channel.basicGet(my_queue,false);String message new String(response.getBody());}
)二、推模式
概述
通过发布订阅模式订阅队列里的消息代码 RabbitListener(queuesmy_queue)public void onMessage(Message messge,Channel channel){String msg new String (message.getBody());}三、消息的手动确认
注意
手动确认需要先将自动确认的配置注释掉 消息确认模式有 AcknowledgeMode.NONE自动确认 AcknowledgeMode.AUTO根据情况确认 AcknowledgeMode.MANUAL手动确认 默认情况下消息消费者是自动 ack 确认消息的如果要手动 ack确认则需要修改确认模式为 manual
spring:rabbitmq:listener:simple:acknowledge-mode: manual或在 RabbitListenerContainerFactory 中进行开启手动 ack
Bean
public RabbitListenerContainerFactory? rabbitListenerContainerFactory(ConnectionFactory connectionFactory){SimpleRabbitListenerContainerFactory factory new SimpleRabbitListenerContainerFactory();factory.setConnectionFactory(connectionFactory);factory.setMessageConverter(new Jackson2JsonMessageConverter());factory.setAcknowledgeMode(AcknowledgeMode.MANUAL); //开启手动 ackreturn factory;
}消费消息手动确认的监听器
获取消息消费的唯一标识
message.getMessageProperties().getDeliveryTag();执行业务处理
消息确认 //消费消息的手动确认消息确认成功-basicAck//第一个参数deliveryTag消息的唯一标识//第二个参数multiple消息是否支持批量确认如果是true代表可以一次性确认标识小于等于当前标识的所有消息//如果是false只会确认当前消息channel.basicAck(deliveryTag,false);消息确认失败处理根据条件判断设置是否重回队列 是否支持批量处理 //说明消费消息处理失败如果不进行确认(自动确认投递成功即确认消费是否正常不关心)消息就会丢失//消息处理失败确认,代表消息没有正确消费注意此种方式一次只能确认一个消息//第一给参数是消息的唯一标识//第二个参数是代表是否重回队列如果是true重新将该消息放入队列再次消费//注意第二个参数要谨慎必须要结合具体业务场景根据业务判断是否需要重回队列一旦处理不当机会导致消息循环入队消息挤压//不重回队列 require false
// channel.basicReject(deliveryTag,false);//重回队列 require truechannel.basicReject(deliveryTag,true);//消息处理失败确认代表消息没有正确消费注意此种方式支持批量//第一个参数是消息的唯一标识//第二个参数是代表是否支持批量确认//第三给参数代表是否重回队列//不重回队列 require falsechannel.basicNack(deliveryTag,true,false);//重回队列 require truechannel.basicNack(deliveryTag,false,true);