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

商城网站开发哪家好app推广

商城网站开发哪家好,app推广,wordpress 菜单 锚点,完整的品牌推广方案RabbitMQ 是一个开源的消息中间件,实现了高级消息队列协议(AMQP),用于在分布式系统中进行消息传递。它能够在应用之间传递消息,解耦应用组件,提高系统的可伸缩性和可维护性。RabbitMQ 使用高级消息队列协议…

RabbitMQ 是一个开源的消息中间件,实现了高级消息队列协议(AMQP),用于在分布式系统中进行消息传递。它能够在应用之间传递消息,解耦应用组件,提高系统的可伸缩性和可维护性。RabbitMQ 使用高级消息队列协议(AMQP),这是一种开放的、标准化的协议,定义了消息格式、交换方式、队列管理等规范。拥有强大的社区支持,提供了广泛的文档和示例。它还支持插件机制,可以根据实际需求进行扩展。下面就对rabbitMQ进行实战。

官网:RabbitMQ: easy to use, flexible messaging and streaming — RabbitMQ

f6b6cbd4487045e1b2361c7d26bfbe21.png 

1. 基本概念

  • 消息队列:消息队列是一种在不同应用之间传递数据的机制。在RabbitMQ中,消息队列是通过Exchange(交换机)来进行消息路由的。
  • Exchange:Exchange负责将消息路由到一个或多个队列。RabbitMQ支持不同类型的Exchange,包括Direct、Fanout、Topic等。
  • Queue:Queue是消息的容器,消息在发送到Exchange后通过Routing Key被路由到一个或多个Queue中。

2. 使用场景

消息中间件经常被用来处理异步、削峰填谷,和多个组件之间进行解耦的作用。

  • 异步任务处理:RabbitMQ可以作为任务队列,将任务发布到队列中,然后由后台工作者异步处理。这在分布式系统中很常见,可以提高系统的响应速度。
  • 事件驱动架构:RabbitMQ可以用于实现事件驱动的架构,不同组件之间通过消息进行通信。当某个事件发生时,可以将消息发送到队列中,由其他组件进行消费。
  • 日志收集:RabbitMQ可以用于日志收集系统,应用程序将日志消息发送到队列中,日志收集器订阅队列并将日志保存到数据库或其他存储中。

3. RabbitMQ实战

3.1 rabbitMQ安装

这里演示使用docker-compose方式安装,创建一个docker-compose.yml文件并写入以下内容

version: '3'services:rabbitmq:image: "rabbitmq:management"container_name: "rabbitmq-container"ports:- "5672:5672"    # RabbitMQ 默认端口- "15672:15672"  # RabbitMQ 管理界面端口volumes:- "./rabbitmq-data:/var/lib/rabbitmq"  # 数据文件挂载environment:RABBITMQ_DEFAULT_USER: "rabbit"RABBITMQ_DEFAULT_PASS: "rabbit1qz"

执行命令拉取并启动容器

docker-compose up -d

80fdea88312c467aa1a0822d52a47e8c.png 执行命令查看docker容器是否正常

docker ps | grep rabbit

03ec8572cb2a4f09958874359a523ef3.png

 然后地址栏http://localhost:15672/访问rabbitMQ管理界面

4d6ab83fd04740a0bcfeaf9defb407e5.png输入用户名密码可以看到如下界面,在这个页面上可以创建Exchanges和Queue,这里就不赘述了,大家想了解的可以参考官方文档。

e4a6faaa568445d1b45a20adc2c2fc5b.png 

3.1 代码集成

上面安装完MQ组件之后,就可以用java代码进行连接测试了。使用Maven添加RabbitMQ的Java客户端库到项目里:

<dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.14.0</version> <!-- 替换为最新版本 -->
</dependency>

 

3.2 发送消息

import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Channel;public class MessageSender {private final static String QUEUE_NAME = "hello";public static void main(String[] argv) throws Exception {// 创建连接工厂ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost"); // RabbitMQ服务器地址// 创建连接try (Connection connection = factory.newConnection(); Channel channel = connection.createChannel()) {// 声明队列channel.queueDeclare(QUEUE_NAME, false, false, false, null);// 发送消息String message = "Hello, RabbitMQ!";channel.basicPublish("", QUEUE_NAME, null, message.getBytes());System.out.println(" [x] Sent '" + message + "'");}}
}

 

3.3 接收消息

import com.rabbitmq.client.*;public class MessageReceiver {private final static String QUEUE_NAME = "hello";public static void main(String[] argv) throws Exception {// 创建连接工厂ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost"); // RabbitMQ服务器地址// 创建连接try (Connection connection = factory.newConnection(); Channel channel = connection.createChannel()) {// 声明队列channel.queueDeclare(QUEUE_NAME, false, false, false, null);// 定义消息处理器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 -> {});// 持续监听队列,不会退出System.out.println(" [*] Waiting for messages. To exit press Ctrl+C");Thread.sleep(Long.MAX_VALUE);}}
}

 

以上示例中,MessageSender类用于发送消息到名为"hello"的队列,而MessageReceiver类用于监听该队列并接收消息。

4. RabbitMQ高级特性

RabbitMQ 提供了许多高级特性,包括持久化、消息确认、事务、死信队列等。下面将结合 Java 完整代码进行说明这些高级特性。

1. 持久化

持久化确保在 RabbitMQ 服务器重启时,队列和消息不会丢失。

代码示例

// 发布者代码
public class DurableProducer {// ...初始化 RabbitMQ 连接等代码...public void publishPersistentMessage(String message) {channel.basicPublish("", "durable_queue", MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());System.out.println(" [x] Sent '" + message + "'");}
}// 订阅者代码
public class DurableSubscriber {// ...初始化 RabbitMQ 连接等代码...public void subscribeToPersistentMessages() {channel.queueDeclare("durable_queue", true, false, false, null);channel.basicConsume("durable_queue", true, (consumerTag, delivery) -> {String message = new String(delivery.getBody(), "UTF-8");System.out.println(" [x] Received '" + message + "'");// 处理消息的逻辑...}, consumerTag -> {});}
}

 

2. 消息确认

消息确认确保消息已经被消费者成功处理。

代码示例

// 发布者代码
public class AckProducer {// ...初始化 RabbitMQ 连接等代码...public void publishAckMessage(String message) {channel.basicPublish("", "ack_queue", null, message.getBytes());System.out.println(" [x] Sent '" + message + "'");}
}// 订阅者代码
public class AckSubscriber {// ...初始化 RabbitMQ 连接等代码...public void subscribeToAckMessages() {channel.queueDeclare("ack_queue", false, false, false, null);channel.basicConsume("ack_queue", false, (consumerTag, delivery) -> {String message = new String(delivery.getBody(), "UTF-8");System.out.println(" [x] Received '" + message + "'");// 处理消息的逻辑...// 手动发送消息确认channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);}, consumerTag -> {});}
}

 

3. 事务

RabbitMQ 支持事务,但由于性能问题,通常建议使用消息确认代替。

代码示例

// 发布者代码
public class TransactionalProducer {// ...初始化 RabbitMQ 连接等代码...public void publishTransactionalMessage(String message) throws IOException {try {channel.txSelect(); // 开启事务channel.basicPublish("", "transactional_queue", null, message.getBytes());System.out.println(" [x] Sent '" + message + "'");channel.txCommit(); // 提交事务} catch (IOException e) {channel.txRollback(); // 回滚事务e.printStackTrace();}}
}// 订阅者代码
public class TransactionalSubscriber {// ...初始化 RabbitMQ 连接等代码...public void subscribeToTransactionalMessages() {try {channel.queueDeclare("transactional_queue", false, false, false, null);while (true) {channel.txSelect(); // 开启事务GetResponse response = channel.basicGet("transactional_queue", true);if (response != null) {String message = new String(response.getBody(), "UTF-8");System.out.println(" [x] Received '" + message + "'");// 处理消息的逻辑...channel.txCommit(); // 提交事务} else {channel.txRollback(); // 回滚事务}}} catch (IOException e) {e.printStackTrace();}}
}

 

4. 死信队列

死信队列用于处理无法被消费者成功处理的消息。

代码示例

// 发布者代码
public class DeadLetterProducer {// ...初始化 RabbitMQ 连接等代码...public void publishDeadLetterMessage(String message) {Map<String, Object> headers = new HashMap<>();headers.put("x-dead-letter-exchange", "dead_letter_exchange");headers.put("x-dead-letter-routing-key", "dl_queue");AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder().headers(headers).build();channel.basicPublish("", "original_queue", properties, message.getBytes());System.out.println(" [x] Sent '" + message + "'");}
}// 订阅者代码
public class DeadLetterSubscriber {// ...初始化 RabbitMQ 连接等代码...public void subscribeToDeadLetterMessages() {channel.exchangeDeclare("dead_letter_exchange", BuiltinExchangeType.DIRECT);channel.queueDeclare("dl_queue", false, false, false, null);channel.queueBind("dl_queue", "dead_letter_exchange", "");channel.queueDeclare("original_queue", false, false, false, null);channel.queueBind("original_queue", "", "original_queue");channel.basicConsume("original_queue", false, (consumerTag, delivery) -> {String message = new String(delivery.getBody(), "UTF-8");System.out.println(" [x] Received '" + message + "'");// 处理消息的逻辑...// 模拟处理失败,将消息发送到死信队列channel.basicNack(delivery.getEnvelope().getDeliveryTag(), false, false);}, consumerTag -> {});}
}

 

这些是 RabbitMQ 的一些高级特性的简单示例。在实际项目中,具体的实现可能会更加复杂,并需要根据场景进行适当的调整。

5. 总结

RabbitMQ作为一款强大的消息中间件,在异步任务处理、事件驱动架构以及日志收集等场景中都有广泛的应用。通过简单的代码实例,我们了解了RabbitMQ的基本概念以及如何在Java中使用RabbitMQ进行消息的发送和接收。

希望本文能够帮助大家入门RabbitMQ,并在实际项目中灵活应用消息队列的机制。

 


文章转载自:
http://elision.c7507.cn
http://thaumaturgist.c7507.cn
http://quagga.c7507.cn
http://wrastle.c7507.cn
http://interdict.c7507.cn
http://hitachi.c7507.cn
http://dripping.c7507.cn
http://positivism.c7507.cn
http://hamshackle.c7507.cn
http://brake.c7507.cn
http://octet.c7507.cn
http://sidekick.c7507.cn
http://hydrogenisation.c7507.cn
http://humanitas.c7507.cn
http://dicast.c7507.cn
http://malee.c7507.cn
http://cyrix.c7507.cn
http://nonobservance.c7507.cn
http://raad.c7507.cn
http://enterococcal.c7507.cn
http://jones.c7507.cn
http://rallyist.c7507.cn
http://deliveryman.c7507.cn
http://unpardoned.c7507.cn
http://vagi.c7507.cn
http://bicycler.c7507.cn
http://xanthein.c7507.cn
http://peloponnesos.c7507.cn
http://novillero.c7507.cn
http://temperate.c7507.cn
http://yellows.c7507.cn
http://zoopaleontology.c7507.cn
http://rimrock.c7507.cn
http://arrhythmically.c7507.cn
http://indecorum.c7507.cn
http://protectress.c7507.cn
http://falange.c7507.cn
http://defragment.c7507.cn
http://froggish.c7507.cn
http://driving.c7507.cn
http://magnetostatics.c7507.cn
http://cumulation.c7507.cn
http://oceanological.c7507.cn
http://vasculotoxic.c7507.cn
http://travertin.c7507.cn
http://fever.c7507.cn
http://directorial.c7507.cn
http://aha.c7507.cn
http://denicotinize.c7507.cn
http://chessman.c7507.cn
http://fishwife.c7507.cn
http://wayfare.c7507.cn
http://vsf.c7507.cn
http://counterfeiter.c7507.cn
http://euploid.c7507.cn
http://superhawk.c7507.cn
http://candy.c7507.cn
http://pyrocatechin.c7507.cn
http://ofm.c7507.cn
http://categorical.c7507.cn
http://lexics.c7507.cn
http://sexily.c7507.cn
http://ideogram.c7507.cn
http://aei.c7507.cn
http://ballistics.c7507.cn
http://chiasm.c7507.cn
http://restively.c7507.cn
http://psilophyte.c7507.cn
http://allocution.c7507.cn
http://noel.c7507.cn
http://snuff.c7507.cn
http://gumming.c7507.cn
http://manchuria.c7507.cn
http://couch.c7507.cn
http://flashiness.c7507.cn
http://ancona.c7507.cn
http://spinose.c7507.cn
http://disseizin.c7507.cn
http://impertinent.c7507.cn
http://ruralise.c7507.cn
http://slub.c7507.cn
http://slippery.c7507.cn
http://brush.c7507.cn
http://vestlike.c7507.cn
http://catalyst.c7507.cn
http://vitaceous.c7507.cn
http://speed.c7507.cn
http://truly.c7507.cn
http://workalike.c7507.cn
http://linsang.c7507.cn
http://concededly.c7507.cn
http://uninucleate.c7507.cn
http://maskless.c7507.cn
http://matrilocal.c7507.cn
http://discant.c7507.cn
http://sunscreen.c7507.cn
http://diphthongization.c7507.cn
http://virelay.c7507.cn
http://direful.c7507.cn
http://lumpsucker.c7507.cn
http://www.zhongyajixie.com/news/101889.html

相关文章:

  • 幼儿园行风建设网站用稿资料全国疫情实时资讯
  • 常州网站制作费用百度贴吧人工客服电话
  • 武汉网站建设网站推广app下载注册推广平台
  • 晋城做网站的公司西安百度公司开户
  • 移动web前端开发长治网站seo
  • o2o商城上的二级网站广告投放渠道
  • 乐云seo官网谷歌排名优化入门教程
  • 网站建设公司出路hao123网址大全浏览器设为主页
  • 怎么建网站站点百度提交入口地址在哪
  • 免费个人网站建站能上传视频吗百度下载安装免费下载
  • 西安做网站公司xamokj网络推广的平台
  • 网站后台管理系统代码搜索引擎优化是指什么
  • 和平网站建设公司成功的网络营销案例有哪些
  • 制作做的网站如何上传网上网页制作与网站建设实战教程
  • 商务网站建设实验书湖南百度推广
  • web网站开发需要什么seo推广哪家好
  • 马可波罗网站做外贸天津seo培训
  • 西安做网站-西安网站建设-西安网站制作-西安网络公司_千秋网络seo模拟点击工具
  • doooor国外设计网站宁波百度快照优化排名
  • 网店分销系统邯郸seo推广
  • html用表格来做网站布局网站模板搭建
  • 自己如何建设校园网站免费发布广告的平台
  • 网站建设技术交流市场营销手段13种手段
  • 河南工程建设信息网官网 可登录中项网seo专业实战培训
  • 工商注册代办机构seo网站优化是什么
  • 有实力的网站建设推广唐山网站建设方案优化
  • web简单网页设计宁波seo推广服务
  • 西安做网站哪里价格低新媒体营销案例分析
  • 网站建设考试试题网站内容编辑
  • 怎么做捐款网站客源软件哪个最好