RabbitMQ:体验官方的HelloWorld的Demo(分析并发现)

1.声明

当前内容用于本人学习和使用RabbitMQ,当前来源为官方例子:官方的Hello World例子

2.官方的demo

通过前面的查看官方的ui界面发现了:Connections、Channels、Exchanges、Queues、Consumners这几个,所以查询的时候,首先应该创建Connection和Chanels,操作的时候需要指定Exchange和Queue

消息发送者

public static void main(String[] args) throws Exception {
		// 1.创建连接工厂,并配置连接当前RabbitMQ的主要参数
		ConnectionFactory factory = new ConnectionFactory();
		factory.setHost("localhost");
		// 2. 通过连接工厂创建连接,通过连接创建句柄
		try (Connection connection = factory.newConnection(); Channel channel = connection.createChannel()) {
			// 3. 通过句柄声明当前需要操作的Queue,需要使用名称和参数
			channel.queueDeclare(QUEUE_NAME, false, false, false, null);
			String message = "Hello World!";
			// 4.通过句柄开始推送消息,exchange为"",routingKey名称为hello,basicProperties为null,发送的二进制数据
			channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
			System.out.println(" [x] Sent '" + message + "'");
		}
	}

消息接收者

public static void main(String[] args) throws Exception {
		// 1.创建连接工厂,并配置连接当前RabbitMQ的主要参数
		ConnectionFactory factory = new ConnectionFactory();
		factory.setHost("localhost");
		// 2. 通过连接工厂创建连接,通过连接创建句柄
		Connection connection = factory.newConnection();
		Channel channel = connection.createChannel();
		// 3. 通过句柄声明当前需要操作的Queue,需要使用名称和参数
		channel.queueDeclare(QUEUE_NAME, false, false, false, null);
		System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
		// 4.创建消费者回调
		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 -> {
		});
	}

3.操作结果

在这里插入图片描述
在这里插入图片描述

4.分析上面的demo

通过上面代码发现,基本操作中具有

  1. 创建连接工厂(ConnectionFactory)
  2. 创建连接(Connection)
  3. 创建句柄 (Channel)
  4. 执行操作
    其中执行操作分别为发送数据和接收数据(处理数据)
    分析发现当前消息发送者和消息接收者中使用的内容刚好就是ui界面显示的内容

分析其实前面三个是重复的,所以可以将前面三个合并在一个创建一个工具类(需要注意消息接收者不能关闭连接和句柄)

5.工具类(初步)

ublic class RabbitMqUtils {
	private final String host;
	private final int port;
	private final String username;
	private final String password;
	private final ConnectionFactory factory;
	private static final String DEFAULT_USERNAME = "guest";
	private static final String DEFAULT_PASSWORD = "guest";
	private static final int DEFAULT_PORT = 5672;
	private static final String DEFAULT_HOST = "localhost";

	public RabbitMqUtils(String host, int port) {
		this(host, port, DEFAULT_USERNAME, DEFAULT_PASSWORD);
	}

	public RabbitMqUtils() {
		this(DEFAULT_HOST, DEFAULT_PORT);
	}

	public RabbitMqUtils(String host, int port, String username, String password) {
		this.host = host;
		this.port = port;
		this.username = username;
		this.password = password;
		this.factory = new ConnectionFactory();
		initConfig();
	}

	private void initConfig() {
		factory.setHost(host);
		factory.setPort(port);
		factory.setUsername(username);
		factory.setPassword(password);
	}

	public boolean send(final String exchange, final String queue, final String msg) {
		try (Connection connection = factory.newConnection(); Channel channel = connection.createChannel()) {
			channel.queueDeclare(queue, false, false, false, null);
			channel.basicPublish(exchange, queue, null, msg.getBytes());
			return true;
		} catch (IOException | TimeoutException e) {
			e.printStackTrace();
			return false;
		}
	}

	public void reciver(final String queue, DeliverCallback deliverCallback) throws Exception {
		Connection connection = factory.newConnection();
		Channel channel = connection.createChannel();
		channel.queueDeclare(queue, false, false, false, null);
		channel.basicConsume(queue, true, deliverCallback, consumerTag -> {
		});
	}

}

该工具类实际上并没有多少简化的操作

6.简化前面的操作

消息发送者

private final static String QUEUE_NAME = "hello";

	@Test
	public void testSender() {
		RabbitMqUtils mqUtils = new RabbitMqUtils();
		mqUtils.send("", QUEUE_NAME, "你好,世界!");
	}

消息接收者

private final static String QUEUE_NAME = "hello";

	public static void main(String[] args) throws Exception {
		RabbitMqUtils mqUtils = new RabbitMqUtils();
		mqUtils.reciver(QUEUE_NAME, (consumerTag, delivery) -> {
			System.out.println(new String(delivery.getBody(), "utf-8"));
		});
	}

使用结果

在这里插入图片描述
在这里插入图片描述

7.分析当前的生产者消费者之间的路径

在这里插入图片描述
这个是官方的图片,我们通过这个图片发现了一个有趣的现象

  1. 生产者将消息推送到exchange这个交换机中
  2. 交换机将消息转发到queue这个队列中
  3. 然后客户端实际上是通过queue中获取数据信息的

通过这个发现前面中的生产者为什么需要exchange和queue(发送的时候需要通过exchange转发到queue)

这就是为什么消费者只需要queue就可以了,而并不需要exchange

8.总结

1.通过一个非常简单的HelloWorld的demo发现,在RabbitMQ中的操作基本上就是当前ui界面中的东西

2.发送消息需要使用basicPublish方式推送消息,消息接收者需要使用basicConsume方式接收,并且消息接收者需要进行数据回调处理

以上纯属个人见解,如有问题请联系本人!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值