java Rabbitmq,从客户端接收消息
我有一个简单的生产者和接受者类来使用rabbitmq
制作人:
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.FANOUT);
String message = getMessage(argv);
channel.basicPublish(EXCHANGE_NAME, "", null, message.getBytes("UTF-8"));
System.out.println(" [x] Sent '" + message + "'");
channel.close();
connection.close();
}
和接收人:
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.FANOUT);
String queueName = channel.queueDeclare().getQueue();
channel.queueBind(queueName, EXCHANGE_NAME, "");
System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
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(" [x] Received '" + message + "'");
}
};
channel.basicConsume(queueName, true, consumer);
}
问题是,制作人是否有可能知道是接收者接收了信息。例如:
channel.sendAndReceiveMessage(EXCHANGE_NAME, "", null, message.getBytes("UTF-8"));
System.out.println(" [x] Sent '" + message + "'");
# 1 楼答案
Short answser:你没有直接的方式让制作人知道消费者确认了信息 长一点: 您在此处发送的第二个参数: 频道基本消费(queueName、true、consumer); 是自动确认,将其设置为false将强制您进行频道设置。basicAck(deliveryTag,假);确认收到信息(您可以从信封中获取递送标签)或频道。basicNack告诉我有些事失败了 这是什么意思?这意味着,如果您不确认消息,它将返回队列并等待再次被消费,这样,您就可以确保所有消息都被消费