【发布时间】:2018-07-02 01:36:11
【问题描述】:
我在我的项目中使用spring amqp,我使用实现ChannelAwareMessageListener进行重发和处理异常,让兔子监听器更稳定:
public abstract class AbstractMessageListener implements ChannelAwareMessageListener {
@Autowired
private Jackson2JsonMessageConverter messageConverter;
@Autowired
private RedisTemplate<String, Object> redisTemplate;
/** where comsumer really do biz */
public abstract void receiveMessage(Message message, MessageConverter messageConverter);
@Override
public void onMessage(Message message, Channel channel) throws Exception {
MessageProperties messageProperties = message.getMessageProperties();
Long deliveryTag = messageProperties.getDeliveryTag();
Long consumerCount = redisTemplate.opsForHash().increment(MQConstants.MQ_CONSUMER_RETRY_COUNT_KEY,
messageProperties.getMessageId(), 1);
try {
receiveMessage(message, messageConverter);
channel.basicAck(deliveryTag, false);
redisTemplate.opsForHash().delete(MQConstants.MQ_CONSUMER_RETRY_COUNT_KEY,
messageProperties.getMessageId());
} catch (Exception e) {
if (consumerCount >= MQConstants.MAX_CONSUMER_COUNT) {
channel.basicReject(deliveryTag, false);
} else {
Thread.sleep((long) (Math.pow(MQConstants.BASE_NUM, consumerCount)*1000));
channel.basicNack(deliveryTag, false, true);
}
}
}
然后我们可以像这样扩展我们的 AbstractMessageListener 来接收:
public class BizMessageListener extends AbstractMessageListener {
Logger logger = LoggerFactory.getLogger(getClass());
@Override
public void receiveMessage(Message message, MessageConverter messageConverter) {
//do our own biz
}
}
但是有一天我老板说这种方式太入侵了你必须使用注解,所以我找到了这样的东西:Spring RabbitMQ - using manual channel acknowledgement on a service with @RabbitListener configuration
我可以在哪里使用注释
@RabbitListener(queues = "so38728668")
public void receive(String payload, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag)
throws IOException {
但是我怎样才能将@RabbitListener 封装到一个高层次,以在我的第一个代码示例中结合我自己的重新发送消息代码,例如有一个注释作为RabbitResenderListener
@RabbitResenderListener(queues = "so38728668")
public void receive(Message msg)
throws IOException {
// just do biz
}
这个注解赋予方法重新发送消息和错误处理能力,使该方法只做商业。谢谢
【问题讨论】:
标签: rabbitmq spring-cloud spring-amqp spring-rabbit