1、发送消息
使用Channel的basicPublish方法,向RabbitMQ发送消息。
(1) void basicPublish(String exchange, String routingKey, BasicProperties props, byte[] body) throws IOException;
(2) void basicPublish(String exchange, String routingKey, boolean mandatory, BasicProperties props, byte[] body) throws IOException;
(3) void basicPublish(String exchange, String routingKey, boolean mandatory, boolean immediate, BasicProperties props, byte[] body) throws IOException;
其中一些参数具体作用:
exchange:交换器名称
routingKey:路由键值
props:消息的一些基本属性
body:消息体
mandatory与immediate:当消息无法路由到队列或者路由到的队列上没有消费者时,如何处理?
2、消费消息
消费消息有两种模式:推(basicConsume())/拉(basicGet())。
(一)推模式:
- String basicConsume(String queue, Consumer callback) throws IOException;
channel.basicConsume(QUEUE_NAME, new DefaultConsumer(channel) { @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { System.out.println(\"消费者接收到:\" + new String(body)); // 告诉服务器,我收到消息了 channel.basicAck(envelope.getDeliveryTag(), false); } }); - String basicConsume(String queue, boolean autoAck, Consumer callback) throws IOException;
- String basicConsume(String queue, boolean autoAck, Map<String, Object> arguments, Consumer callback) throws IOException;
- String basicConsume(String queue, boolean autoAck, String consumerTag, Consumer callback) throws IOException;
- String basicConsume(String queue, boolean autoAck, String consumerTag, boolean noLocal, boolean exclusive, Map<String, Object> arguments, Consumer callback) throws IOException;
其中一些参数具体作用:
- autoAck:是否自动确认,false表示不自动确认;
- consumerTag:消费者标签,用来区分多个消费者;
- noLocal:设置为true则表示不能将同一个Connection中生产者的消息传送给这个Connection中的消费者;
- exclusive:设置是否排他;
- arguments:设置消费的其他参数;
- callback:设置消息的回调函数。用来处理RabbitMQ推送过来的消息
(二)拉模式
GetResponse basicGet(String queue, bollean autoAck) throws IOException;
Address[] addresses = new Address[] {new Address(\"192.168.0.1\", 5672)};
ConnectionFactory factory = new ConnectionFactory();
factory.setUsername(\"rabbitstudy\");
factory.setPassword(\"123456\");
Connection connection = factory.newConnection(addresses);
Channel channel = connection.createChannel();
GetResponse basicGet = channel.basicGet(QUEUE_NAME, true);
System.out.println(new String(basicGet.getBody()));
channel.close();
connection.close();
Channel.basicGet()方法没有其他重载方法。其中queue代表队列名称,如果设置autoAck为false,那么同样需要调用cannel.basicAck来确认消息已被接收成功。
注意:
- channel.basicConsume()将Channel设置为接收模式,直到取消队列的订阅为止。在接收模式期间,RabbitMQ会不断地推送消息给消费者,当然推送消息的个数还是会受到Basic.Qos的限制。
- 拉模式每次只能获取到一条消息,如果有消息的话,会主动的去拉一条消息。它拉消息是一条一条的拉的,一次只能拉一条。basicGet不能用于for循环中代替basicConsume,因为这样性能非常的差。
版权声明
本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

