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

山东川畅信息技术有限公司网站建设武威网站seo

山东川畅信息技术有限公司网站建设,武威网站seo,iis做的网站手机怎么访问,做网站运营经理的要求写在前面 本文看下rabbit mq的基础概念以及使用。 1:简单介绍 为了不同进程间通信的解耦,出现了消息队列,为了规范消息队列的具体实现,Java制定了jms规范,这是一套基于接口的规范,因此是绑定语言的&…

写在前面

本文看下rabbit mq的基础概念以及使用。

1:简单介绍

为了不同进程间通信的解耦,出现了消息队列,为了规范消息队列的具体实现,Java制定了jms规范,这是一套基于接口的规范,因此是绑定语言的,即只能通过Java语言来实现和使用,与jms类似还有基于net的nms,这也是一套规范接口,只不过是基于.net开发语言的。不管是jms还是nms,它们都有一个通病,就是无法实现跨语言,这个时候amqp就应用而生了,可以将其理解为一种应用层的协议,构建在tcp之上,因此就可以实现跨语言的消息通信,参考下图:
在这里插入图片描述

amqp协议通信模型如下:
在这里插入图片描述

2:基础环境准备

2.1:服务安装

参考docker安装rabbitmq 。

2.2:创建Virtual host和用户

  • 创建virtual host
    在这里插入图片描述
  • 创建admin用户
    在这里插入图片描述
  • 设置admin权限
    在这里插入图片描述
    添加成功:
    在这里插入图片描述

3:正戏

本文主要看其提供的5种队列,如下图:
在这里插入图片描述

3.1:简单队列

简单队列就是一个生产者一个消费者的队列方式,如下图:
在这里插入图片描述

  • 生产消息:
public class SimpleSend {private final static String QUEUE_NAME = "q_test_01";public static void main(String[] argv) throws Exception {// 获取到连接以及mq通道Connection connection = ConnectionUtil.getConnection();// 从连接中创建通道Channel channel = connection.createChannel();// 声明(创建)队列channel.queueDeclare(QUEUE_NAME, false, false, false, null);// 消息内容String message = "Hello World come here!!!";channel.basicPublish("", QUEUE_NAME, null, message.getBytes());System.out.println(" [x] Sent '" + message + "'");//关闭通道和连接channel.close();connection.close();}
}

生产后:
在这里插入图片描述
点击q_test_01:
在这里插入图片描述

  • 消费消息
public class SimpleRecv {private final static String QUEUE_NAME = "q_test_01";public static void main(String[] argv) throws Exception {// 获取到连接以及mq通道Connection connection = ConnectionUtil.getConnection();// 从连接中创建通道Channel channel = connection.createChannel();// 声明队列channel.queueDeclare(QUEUE_NAME, false, false, false, null);// 定义队列的消费者QueueingConsumer consumer = new QueueingConsumer(channel);// 监听队列 true 这里使用自动确认,及消息消费默认消费成功,这种方式效率高,但是容易丢失消息// 如果某些场景允许部分消息丢失,但是要求执行效率,则可以考虑将该值设置为true,否则设置为false,即手动确认// 最周通过执行channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);完成手动确认,多一次网络通信channel.basicConsume(QUEUE_NAME, true, consumer);// 获取消息while (true) {QueueingConsumer.Delivery delivery = consumer.nextDelivery();String message = new String(delivery.getBody());System.out.println(" [x] Received '" + message + "'");}}
}

输出:

[INFO] --- exec-maven-plugin:3.1.0:exec (default-cli) @ rabbitmq-study ---[x] Received 'Hello World come here!!!'

在这里插入图片描述

3.2:work队列

一个生产者多个消费者,如下图:
在这里插入图片描述

work队列看起来和简单队列相比只是多起了几个消费者而已。

  • 生产者
public class WorkSend {private final static String QUEUE_NAME = "test_queue_work";public static void main(String[] argv) throws Exception {// 获取到连接以及mq通道Connection connection = ConnectionUtil.getConnection();Channel channel = connection.createChannel();// 声明队列channel.queueDeclare(QUEUE_NAME, false, false, false, null);for (int i = 0; i < 100; i++) {// 消息内容String message = "" + i;channel.basicPublish("", QUEUE_NAME, null, message.getBytes());System.out.println(" [x] Sent '" + message + "'");Thread.sleep(i * 10);}channel.close();connection.close();}
}
  • 消费者
public class WorkRecv {private final static String QUEUE_NAME = "test_queue_work";public static void main(String[] argv) throws Exception {// 获取到连接以及mq通道Connection connection = ConnectionUtil.getConnection();Channel channel = connection.createChannel();// 声明队列channel.queueDeclare(QUEUE_NAME, false, false, false, null);// 同一时刻服务器只会发一条消息给消费者// 该值设置为1,配合手动确认,则可以实现一条一条消费,确认一条后消费下一条,且多个消费者时谁的消费能力强,谁消费的消息多// 消费者之间消费消息不相互影响channel.basicQos(1);// 定义队列的消费者QueueingConsumer consumer = new QueueingConsumer(channel);// 监听队列,false表示手动返回完成状态,true表示自动channel.basicConsume(QUEUE_NAME, false, consumer);
//        channel.basicConsume(QUEUE_NAME, true, consumer);// 获取消息while (true) {QueueingConsumer.Delivery delivery = consumer.nextDelivery();String message = new String(delivery.getBody());System.out.println(" [y] Received '" + message + "'");//休眠Thread.sleep(10);// 返回确认状态,注释掉表示使用自动确认模式channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);}}
}

3.3:订阅模式

这种这种模式可以实现一个消息同时被多个消费者消费(广播),但是具体的实现需要依赖于交换器exchange,生产者端将消息发送到交换器,之后消费者端只需要将某个消息队列绑定到交换器,交换器会将消息发送到绑定的所有队列,消费者端就可以从队列中获取到对应的消息,但需要注意一个队列的消息还是只可以获取一次,如下图们:
在这里插入图片描述

  • 生产者端
public class SubscribeSend {private final static String EXCHANGE_NAME = "test_exchange_fanout111";public static void main(String[] argv) throws Exception {// 获取到连接以及mq通道Connection connection = ConnectionUtil.getConnection();Channel channel = connection.createChannel();// 声明exchangechannel.exchangeDeclare(EXCHANGE_NAME, "fanout");// 消息内容String message = "Hello World!";channel.basicPublish(EXCHANGE_NAME, "", null, message.getBytes());System.out.println(" [x] Sent '" + message + "'");channel.close();connection.close();}
}

消费者端2个

public class SubscribeRecv {private final static String QUEUE_NAME = "test_queue_work1";private final static String EXCHANGE_NAME = "test_exchange_fanout111";public static void main(String[] argv) throws Exception {// 获取到连接以及mq通道Connection connection = ConnectionUtil.getConnection();Channel channel = connection.createChannel();// 声明队列channel.queueDeclare(QUEUE_NAME, false, false, false, null);// 绑定队列到交换机channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "");// 同一时刻服务器只会发一条消息给消费者channel.basicQos(1);// 定义队列的消费者QueueingConsumer consumer = new QueueingConsumer(channel);// 监听队列,手动返回完成channel.basicConsume(QUEUE_NAME, false, consumer);// 获取消息while (true) {QueueingConsumer.Delivery delivery = consumer.nextDelivery();String message = new String(delivery.getBody());System.out.println(" [Recv] Received '" + message + "'");Thread.sleep(10);channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);}}
}public class SubscribeRecv2 {private final static String QUEUE_NAME = "test_queue_work2";private final static String EXCHANGE_NAME = "test_exchange_fanout";public static void main(String[] argv) throws Exception {// 获取到连接以及mq通道Connection connection = ConnectionUtil.getConnection();Channel channel = connection.createChannel();// 声明队列channel.queueDeclare(QUEUE_NAME, false, false, false, null);// 绑定队列到交换机channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "");// 同一时刻服务器只会发一条消息给消费者channel.basicQos(1);// 定义队列的消费者QueueingConsumer consumer = new QueueingConsumer(channel);// 监听队列,手动返回完成channel.basicConsume(QUEUE_NAME, false, consumer);// 获取消息while (true) {QueueingConsumer.Delivery delivery = consumer.nextDelivery();String message = new String(delivery.getBody());System.out.println(" [Recv2] Received '" + message + "'");Thread.sleep(10);channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);}}
}
  • 启动2个消费者
    在这里插入图片描述

  • 启动生产者
    在这里插入图片描述

[INFO] --- exec-maven-plugin:3.1.0:exec (default-cli) @ rabbitmq-study ---[Recv2] Received 'Hello World!'[INFO] --- exec-maven-plugin:3.1.0:exec (default-cli) @ rabbitmq-study ---[Recv] Received 'Hello World!'

接着看下转换器和队列的绑定关系:
在这里插入图片描述

注意以下的问题:

1:因为交换器本身不具备数据存储的能力,所以如果是某个交换器上没有绑定任何的队列,则该消息将会丢失。
2:因为交换器本身不存储数据,所以在具体的消息队列绑定到交换器(即消费者启动前),不要生产消息到交换器,否则消息将会丢失。

3.4:路由模式

这种方式类似于订阅模式,也需要转换器作为中间商,但是并不会直接无脑的发送消息,而是会根据消费者额外指定的路由key,生产者在向转换器发送消息时会带着routeKey,消费者在消费消息时会指定自己期望的routeKey只有二者匹配时,才会从队列中消费对应的消息,l另外注意的时交换机类型设置为direct,如下图:
在这里插入图片描述

  • 生产者
public class RoutingSend {private final static String EXCHANGE_NAME = "test_exchange_direct123";public static void main(String[] argv) throws Exception {// 获取到连接以及mq通道Connection connection = ConnectionUtil.getConnection();Channel channel = connection.createChannel();// 声明exchange 设置交换器为direct,即路由模式channel.exchangeDeclare(EXCHANGE_NAME, "direct");// 消息内容String message = "Hello World!";// 设置路由key为"update",即只有对应队列上设置了update路由key的消费者才会消费到消息channel.basicPublish(EXCHANGE_NAME, "update", null, message.getBytes());System.out.println(" [x] Sent '" + message + "'");channel.close();connection.close();}
}
  • 2个消费者
public class RoutingRecv {private final static String QUEUE_NAME = "test_queue_work_route";private final static String EXCHANGE_NAME = "test_exchange_direct123";public static void main(String[] argv) throws Exception {// 获取到连接以及mq通道Connection connection = ConnectionUtil.getConnection();Channel channel = connection.createChannel();// 声明队列channel.queueDeclare(QUEUE_NAME, false, false, false, null);// 绑定队列到交换机 设置路由key为delete,updatechannel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "delete");channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "update");// 同一时刻服务器只会发一条消息给消费者channel.basicQos(1);// 定义队列的消费者QueueingConsumer consumer = new QueueingConsumer(channel);// 监听队列,手动返回完成channel.basicConsume(QUEUE_NAME, false, consumer);// 获取消息while (true) {QueueingConsumer.Delivery delivery = consumer.nextDelivery();String message = new String(delivery.getBody());System.out.println(" [x] Received '" + message + "'");Thread.sleep(10);channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);}}
}public class RoutingRecv2 {private final static String QUEUE_NAME = "test_queue_work_route2";private final static String EXCHANGE_NAME = "test_exchange_direct";public static void main(String[] argv) throws Exception {// 获取到连接以及mq通道Connection connection = ConnectionUtil.getConnection();Channel channel = connection.createChannel();// 声明队列channel.queueDeclare(QUEUE_NAME, false, false, false, null);// 绑定队列到交换机channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "delete");channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "insert");// 同一时刻服务器只会发一条消息给消费者channel.basicQos(1);// 定义队列的消费者QueueingConsumer consumer = new QueueingConsumer(channel);// 监听队列,手动返回完成channel.basicConsume(QUEUE_NAME, false, consumer);// 获取消息while (true) {QueueingConsumer.Delivery delivery = consumer.nextDelivery();String message = new String(delivery.getBody());System.out.println(" [x] Received '" + message + "'");Thread.sleep(10);channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);}}
}

在这里插入图片描述
在这里插入图片描述
先启动消费者再启动生产者测试可。
在这里插入图片描述

写在后面

参考文章列表

RabbitMQ使用教程(超详细)

docker安装rabbitmq

RabbitMq的一些概念,JMS、AMQP、MQ 。


文章转载自:
http://exempt.Lnnc.cn
http://scissel.Lnnc.cn
http://oh.Lnnc.cn
http://evernormal.Lnnc.cn
http://footgear.Lnnc.cn
http://forane.Lnnc.cn
http://damon.Lnnc.cn
http://laryngeal.Lnnc.cn
http://lg.Lnnc.cn
http://choanocyte.Lnnc.cn
http://ramee.Lnnc.cn
http://dentation.Lnnc.cn
http://gippy.Lnnc.cn
http://centilitre.Lnnc.cn
http://validation.Lnnc.cn
http://undistracted.Lnnc.cn
http://vance.Lnnc.cn
http://convocation.Lnnc.cn
http://redden.Lnnc.cn
http://caplet.Lnnc.cn
http://chloric.Lnnc.cn
http://quadrivalence.Lnnc.cn
http://rusty.Lnnc.cn
http://coyly.Lnnc.cn
http://liabilities.Lnnc.cn
http://ironmongery.Lnnc.cn
http://lunation.Lnnc.cn
http://galloping.Lnnc.cn
http://nondeductible.Lnnc.cn
http://teleological.Lnnc.cn
http://discourager.Lnnc.cn
http://falsidical.Lnnc.cn
http://toed.Lnnc.cn
http://conspiratress.Lnnc.cn
http://tulipomania.Lnnc.cn
http://calendry.Lnnc.cn
http://wafery.Lnnc.cn
http://siltstone.Lnnc.cn
http://encumber.Lnnc.cn
http://statued.Lnnc.cn
http://phut.Lnnc.cn
http://radioprotection.Lnnc.cn
http://crossbar.Lnnc.cn
http://grandly.Lnnc.cn
http://record.Lnnc.cn
http://cataleptiform.Lnnc.cn
http://templar.Lnnc.cn
http://prefectural.Lnnc.cn
http://photorpeater.Lnnc.cn
http://childly.Lnnc.cn
http://corrosively.Lnnc.cn
http://ilocano.Lnnc.cn
http://imploringly.Lnnc.cn
http://entrancing.Lnnc.cn
http://zapateado.Lnnc.cn
http://aicpa.Lnnc.cn
http://flammability.Lnnc.cn
http://beatify.Lnnc.cn
http://fullery.Lnnc.cn
http://ioc.Lnnc.cn
http://astrologian.Lnnc.cn
http://helicline.Lnnc.cn
http://orrin.Lnnc.cn
http://switch.Lnnc.cn
http://longevous.Lnnc.cn
http://bargee.Lnnc.cn
http://alors.Lnnc.cn
http://semicylinder.Lnnc.cn
http://gasteropodous.Lnnc.cn
http://valentinite.Lnnc.cn
http://guadalquivir.Lnnc.cn
http://chirr.Lnnc.cn
http://surfnet.Lnnc.cn
http://deliriant.Lnnc.cn
http://escalade.Lnnc.cn
http://recreance.Lnnc.cn
http://nabobism.Lnnc.cn
http://dumps.Lnnc.cn
http://pisciculturist.Lnnc.cn
http://calomel.Lnnc.cn
http://subaltern.Lnnc.cn
http://semicircumference.Lnnc.cn
http://malaprop.Lnnc.cn
http://harmlessly.Lnnc.cn
http://bobtail.Lnnc.cn
http://blagueur.Lnnc.cn
http://warn.Lnnc.cn
http://stingy.Lnnc.cn
http://tenesmus.Lnnc.cn
http://coenurus.Lnnc.cn
http://fluxionary.Lnnc.cn
http://enthymeme.Lnnc.cn
http://youngish.Lnnc.cn
http://periodontics.Lnnc.cn
http://diminishbb.Lnnc.cn
http://ultimatism.Lnnc.cn
http://strepsiceros.Lnnc.cn
http://panoramic.Lnnc.cn
http://ecuadorian.Lnnc.cn
http://nccw.Lnnc.cn
http://www.dt0577.cn/news/97363.html

相关文章:

  • 企业网站制作是什么如何做网络推广人员
  • 宜昌公司做网站安徽seo报价
  • 茂名市城市建设档案馆网站今日nba战况
  • 建站展示湛江今日头条
  • 深圳创意网站设计应用商店aso优化
  • 环影视界wordpress企业主题鄂州seo
  • bat 做招聘网站企业网站建设方案书
  • 怎么做网站301转向推广资源seo
  • 武汉网站被黑昆明长尾词seo怎么优化
  • 合肥网站建设套餐全国新冠疫苗接种率
  • 靖江做网站百度推广广告收费标准
  • 电商公司做网站seo刷排名软件
  • 哪里可学做网站上海搜索推广
  • wordpress上传apk网站快速优化排名方法
  • 手机网站怎么做SEO优化网络推广精准营销推广
  • 私人公司怎么做网站网络平台推广具体是怎么推广
  • 用pageadmin做的网站用什么虚拟主机号怎么做一个自己的网站
  • web网站开发框架排名外贸网站制作公司
  • 东莞虎门发现一例病例百度搜索关键词排名人工优化
  • 河南县网站建设公司雅虎日本新闻
  • 建筑招聘网站哪个好湖南网站设计外包费用
  • 网站界面设计教程cba排名最新排名
  • 农业企业网站建设谷歌广告推广
  • 曰本真人性做爰视频网站搜索排名优化策划
  • 网站死链怎么解决网站关键词上首页
  • 做网站具体指什么优化人员是什么意思
  • 电商网站推广渠道网站域名ip地址查询
  • 电商数据中台seo关键词排名软件流量词
  • 做的烂的大网站seo排名点击器原理
  • 南昌网站建设资讯免费软件下载网站有哪些