赞
踩
上面的案例,使用定时任务,一直轮询数据,每秒查一次,取出需要被处理的数据,然后处理数据,这个方案可以吗?
如果数据量比较少,确实可以这样做
但是对于数据量比较大,并且时效性较强的场景,不可以使用定时任务
@Component
public class MessageConsumer {
@RabbitListener(queues = "QD")
public void receiveD(Message message, Channel channel){
String msg = new String(message.getBody());
System.out.println(msg);
}
}
@Component public class MessageProducer { @Autowired private RabbitTemplate rabbitTemplate; /** * 发送消息 * * @param message 消息 * @param ttlTime ttl时间 */ public void send(String message, String ttlTime) { rabbitTemplate.convertAndSend(TtlQueueConfig.X_EXCHANGE, "XC", message, msg -> { msg.getMessageProperties().setExpiration(ttlTime); return msg; }); } }
/** * 延时队列 配置类 */ @Component @Configuration public class TtlQueueConfig { // 普通交换机 public static final String X_EXCHANGE = "X"; // 死信交换机 public static final String Y_DEAD_EXCHANGE = "Y"; // 普通队列 public static final String QUEUE_C = "QC"; // 死信队列 public static final String DEAD_QUEUE_D = "QD"; // 声明X交换机 @Bean("xExchange") public DirectExchange xExchange() { return new DirectExchange(X_EXCHANGE); } // 声明Y交换机 @Bean("yExchange") public DirectExchange yExchange() { return new DirectExchange(Y_DEAD_EXCHANGE); } // 声明普通队列 @Bean("queueC") public Queue queueC() { return QueueBuilder.durable(QUEUE_C).deadLetterExchange(Y_DEAD_EXCHANGE).deadLetterRoutingKey("YD").build(); } // 声明死信队列 @Bean("queueD") public Queue queueD() { return QueueBuilder.durable(DEAD_QUEUE_D).build(); } // 队列与交换机进行绑定 @Bean public Binding queueCBindingX(@Qualifier("queueC") Queue queueC, @Qualifier("xExchange") DirectExchange xExchange) { return BindingBuilder.bind(queueC).to(xExchange).with("XC"); } @Bean public Binding queueDBindingY(@Qualifier("queueD") Queue queueD, @Qualifier("yExchange") DirectExchange yExchange) { return BindingBuilder.bind(queueD).to(yExchange).with("YD"); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。