网站建设洛阳免费咨询身高问题

当前位置: 首页 > news >正文

网站建设洛阳,免费咨询身高问题,在广州注册公司需要什么资料,怎么连接网站的虚拟主机入门案例 需求#xff1a;使用简单模式完成消息传递 步骤#xff1a; 创建工程#xff08;生成者、消费者#xff09; 分别添加依赖 编写生产者发送消息 编写消费者接收消息
3.1.2. 添加依赖 往heima-rabbitmq的pom.xml文件中添加如下依赖#xff1a; dependenc…入门案例 需求使用简单模式完成消息传递 步骤 创建工程生成者、消费者 分别添加依赖 编写生产者发送消息 编写消费者接收消息
3.1.2. 添加依赖 往heima-rabbitmq的pom.xml文件中添加如下依赖 dependencygroupIdcom.rabbitmq/groupIdartifactIdamqp-client/artifactIdversion5.6.0/version/dependency3.2. 编写生产者 package com.itheima.producer;import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory;import java.io.IOException; import java.util.concurrent.TimeoutException;/*** 发送消息/ public class Producer_HelloWorld {public static void main(String[] args) throws IOException, TimeoutException {///建立连接工厂ConnectionFactory factory new ConnectionFactory();// 设置参数factory.setHost(localhost); //默认值为localhostfactory.setPort(5672); //端口 默认值 5672factory.setVirtualHost(/chengpeng);// 虚拟机 默认 /factory.setUsername(chengpeng); // 用户名 默认值 guestfactory.setPassword(chengpeng); // 密码 默认值 guest/// 创建连接 connectionConnection connection factory.newConnection();/// 创建ChannelChannel channel connection.createChannel();///创建队列 声明队列/** String queue, boolean durable, boolean exclusive, boolean autoDelete, MapString, Object arguments* queue:队列名称* durable:是否持久化当mq重启之后还在* exclusive* 一是否独占只能有一个消费者监听队列* 二当Connection关闭时是否删除队列* autoDelete是否自动删除 当没有Consumer时自动删除* arguments参数//// 如果没有一个名字叫helloworld的队列则会创建channel.queueDeclare(hello_world,true,false,false,null);//发送消息/** String exchange, String routingKey, AMQP.BasicProperties props, byte[] body** exchange:交换机名称简单模式下交换机会使用默认的* routingKey:路由名称 如果给默认的交换机需要给队列名称一样* props:配置信息* body: 发送消息数据/String body hello rabbitmq~~~~;channel.basicPublish(,hello_world,null,body.getBytes());/// 释放资源channel.close();connection.close();} }在执行上述的消息发送之后可以登录rabbitMQ的管理控制台可以发现队列和其消息
3.3. 编写消费者 抽取创建connection的工具类com.itheima.rabbitmq.util.ConnectionUtil package com.itheima.consumer;import com.rabbitmq.client.
;import java.io.IOException; import java.util.concurrent.TimeoutException;public class Consumer_HelloWorld {public static void main(String[] args) throws IOException, TimeoutException {///建立连接工厂ConnectionFactory factory new ConnectionFactory();// 设置参数factory.setHost(localhost); //默认值为localhostfactory.setPort(5672); //端口 默认值 5672factory.setVirtualHost(/chengpeng);// 虚拟机 默认 /factory.setUsername(chengpeng); // 用户名 默认值 guestfactory.setPassword(chengpeng); // 密码 默认值 guest/// 创建连接 connectionConnection connection factory.newConnection();/// 创建ChannelChannel channel connection.createChannel();///创建队列 声明队列/*** String queue, boolean durable, boolean exclusive, boolean autoDelete, MapString, Object arguments* queue:队列名称* durable:是否持久化当mq重启之后还在* exclusive* 一是否独占只能有一个消费者监听队列* 二当Connection关闭时是否删除队列* autoDelete是否自动删除 当没有Consumer时自动删除* arguments参数//// 如果没有一个名字叫helloworld的队列则会创建channel.queueDeclare(hello_world,true,false,false,null);//接收消息/** String queue, boolean autoAck, Consumer callback* queue: 队列名称* autoAck: 是否自动确认* callback: 回调对象/Consumer consumer new DefaultConsumer(channel){/** 回调方法当收到消息后会自动执行该方法* param consumerTag 标识* param envelope 获取一些信息交换机路由key..* param properties 配置信息* param body 数据* throws IOException*/Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {System.out.println(consumerTag:consumerTag);System.out.println(Exchange:envelope.getExchange());System.out.println(RoutingKey:envelope.getRoutingKey());System.out.println(properties:properties);System.out.println(body:new String(body));}};channel.basicConsume(hello_world,true,consumer);/// 释放资源//channel.close();//connection.close();} }3.4. 小结 在上图的模型中有以下概念 P生产者也就是要发送消息的程序C消费者消息的接受者会一直等待消息到来。queue消息队列图中红色部分。类似一个邮箱可以缓存消息生产者向其中投递消息消费者从其中取出消息。

  1. AMQP 4.1. 相关概念介绍 AMQP 一个提供统一消息服务的应用层标准高级消息队列协议是应用层协议的一个开放标准为面向消息的中间件设计。 AMQP是一个二进制协议拥有一些现代化特点多信道、协商式异步安全扩平台中立高效。 RabbitMQ是AMQP协议的Erlang的实现。 概念说明连接Connection一个网络连接比如TCP/IP套接字连接。会话Session端点之间的命名对话。在一个会话上下文中保证“恰好传递一次”。信道Channel多路复用连接中的一条独立的双向数据流通道。为会话提供物理传输介质。客户端ClientAMQP连接或者会话的发起者。AMQP是非对称的客户端生产和消费消息服务器存储和路由这些消息。服务节点Broker消息中间件的服务节点一般情况下可以将一个RabbitMQ Broker看作一台RabbitMQ 服务器。端点AMQP对话的任意一方。一个AMQP连接包括两个端点一个是客户端一个是服务器。消费者Consumer一个从消息队列里请求消息的客户端程序。生产者Producer一个向交换机发布消息的客户端应用程序。 4.2. RabbitMQ运转流程 在入门案例中 生产者发送消息 生产者创建连接Connection开启一个信道Channel连接到RabbitMQ Broker声明队列并设置属性如是否排它是否持久化是否自动删除将路由键空字符串与队列绑定起来发送消息至RabbitMQ Broker关闭信道关闭连接 消费者接收消息 消费者创建连接Connection开启一个信道Channel连接到RabbitMQ Broker向Broker 请求消费相应队列中的消息设置相应的回调函数等待Broker回应闭关投递响应队列中的消息消费者接收消息确认ack自动确认接收到的消息RabbitMQ从队列中删除相应已经被确认的消息关闭信道关闭连接 4.3. 生产者流转过程说明 客户端与代理服务器Broker建立连接。会调用newConnection() 方法,这个方法会进一步封装Protocol Header 0-9-1 的报文头发送给Broker 以此通知Broker 本次交互采用的是AMQPO-9-1 协议紧接着Broker 返回Connection.Start 来建立连接在连接的过程中涉及Connection.Start/.Start-OK 、Connection.Tune/.Tune-Ok Connection.Open/ .Open-Ok 这6 个命令的交互。客户端调用connection.createChannel方法。此方法开启信道其包装的channel.open命令发送给Broker,等待channel.basicPublish方法对应的AMQP命令为Basic.Publish,这个命令包含了content Header 和content Body()。content Header 包含了消息体的属性例如:投递模式优先级等content Body 包含了消息体本身。客户端发送完消息需要关闭资源时涉及到Channel.Close和Channl.Close-Ok 与Connetion.Close和Connection.Close-Ok的命令交互。 4.4. 消费者流转过程说明 消费者客户端与代理服务器Broker建立连接。会调用newConnection() 方法,这个方法会进一步封装Protocol Header 0-9-1 的报文头发送给Broker 以此通知Broker 本次交互采用的是AMQPO-9-1 协议紧接着Broker 返回Connection.Start 来建立连接在连接的过程中涉及Connection.Start/.Start-OK 、Connection.Tune/.Tune-Ok Connection.Open/ .Open-Ok 这6 个命令的交互。消费者客户端调用connection.createChannel方法。和生产者客户端一样协议涉及Channel . Open/Open-Ok命令。在真正消费之前消费者客户端需要向Broker 发送Basic.Consume 命令(即调用channel.basicConsume 方法〉将Channel 置为接收模式之后Broker 回执Basic . Consume - Ok 以告诉消费者客户端准备好消费消息。Broker 向消费者客户端推送(Push) 消息即Basic.Deliver 命令这个命令和Basic.Publish 命令一样会携带Content Header 和Content Body。消费者接收到消息并正确消费之后向Broker 发送确认即Basic.Ack 命令。客户端发送完消息需要关闭资源时涉及到Channel.Close和Channl.Close-Ok 与Connetion.Close和Connection.Close-Ok的命令交互。