一、fanout类型
(1)消息生产者
特点:不需要routing key,简称广播模式,所有消费者都可以收到信息
public class Produce {
private static final String EXCHANGE_NAME = "exchange_name";
public static void main(String[] args) throws Exception {
Channel channel = RabbitUtils.getChannel();
channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.FANOUT);
Scanner scanner = new Scanner(System.in);
while(true) {
String message = scanner.next();
channel.basicPublish(EXCHANGE_NAME, "", null, message.getBytes("UTF-8"));
System.out.println("message消息发送成功 = " + message);
}
}
}
(2)消息消费者
public class ReceiveLog1 {
private static final String EXCHANGE_NAME = "exchange_name";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("127.0.0.1");
factory.setUsername("guest");
factory.setPassword("guest");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
String queueName = channel.queueDeclare().getQueue();
channel.queueBind(queueName, EXCHANGE_NAME, "");
DeliverCallback deliverCallback = (consumerTag, message)->{
String mess = new String(message.getBody());
System.out.println("consumer1 消费的信息是 = " + mess);
};
CancelCallback cancelCallback = consumerTag -> {
System.out.println("consumer1 未消费的信息是 = " + consumerTag);
};
channel.basicConsume(queueName, true, deliverCallback, cancelCallback);
}
}
二、direct类型
特点:需要绑定routing key,队列和交换机的routing key值相同的队列才能收到消息
(1)消息生产者
public class ProduceDirect {
private static final String EXCHANGE_DIRECT = "exchange_direct";
public static void main(String[] args) throws Exception{
Channel channel = RabbitUtils.getChannel();
channel.exchangeDeclare(EXCHANGE_DIRECT, "direct");
Scanner scanner = new Scanner(System.in);
while (true) {
String message = scanner.next();
channel.basicPublish(EXCHANGE_DIRECT, "error", null, message.getBytes());
}
}
}
(2)消息消费者1
public class ReceiveDirect1 {
private static final String EXCHANGE_DIRECT = "exchange_direct";
public static void main(String[] args) throws Exception{
Channel channel = RabbitUtils.getChannel();
channel.exchangeDeclare(EXCHANGE_DIRECT, "direct");
channel.queueDeclare("console", false, false, false, null);
channel.queueBind("console", EXCHANGE_DIRECT, "info");
channel.queueBind("console", EXCHANGE_DIRECT, "waring");
DeliverCallback deliverCallback = (consumerTag, message) -> {
String mess = new String(message.getBody());
System.out.println("队列console接收到信息 = " + mess);
};
CancelCallback cancelCallback = consumerTag -> {
};
channel.basicConsume("console", true, deliverCallback, cancelCallback);
}
}
消息消费者2
public class ReceiveDirect2 {
private static final String EXCHANGE_DIRECT = "exchange_direct";
public static void main(String[] args) throws Exception{
Channel channel = RabbitUtils.getChannel();
channel.exchangeDeclare(EXCHANGE_DIRECT, "direct");
channel.queueDeclare("disk", false, false, false, null);
channel.queueBind("disk", EXCHANGE_DIRECT, "error");
DeliverCallback deliverCallback = (consumerTag, message) -> {
String mess = new String(message.getBody());
System.out.println("队列disk接收到信息 = " + mess);
};
CancelCallback cancelCallback = consumerTag -> {
};
channel.basicConsume("disk", true, deliverCallback, cancelCallback);
}
}
三、topic类型
特点:主题模式,可以通过routing key的值进行消息的消费,
* :代表一个单词
# :代表一个或者多个单词
(1)消息的生产者
public class ProduceTopic {
private static final String EXCHANGE_TOPIC = "exchange_topic";
public static void main(String[] args) throws Exception {
Channel channel = RabbitUtils.getChannel();
channel.exchangeDeclare(EXCHANGE_TOPIC, "topic");
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String message = scanner.next();
channel.basicPublish(EXCHANGE_TOPIC, "one.orange.rabbit", null,message.getBytes("UTF-8"));
}
}
}
(2)消息消费者1
public class Topic1 {
private static final String EXCHANGE_TOPIC = "exchange_topic";
public static void main(String[] args) throws Exception{
Channel channel = RabbitUtils.getChannel();
channel.exchangeDeclare(EXCHANGE_TOPIC, "topic");
channel.queueDeclare("Q1", false, false, false, null);
channel.queueBind("Q1", EXCHANGE_TOPIC, "*.orange.*");
DeliverCallback deliverCallback = (consumerTag, message) -> {
String s = new String(message.getBody(),"UTF-8");
//System.out.println("Q1消费的消息 = " + s +"---routingKey 是 = "+ message.getEnvelope().getRoutingKey());
System.out.println(s);
};
CancelCallback cancelCallback = consumerTag -> {
};
channel.basicConsume("Q1", true, deliverCallback, cancelCallback);
}
}
消息消费者2
public class Topic2 {
private static final String EXCHANGE_TOPIC = "exchange_topic";
public static void main(String[] args) throws Exception{
Channel channel = RabbitUtils.getChannel();
channel.exchangeDeclare(EXCHANGE_TOPIC, "topic");
channel.queueDeclare("Q2", false, false, false, null);
channel.queueBind("Q2", EXCHANGE_TOPIC, "*.*.rabbit");
channel.queueBind("Q2", EXCHANGE_TOPIC, "lazy.#");
DeliverCallback deliverCallback = (consumerTag, message) -> {
String s = new String(message.getBody(), "UTF-8");
//System.out.println("Q2消费的消息 = " + s +"---routingKey 是 = "+ message.getEnvelope().getRoutingKey());
System.out.println(s);
};
CancelCallback cancelCallback = consumerTag -> {
};
channel.basicConsume("Q2", true, deliverCallback, cancelCallback);
}
}