学习RabbitMQ(第六章)

                                      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);
	}

}
发布了38 篇原创文章 · 获赞 1 · 访问量 2809

猜你喜欢

转载自blog.csdn.net/qq_31741189/article/details/102324414