springboot-rabbitmq ack的问题?

如何手动ack

- 网上的方式1:实现channelAwareMessageListener

	
	public class RabbitMsgReceiver implements ChannelAwareMessageListener{
	
	public void onMessage(Message message, Channel channel) throw Exception{
		System.out.println(JSON.toJSONString(message));
		//解决basicAck 首先设置basicAck 为false
		channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
		System.out.println("onMessage=" + new String(message.getBody()));
}
}
	

- 存在的问题:最近有个需求是使用消息转换器直接传输java对象

监听器的代理对象这样写的

	public class OrderHandler {
    
    public void handleMessage(Order order){
        System.out.println("===order======= " + "[id=" + order.getId() + "name=" + order.getName()
                + "content=" + order.getContent() + "]");
        //告诉服务器收到这条消息 已经被我消费了 可以在队列删掉 这样以后就不会再发了 否则消息服务器以为这条消息没处理掉 后续还会在发
    }
}

//监听容器的代码大致如下

 @Bean
    SimpleMessageListenerContainer container(ConnectionFactory conn) {
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(conn);
        container.setQueueNames(EMAIL_QUEUE);//监听的队列
        container.setConcurrentConsumers(1); //当前的消费者数量
        container.setMaxConcurrentConsumers(5); //  最大的消费者数量
        container.setDefaultRequeueRejected(true); //是否重回队列
        container.setAcknowledgeMode(AcknowledgeMode.MANUAL); //签收模式
        container.setExposeListenerChannel(true);


        //适配器方式添加监听器
        //MessageListenerAdapter adapter = new MessageListenerAdapter(new EmailMessageDelegate());
        //adapter.setDefaultListenerMethod("consumeMessage");
        //adapter.setMessageConverter(new Jackson2JsonMessageConverter());
        /**--------支持java对象转换-------------------------------
        Jackson2JsonMessageConverter jacksonConverter = new Jackson2JsonMessageConverter();
        DefaultJackson2JavaTypeMapper javaTypeMapper = new DefaultJackson2JavaTypeMapper();
        javaTypeMapper.setTrustedPackages("*");
        jacksonConverter.setJavaTypeMapper(javaTypeMapper);
        adapter.setMessageConverter(jacksonConverter);
        container.setMessageListener(adapter);
        return container;
         */
        Jackson2JsonMessageConverter jacksonConverter = new Jackson2JsonMessageConverter();
        DefaultJackson2JavaTypeMapper javaTypeMapper = new DefaultJackson2JavaTypeMapper();
        javaTypeMapper.setTrustedPackages("*");
        Map<String, Class<?>> idClassMapping = new HashMap<>();
        //idClassMapping.put("emailModel", EmailModel.class);
        idClassMapping.put("order", Order.class);
        javaTypeMapper.setIdClassMapping(idClassMapping);

        jacksonConverter.setJavaTypeMapper(javaTypeMapper);
        MessageListenerAdapter orderAdapter = new MessageListenerAdapter(new OrderHandler());
        orderAdapter.setMessageConverter(jacksonConverter);
        container.setMessageListener(orderAdapter);
        return container;
    }

发现在生产数据的时候会重复消费,不清楚在哪里怎么设置手动ack,知道的大佬,能不能告诉下小弟,不胜感激

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值