如何手动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;
}