网站内容很少如何做seo优速网站建设工作室

当前位置: 首页 > news >正文

网站内容很少如何做seo,优速网站建设工作室,哈尔滨市建工建设有限公司,模板网婚纱实现延时队列#xff0c;可以通过RabbitMQ的死信队列#xff08;Dead-letter queue#xff09;特性#xff0c;“死信队列”是当消息过期#xff0c;或者队列达到最大长度时#xff0c;未消费的消息会被加入到死信队列。然后#xff0c;我们可以对死信队列中的消息进行消…实现延时队列可以通过RabbitMQ的死信队列Dead-letter queue特性“死信队列”是当消息过期或者队列达到最大长度时未消费的消息会被加入到死信队列。然后我们可以对死信队列中的消息进行消费完成类似“延时”的效果。 下面的示例代码演示了如何在Spring Boot中使用RabbitMQ设置一个订单然后在15分钟后自动取消。

  1. 添加 RabbitMQ 依赖: 在你的pom.xml中加入Spring Boot对RabbitMQ的Starter xml dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-amqp/artifactId /dependency2. 配置队列、交换器、绑定和容器 我们创建一个配置类定义一个正常的队列和一个死信队列以及相应的交换机和队列的绑定 java Configuration public class RabbitMQConfig {/* 正常队列配置 /Beanpublic Queue orderQueue() {MapString, Object args new HashMap();args.put(x-dead-letter-exchange, dead_exchange); // 队列消息过期后发送的交换器args.put(x-dead-letter-routing-key, dead); // 队列消息过期后发送的路由键return new Queue(order_queue, true, false, false, args);}Beanpublic DirectExchange orderExchange() {return new DirectExchange(order_exchange);}Beanpublic Binding orderBinding() {return BindingBuilder.bind(orderQueue()).to(orderExchange()).with(order);}/ 死信队列配置 */Beanpublic Queue deadQueue() {return new Queue(dead_queue);}Beanpublic DirectExchange deadExchange() {return new DirectExchange(dead_exchange);}Beanpublic Binding deadBinding() {return BindingBuilder.bind(deadQueue()).to(deadExchange()).with(dead);} }3. 发送延时消息 创建订单时我们发送一个延时消息到队列 java Autowired private RabbitTemplate rabbitTemplate;public void createOrder(String orderId) {//订单创建业务…rabbitTemplate.convertAndSend(order_exchange, order, orderId, message - {message.getMessageProperties().setExpiration(String.valueOf(15 * 60 * 1000)); // 15分钟return message;}); }4. 消费死信队列中的消息 然后我们需要消费死信队列中的消息进行订单取消的操作 java RabbitListener(queues dead_queue) public void processDeadLetter(String orderId) {// 订单取消业务… }在RabbitMQ中设置消息的过期时间 RabbitMQ允许你在两个级别上设置消息的过期时间队列级别和消息级别。一旦消息过期它将从队列中删除。 队列级别你可以在声明队列时通过x-message-ttl参数设置过期时间以毫秒为单位。这会影响队列中的所有消息。 java MapString, Object args new HashMap(); args.put(x-message-ttl, 60000); // 设置60s过期时间 Channel channel …; channel.queueDeclare(my_queue, false, false, false, args); 消息级别你也可以在发布消息时单独为每条消息设置过期时间。如果队列级别的TTL和消息级别的TTL都被设置了那么较小的那个值会被应用。 java byte[] messageBodyBytes Hello, world!.getBytes(); AMQP.BasicProperties props new AMQP.BasicProperties.Builder().expiration(60000).build(); // 设置60s过期时间 Channel channel …; channel.basicPublish(my_exchange, my_routing_key, props, messageBodyBytes);5、RabbitMQ中的死信队列如何工作 “死信队列”用于接收不可路由的消息或者由于一些原因不能正确处理的消息。这样能防止原始队列堵塞也可以进一步处理这些消息。 当以下情况发生时消息会被投递到死信队列 消息被拒绝 (basic.reject / basic.nack)并且requeuefalse。在队列中排队的时间过长超过设置的TTL。队列长度溢出(超过设置的最大长度)。 在声明队列时可以通过x-dead-letter-exchange和x-dead-letter-routing-key来设置死信交换器和路由键。 6、如何确保消费者在消费消息时不会发生重复消费的情况 确保消费者在消费消息时不发生重复消费一般可以通过以下方式实现 消息确认机制RabbitMQ提供了消息确认机制ACK消费者处理完消息后返回一个ACK信号告诉RabbitMQ可以将该消息从队列中删除。如果在处理消息的过程中消费者出现异常如断开连接RabbitMQ将不会删除队列中的消息并且会再次尝试发送该消息给消费者。幂等操作在消费者端确保消息处理逻辑是幂等的也就是说无论消息被处理一次还是多次结果都是相同的。例如对于一个扣款操作无论这个操作执行多少次账户的余额都应该只被扣除一次。分布式锁在处理消息之前消费者首先尝试获取一个分布式锁。只有获取到锁的消费者才能处理消息。处理完毕后释放锁。避免了同一消息被多个消费者处理的情况。 7、设置RabbitMQ中消息的优先级 在RabbitMQ中对消息的优先级的支持是通过队列来实现的。在声明队列的时候可以通过x-max-priority参数来指定队列支持的最大优先级。然后在发布消息的时候可以通过basicProperties的priority字段来指定消息的优先级。如下 java // 声明队列时设置最大优先级 MapString, Object args new HashMapString, Object(); args.put(x-max-priority, 10); channel.queueDeclare(my_queue, false, false, false, args);// 发布消息时设置优先级 AMQP.BasicProperties props new AMQP.BasicProperties().builder().priority(5).build(); channel.basicPublish(, my_queue, props, Hello world.getBytes());注意优先级较高的消息将会优先被消费但是并不保证完全按照优先级顺序消费。 8、RabbitMQ中如何处理消费者异常断开连接的情况 当RabbitMQ检测到消费者如一个TCP连接异常断开例如因为消费者主机崩溃或因为网络问题它将关闭该消费者的连接并将消费者未确认的任何消息重新放入队列。如果你希望一个消息在消费者断开连接时不被再次放入队列你可以设置该消费者的autoAck参数为true也就是无需显示确认。但一般情况下我们推荐消费者在正确处理消息后发送一个确认应答basicAck。