org.springframework.amqp
spring-rabbit
1.4.6.RELEASE
(1)采用
(2)采用普通方式配置连接
常用参数解释:
durable:是否持久化
auto-delete:是否当没有连接时自动删除
exclusive:是否只能由创建者使用
(1)定义direct类型
(2)定义topic类型
(3)定义fanout类型
(4)定义headers类型
常用参数解释:
durable:是否持久化
auto-delete:是否当没有连接时自动删除
注意:在此例中,如果不把Exchange和queue进行绑定,发送消息的时候ConfirmCallback依然正常执行,因为消息到达了Exchange。但是ReturnCallback就会执行回调方法,传回错误信息:NO_ROUTE。Exchange没有找到指定的Queue,丢弃这条消息并把消息返回给生产者。回调顺序是ReturnCallback在前,ConfirmCallback在后。
(1)普通方式配置rabbitTemplate
(2)
常用参数解释:
mandatory:监听是否有符合的队列
confirm-callback:消息确认回调类
return-callback:mandatory监听结果回调类
encoding:编码
message-converter:消息转化类
(1)其他相关配置
常用参数解释:
prefetch:消息预取数目为每次接收10条。
acknowledge:acknowledge="manual":意为表示该消费者的ack方式为手动 ;acknowledge="auto"表示自动。
/**
* 发送消息到默认的交换机和队列(不带有自定义参数)
* @param messageObject 消息对象
* @return boolean 发送标记
*/
RabbitTemplate.convertAndSend(messageObject);
/**
* 发送消息到默认的交换机和队列
* @param messageObject 消息对象
* @param messageObject 自定义参数,在监听器ConfirmCallback中可以取到。
* @return boolean 发送标记
*/
RabbitTemplate.correlationConvertAndSend(messageObject,correlationdata);
/**
* 发送消息到指定的队列
* @param queue 队列名称
* @param messageObject 消息对象
* @param messageObject 自定义参数,在监听器ConfirmCallback中可以取到。
* @return boolean 发送标记
*/
RabbitTemplate.convertAndSend(queue, messageObject,correlationdata);
/**
* 发送消息到指定的交换机和队列
* @param exchange 交换机名称
* @param queue 队列名称
* @param messageObject 自定义参数,在监听器ConfirmCallback中可以取到。
* @return boolean 发送标记
*/
RabbitTemplate.convertAndSend(exchange,queue,messageObject,correlationdata);
/**
* 发送消息到默认的交换机和队列(不带有自定义参数)
Send方法还有很多,此处只列举一种
* @param Message AMQP封装的消息对象
* @return void
*/
RabbitTemplate.send(Message message);
没有convert的需要自己将发送的对象转换为Message对象。
public class ConfirmReturnBack implements ConfirmCallback{
/**
* Confirmation callback.
* @param correlationData 回调的相关数据.
* @param ack true for ack, false for nack
* @param cause 专门给NACK准备的一个可选的原因,其他情况为null。
*/
public void confirm(CorrelationData correlationdata, boolean ack, String cause) {
System.out.println("Exchange接收是否成功(ack): " + ack + "。 返回的用户参数(correlationData): " + correlationdata + "。NACK原因(cause) : " + cause);
}
}
注意:CorrelationData 是在发送消息时传入回调方法的参数,可以用于区分消息对象。 CorrelationData对象中只有一个属性 String id。通过这个参数,我们可以区分当前是发送哪一条消息时的回调,并通过ack参数来进行失败重发功能。
/**
* 实现此方法在basicpublish失败时回调
* 相当于 ReturnListener的功能。
* 在发布消息时设置mandatory等于true,
* 监听消息是否有相匹配的队列,没有时ReturnCallback将执行returnedMessage方法,消息将返给发送者
*/
public class MyReturnCallback implements ReturnCallback {
public void returnedMessage(Message message, int replyCode, String replyText,
String exchange, String routingKey) {
try {
System.out.println("消息发送进指定队列失败:失败原因(+replyText):"+replyText
+";错误代码(replyCode):"+replyCode
+";消息对象:"+new String(message.getBody(),"UTF-8")
+"exchange:"+exchange
+"routingKey:"+routingKey);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
/**
* 消息到达消费者监听类
*/
public class MessageConsumer implements ChannelAwareMessageListener {
/**
* 处理收到的rabbit消息的回调方法。
* @param message AMQP封装消息对象
* @param channel 信道对象,可以进行确认回复
* @throws Exception Any.
*/
public void onMessage(Message message, Channel channel) throws Exception {
try {
String srt2=new String(message.getBody(),"UTF-8");
System.out.println("消费者收到消息:"+srt2);
//成功应答
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
} catch (Exception e) {
e.printStackTrace();
//失败应答
channel.basicReject(message.getMessageProperties().getDeliveryTag(), true);
}
}
}
注意:ChannelAwareMessageListener和MessageListener两个接口都实现对消息到达消费者时的监听,只不过MessageListener的onMessage方法没有Channel参数,不能实现消息手动应答功能。
Spring整合RabbitMQ完整项目源码.rar
上一篇文章:《RabbitMQ学习(二):Java使用RabbitMQ》
【四川乐山程序员联盟,欢迎大家加群相互交流学习5 7 1 8 1 4 7 4 3】