1. 使用事物
感觉一般用不到 不想研究
2. 发送ACK
发送ack机制保证了消息能够存储到队列中,但是由于需要等待确认 势必会对性能产生影响
try {
// 获取连接
Connection connection = factory.newConnection();
// 创建一个通道
Channel channel = connection.createChannel();
// 定义一个队列
channel.queueDeclare(QUEUE_NAME, false, false, false, arguments);
// 定义一个消息
String message = "Hello World!";
// 开启消息确定
channel.confirmSelect();
// 发布一条消息
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
// 等待消息发布成功确定
while(channel.waitForConfirms()){
System.out.println(" [x] Sent '" + message + "'");
}
} catch (TimeoutException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
3. 消费ACK
// 创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
// 设置ip
factory.setHost("127.0.0.1");
// 设置端口
factory.setPort(AMQP.PROTOCOL.PORT);
// 设置用户名
factory.setUsername("guest");
// 设置密码
factory.setPassword("guest");
// 新建一个长连接
Connection connection = factory.newConnection();
// 创建一个通道(一个轻量级的连接)
Channel channel = connection.createChannel();
// 声明一个队列
String QUEUE_NAME = "queue.priority";
System.out.println("Consumer Wating Receive Message");
// 仅能获取100条未ack数据
channel.basicQos(100);
// 创建消费者
Consumer consumer = new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
String message = new String(body, "UTF-8");
System.out.println(" [C] Received '" + message + "'");
channel.basicAck(envelope.getDeliveryTag(),false); // ack
}
};
// 订阅消息
channel.basicConsume(QUEUE_NAME, false, consumer); //设置为不自动ack