exchange
producer从不直接发送任何信息给队列,甚至不知道消息会发送到哪个队列中
生产者只能将消息发送给exchange,exchaage是一个很简单的模型,一方面接收生产者的消息,另一方面将它们放入队列
exchange知道如何处理它接收到 的消息,是放入特定的队列?还是放入多个队列?还是被丢弃,这些都是exchange中定义的类型
有多种类型的exchange,如 direct.topic,headers, fanout我们关注最后一个fanout,它广播收到的所有消息到所有的队列
临时队列
当我们连接到rabbitmq时需要一个新的空队列,这时我们可以随机创建一个队列,当我们断开消费者的时候,队列将会自动被删除
绑定bindings
我们已经创建了一个exchange和queue,接下来需要告诉exchange发送消息到队列中,exchange和queue之间的关系就叫binding
连接管理,错误处理
连接恢复,并发,metric collection
相关的练习代码如下
public class ReceiveLogs {
private static final String EXCHANGE_NAME = "logs";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
//随机给定队列名
String queueName = channel.queueDeclare().getQueue();
//建立binding
channel.queueBind(queueName, EXCHANGE_NAME, "");
System.out.println("[x] waiting for messages .to exit press c");
DeliverCallback deliverCallback = ((consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println("[x] received '" + message + "'");
});
channel.basicConsume(queueName, true, deliverCallback, consumerTag -> {
});
}
}
public class Recv {
private final static String QUEUE_NAME = "hello";
public static void main(String[] args) throws IOException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
System.out.println("[*] waiting for messages.");
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println(" [x] received '" + message + "'");
};
channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> {
});
}
}