RabbitMQ交换机
RabbitMQ包含四种不同的交换机类型:
Direct exchange:直连交换机,转发消息到routigKey指定的队列
生产者发送消息到交换机并指定一个路由key,消费者队列绑定到交换机时要指定路由key (key匹配就能接受消息,可以不匹配就不能接受消息)
例如: 我们可以把路由key设置为insert,那么消费者队列key指定包含insert才可以接收消息,消费者队列key定义为update或者delete就不能接受消息。很好的控制了更新,插入和删除的操作。
Fanout exchange:扇形交换机,转发消息到所有绑定队列(速度最快)
生产者绑定交换机,发送消息,由消费绑定同一个交换机,并创建队列,如果当前队列不存在,则生产者发送的消息则会丢失,交换机不会缓存消息,交换机的类型则设置为fanout
Topic exchange:主题交换机,按规则转发消息(最灵活)
Headers exchange:首部交换机 (未接触)
Fanout交换机使用
首先还是创建一个连接
package com.utils;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class MQConnectionUtils {
//创建新的MQ连接
public static Connection newConnection() throws IOException, TimeoutException {
//1.创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
//2.设置连接地址
factory.setHost("127.0.0.1");
//3.设置用户名称
factory.setUsername("user");
//4.设置用户密码
factory.setPassword("user");
//5.设置amqp协议端口号
factory.setPort(5672);
//设置virtualHost地址
factory.setVirtualHost("/adminzrf");
return (Connection) factory.newConnection();
}
}
创建生产者和使用交换机
package com.fanout;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.utils.MQConnectionUtils;
//生产者 交换机类型 producerFanout类型
public class FanoutProducer {
//交换机名称
private static final String DESTINATION_NAME="my_fanout_destination";
public static void main(String[] args) throws IOException, TimeoutException {
//1.建立mq连接
Connection connection = MQConnectionUtils.newConnection();
//2.创建通道
Channel channel = connection.createChannel();
//3.生产者绑定交换机 参数1 交换机名称 参数2交换机类型
channel.exchangeDeclare(DESTINATION_NAME,"fanout");
//4.创建对应的消息
String msg = "my_fanout_destination_msg";
// 5. 发送消息
channel.basicPublish(DESTINATION_NAME, "", null, msg.getBytes());
System.out.println("发送消息成功:"+msg);
// 6.关闭通道,连接
channel.close();
connection.close();
}
}
创建邮件消费者
package com.consumer;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.AMQP.BasicProperties;
import com.utils.MQConnectionUtils;
public class ConsumerEmailFanout {
private static final String EAMIL_QUEUE = "eamil_queue_fanout";
public static void main(String[] args) throws IOException, TimeoutException {
//1.建立mq连接
Connection connection = MQConnectionUtils.newConnection();
//2.创建通道
Channel channel = connection.createChannel();
//消费者声明队列
channel.queueDeclare(EAMIL_QUEUE, false, false, false, null);
//4.消费者队列绑定交换机
channel.queueBind(EAMIL_QUEUE, "my_fanout_destination", "");
// 5.消费者监听消息
DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
throws IOException {
String msg = new String(body,"UTF-8");
System.out.println("邮件消费者获取生产消息:"+msg);
}
};
channel.basicConsume(EAMIL_QUEUE,true, defaultConsumer);
}
}
创建短信消费者
package com.consumer;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.AMQP.BasicProperties;
import com.utils.MQConnectionUtils;
public class ConsumerSmslFanout {
private static final String SMS_QUEUE = "sms_queue_fanout";
public static void main(String[] args) throws IOException, TimeoutException {
//1.建立mq连接
Connection connection = MQConnectionUtils.newConnection();
//2.创建通道
Channel channel = connection.createChannel();
//消费者声明队列
channel.queueDeclare(SMS_QUEUE, false, false, false, null);
//4.消费者队列绑定交换机
channel.queueBind(SMS_QUEUE, "my_fanout_destination", "");
// 5.消费者监听消息
DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
throws IOException {
String msg = new String(body,"UTF-8");
System.out.println("短信发送的消息:"+msg);
}
};
//设置自动签收
channel.basicConsume(SMS_QUEUE,true, defaultConsumer);
}
}
Direct交换机使用
生产者:
package com.fanout;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.utils.MQConnectionUtils;
//生产者 交换机类型 producerFanout类型
public class RoutingProducer {
//交换机名称
private static final String DESTINATION_NAME="my_routing_destination";
public static void main(String[] args) throws IOException, TimeoutException {
//1.建立mq连接
Connection connection = MQConnectionUtils.newConnection();
//2.创建通道
Channel channel = connection.createChannel();
//3.生产者绑定交换机 参数1 交换机名称 参数2交换机类型
channel.exchangeDeclare(DESTINATION_NAME,"direct");
//4.创建对应的消息
String msg = "my_fanout_destination_msg";
// 5. 发送消息 参数1 交换机名称 参数2是 routingkey
channel.basicPublish(DESTINATION_NAME, "email", null, msg.getBytes());
System.out.println("发送消息成功:"+msg);
// 6.关闭通道,连接
channel.close();
connection.close();
}
}
邮件消费者:
package com.direct;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.AMQP.BasicProperties;
import com.utils.MQConnectionUtils;
public class ConsumerEmailFanout {
private static final String EAMIL_QUEUE = "eamil_routing_fanout";
//交换机名称
private static final String DESTINATION_NAME="my_routing_destination";
public static void main(String[] args) throws IOException, TimeoutException {
//1.建立mq连接
Connection connection = MQConnectionUtils.newConnection();
//2.创建通道
Channel channel = connection.createChannel();
//消费者声明队列
channel.queueDeclare(EAMIL_QUEUE, false, false, false, null);
//4.消费者队列绑定交换机
channel.queueBind(EAMIL_QUEUE, DESTINATION_NAME, "email");
// 5.消费者监听消息
DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
throws IOException {
String msg = new String(body,"UTF-8");
System.out.println("邮件消费者获取生产消息:"+msg);
}
};
channel.basicConsume(EAMIL_QUEUE,true, defaultConsumer);
}
}
短信消费者:
package com.direct;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.AMQP.BasicProperties;
import com.utils.MQConnectionUtils;
public class ConsumerSmslFanout {
private static final String SMS_QUEUE = "sms_routing_fanout";
//交换机名称
private static final String DESTINATION_NAME="my_routing_destination";
public static void main(String[] args) throws IOException, TimeoutException {
//1.建立mq连接
Connection connection = MQConnectionUtils.newConnection();
//2.创建通道
Channel channel = connection.createChannel();
//消费者声明队列
channel.queueDeclare(SMS_QUEUE, false, false, false, null);
//4.消费者队列绑定交换机
channel.queueBind(SMS_QUEUE, DESTINATION_NAME, "sms");
// 5.消费者监听消息
DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
throws IOException {
String msg = new String(body,"UTF-8");
System.out.println("短信发送的消息:"+msg);
}
};
//设置自动签收
channel.basicConsume(SMS_QUEUE,true, defaultConsumer);
}
}