目录
2.使用 Exchanges (交换机)and Queues(队列)
Raabit MQ 使用AMQP 0-9-1协议,AMQP 0-9-1(Advanced Message Queuing Protocol)高级消息队列协议是一个消息协议,它支持符合标准的客户端请求程序与符合标准的消息中间件代理进行通信。
Raabit MQ 分为 接收消息客户端(简称消费者) 和 发布消息服务端(简称生产者),通过生产者发布消息到消费者接收,可以使用不同的消息类型,生产者和消费者可以不必在同一个服务器上。
1.连接到AMQP 代理
ConnectionFactory factory = new ConnectionFactory();
factory.setUsername(userName); // 连接的用户名
factory.setPassword(password); // 连接的密码
factory.setVirtualHost(virtualHost); // 连接的虚拟机
factory.setHost(hostName); // 主机IP
factory.setPort(portNumber); // 连接端口
Connection conn = factory.newConnection();
注意 : 关闭连接的时候,只需关闭通道和连接
Channel channel = conn.createChannel();
channel.close(); // 通道关闭
conn.close(); // 连接关闭
当然那你也可以选择不关闭通道,因为当底层连接关闭后,任何情况下通道都会自动的关闭。
2.使用 Exchanges (交换机)and Queues(队列)
channel.exchangeDeclare(exchangeName, "direct", true); // 声明交换机(
channel.queueDeclare(queueName, true, false, false, null);; // 声明队列
channel.queueBind(queueName, exchangeName, routingKey); // 根据routingKey把队列绑定到交换机。
3.发布消息(Publishing messages)
要将消息发布到交换机中,使用 Channel.basicPublish 方法
byte[] messageBodyBytes = "Hello, world!".getBytes();
channel.basicPublish(exchangeName, routingKey, null, messageBodyBytes);
4.消息确认
boolean autoAck = false;
channel.basicConsume(queueName, autoAck, "myConsumerTag",
new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag,
Envelope envelope,
AMQP.BasicProperties properties,
byte[] body) throws IOException{
String routingKey = envelope.getRoutingKey();
String contentType = properties.getContentType();
long deliveryTag = envelope.getDeliveryTag();
channel.basicAck(deliveryTag, false);
}
});
因为我们指定了autoAck=false,有必要确认消息传递给消费者。
默认情况下消息消费者是自动 ack (确认)消息的。
消费者还可以实现handleCancelOk 和handleCancel 方法,分别通知显式和隐式取消。
channel.basicCancel(consumerTag);
消费者和接收者根据需求设置ack消息。