springamqp+rabbitmq总结
1. 消费端使用的序列化工具必须和发布端一致
2. spring提供了两个Message类, 一个是spring.messaging.message, 一个是spring.amqp.core.message, 两者都能做消息接收使用
3. springboot默认实例化的生产端实例化CachingConnectionFactory
消费端实例化SingleRabbitListenContainFactory
4. ack模式的设置(none, auto, manul), 以及拒绝后是否重发requeue设置, 是由消费端配置
5. exchage,queue的创建以及二者间绑定是由生产者创建的
6. 如果同一个工程中对同一配置项有不同的配置需求, 则需要手动的实例化CachingConnectionFactory或SingleRabbitListenContainFactory,手动设置配置项
7. 在springamqp中使用convertAndSendmessage其实是默认持久化消息的,至于Queue和Exchange的持久化与否要手动设置
一般情况下,我们会通过这种方式发送消息。
rabbitTemplate.convertAndSend(exchange, routeKey, message);
其中,调用了 convertAndSend(String exchange, String routingKey, final Object object) 方法。
@Override
public void convertAndSend(String exchange, String routingKey, final Object object) throws AmqpException {
convertAndSend(exchange, routingKey, object, (CorrelationData) null);
}
接着,用调用了 convertAndSend(String exchange, String routingKey, final Object object, CorrelationData correlationData) 方法。
public void convertAndSend(String exchange, String routingKey, final Object object, CorrelationData correlationData) throws AmqpException {
send(exchange, routingKey, convertMessageIfNecessary(object), correlationData);
}
此时,最关键的方法出现了,它是 convertMessageIfNecessary(final Object object)。
protected Message convertMessageIfNecessary(final Object object) {
if (object instanceof Message) {
return (Message) object;
}
return getRequiredMessageConverter().toMessage(object, new MessageProperties());
}
其中,关键的是 MessageProperties 类,它持久化的策略是 MessageDeliveryMode.PERSISTENT,因此它会初始化时默认消息是持久化的。
public class MessageProperties implements Serializable {
public MessageProperties() {
this.deliveryMode = DEFAULT_DELIVERY_MODE;
this.priority = DEFAULT_PRIORITY;
}
static {
DEFAULT_DELIVERY_MODE = MessageDeliveryMode.PERSISTENT;
DEFAULT_PRIORITY = Integer.valueOf(0);
}
}

浙公网安备 33010602011771号