使用RabbitMQ进行消息传递

RabbitMQ是一个强大的消息代理,可用于实现不同的消息传递模式。 即使有出色的教程 (使用不同的语言和框架),也很难理解这些概念。 在这篇文章中,我想展示一些可以用RabbitMQ实现的不同范例,以及为什么要为某些概念而苦恼。

使用队列发送和接收

最简单的方法是使用队列发送消息,并让使用者从同一队列中读取数据。

没有什么可以阻止您拥有多个使用者,每个使用者都可以处理队列中的消息。 消耗完一条消息后,该消息将从队列中消失。

当有需要执行的任务并且哪个消费者处理任务无关紧要时,这特别适合。

发布/订阅

并非所有用例都只是想消耗一条消息的方式。 通常,您希望拥有多个应该全部处理所有消息的使用者。 一个示例可以是将对象存储在不同的数据存储中(例如,搜索索引和数据库),另一种是域事件,例如已提交并应由订单管理系统和库存系统处理的订单。 这需要一种发布/订阅机制,RabbitMQ当然已经涵盖了这一点。

与仅使用队列相比,最大的区别是在这种情况下,生产者不再直接写队列。 一个称为Exchange的实例将接受邮件并将其转发到一个或多个队列。

要使用经典的发布/订阅模型,您可以使用FanoutExchange将消息转发到一个或多个队列。 要连接交换和队列,您需要声明一个绑定,在这种情况下,用于特定交换的所有消息都应转发到特定队列。

每个使用者都从专用队列中读取消息。 这也意味着您将需要为每个正在监听的使用者绑定一个绑定。

使用RabbitMQ,可以使用在使用者停止监听时自动删除的队列。 这允许消费者加入和离开时具有非常动态的行为。

看我们的第一个示例,您可能想知道为什么有不同的方式来发送消息,发送队列和进行交换。 事实证明,发送到队列确实是不可能的。 总是存在一个默认交换,它仅转发消息。 此默认交换仅获取消息的某个路由键(即队列名称),并将它们以相同的名称放入队列中。

发布/订阅过滤

除了将消息发送到已注册进行交换的所有队列之外,还可以根据路由密钥对消息进行过滤。 所有消息都被发送到一个交换机,该交换机通过查看路由键来确定将消息发送到哪个队列。

如果要与路由键完全匹配,请执行DirectExchange。

将DirectExchange绑定到队列时,需要提供一个路由密钥,该路由密钥将确定将为此队列考虑的路由密钥。 如果要分配多个路由键,则可以为同一队列添加多个绑定。

您还可以提供通配符来确定哪些路由键应用于队列,这是通过使用需要分层路由键的TopicExchange来完成的。

一开始,这两个交流-直接交流和主题交流-可能最让我感到困惑。 当涉及主题时,我正在考虑经典的发布订阅系统,例如使用FanoutExchange时。 交换名称是客户端正在注册的主题。 但是这里的主题是指在现有交换机上的一种路由。 与DirectExchange相同:我希望直接交换类似于第一个示例,在第一个示例中,您直接将消息发送到队列。 但是,在这种情况下,直接交换是指直接路由,因此您始终需要为此提供路由密钥。

如果您想进一步了解各种交流,请访问RabbitMQ网站上的教程 。

翻译自: https://www.javacodegeeks.com/2018/03/messaging-with-rabbitmq-2.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348093.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 为什么fragment在调用hide方法后没有生效_Android 多 Fragment 切换优化

code小生,一个专注 Android 领域的技术平台公众号回复 Android 加入我的安卓技术群作者:DDDong丶链接:https://www.jianshu.com/p/c8e8a0249911声明:本文已获DDDong丶授权发表,转发等请联系原作者授权问题分析一直在简书里看别人的…

mysql如何查看远程用户_MySQL系列(十)--用户权限及远程访问

本文基于MySQL8.0,记录一下完整的远程访问的过程,以及这个过程中可能遇到的问题,MySQL运行在阿里云服务器,操作系统:CentOS 7.6 64位顺便说下,买服务器还是要双十二这种拉新活动再买,用一个新的…

spring mvc拆分_Spring集成–强大的拆分器聚合器

spring mvc拆分健壮是什么意思? 在本文的上下文中,健壮性是指在不立即返回给调用者的情况下管理流中的异常条件的能力。 在某些处理方案中, n个 m个回答足以做出结论。 通常具有这些趋势的示例处理场景是: 财务,保…

JasperReports:棘手的部分

如果您使用Java进行编程的时间足够长,则有可能需要为业务用户生成报告。 就我而言,我已经看到几个项目使用JasperReports库来生成PDF和其他文件格式的报告。 最近,我荣幸地观察了Mike和他的团队使用上述报告库及其面临的挑战。 简而言之Jasp…

win mysql 2003错误_windows MySql 报1067错误 2003错误

1067错误原因是我把安装mysql的目录的名字改了。但是位于目录里面的my.ini配置文件没有修改,玛德我真傻逼。把my.ini的#Path to installation directory. All paths are usually resolved relative to this.basedir"D:/My_MySQL/"这下面一行的路径名改成目…

分布式系统开发注意点_分布式系统开发注意事项

分布式系统开发注意点开发分布式软件系统时,要考虑许多因素。 如果您甚至不知道第一句话中我在说什么,那么让我为您提供一些见解,示例以及有关分布式系统的实例。 总览 分布式系统是指多个物理硬件设备与单独的离散用户交互并通过这些硬件设…

电子电气架构——车载ECU刷写工具vFlash简介

电子电气架构——车载ECU刷写工具vFlash简介 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值&a…

ldap java_使用LDAP保护Java EE6中的Web应用程序

ldap java在上一篇文章中,我们解释了如何在通过传输层安全性(TLS)/安全套接字层(SSL)传输数据时保护数据。 现在让我们尝试了解如何为使用LDAP服务器进行身份验证的基于JEE 6的Web应用程序应用安全机制。 目的&#x…

mysql 一致性hash_一致性hash算法在分表分库中的应用

一致性hash算法结构图 分表分库结构图 可进行循环冗余存储,顺时针存储到下一个物理节点(非虚拟节点)package com.haiziwang.platform.kmcsms.route.algorithm;import java.util.Collection;import java.util.SortedMap;import java.util.TreeMap;/*** 一致性Hash算法…

生产中的性能分析

生产中的性能分析 如果您在Java应用程序的性能方面遇到了一些严重问题,那么很可能您会知道线程分析的价值。 但是您知道应该使用哪个分析器吗? 探查器使用两种基本技术-采样和仪器。 采样分析器 采样探查器包括定期向JVM询问所有当前活动线程的当前执行…

mysql用com_MySQL 使用教程

关于 MySQLMySQL 是最流行的开源数据库。本文简明的讲解了 MySQL 如何下载安装到使用的整个过程。MySQL 支持多种特性:使用 C和 C编写,并使用了多种编译器进行测试,保证了源代码的可移植性。支持 AIX、FreeBSD、HP-UX、Linux、Mac OS、Novell…

c++ 一维数组长度_每天一点C / 一维数组和指针

哈喽,我是老吴,继续记录我的学习心得。每天一点系列是我对微习惯的践行。现在能做到每天一点 C,将来就会有更多的每天一点系列,没人规定嵌入式软件工程师就只能学习 C 语言和折腾 Linux,不要给自己设限。为什么是每天一…

mysql事务中怎么更改空值_MySQL事务

1.事务1.事务特性--ACIDAtomicity(原子性):要么全做,要么不做,不能只做一半(银行转账)Consistency(约束性):事务的前后,约束都能满足Isolation(依赖性):事务之间是独立的,互不影响的Durability(持久性):事务执行之后,事物的结果可以持久保存2.事务隔离级别:read uncommitted:可…

线程池实现填充短信_填充一个池需要多少个线程?

线程池实现填充短信在最近几个月中,我们一直看到很小但持续的操作失败,但有一个奇怪的异常– org.springframework.jdbc.CannotGetJdbcConnectionException –“无法获得JDBC连接; 嵌套异常是java.sql.SQLException:客户端尝试检出…

jsf标签_多个动态包含一个JSF标签

jsf标签每个JSF开发人员都知道ui&#xff1a;include和ui&#xff1a;param标签。 您可以包括一个facelet&#xff08;XHTML文件&#xff09;并传递一个对象&#xff0c;该对象将在包含的facelet中可用&#xff0c;如下所示&#xff1a; <ui:include src"/sections/co…

spring 长轮询_Spring集成文件轮询和测试

spring 长轮询我最近实施了一个小项目&#xff0c;在该项目中&#xff0c;我们必须轮询文件夹中的新文件&#xff0c;然后在文件内容上触发服务流。 Spring Integration非常适合此要求&#xff0c;因为它带有一个通道适配器 &#xff0c;该适配器可以扫描文件夹中的新文件&…

您将在下一个项目中使用JSF吗?

上周有一篇很棒的stackoverflow博客文章&#xff0c;主题是“ JavaScript框架的残酷生命周期” 。 这篇文章是关于Javascript UI框架&#xff08;angularjs&#xff0c;angular&#xff0c;jquery和react&#xff09;的流行和流行的速度。 这篇文章的关键指标是每月关于框架的问…

使用java自带的日志管理_java日志管理

1.相关概念日志统一框架(日志门面)&#xff1a;apache commons logging、slf4j日志实现框架(实现层)&#xff1a;JDK自带的logging(java.util.logging)、log4j、Java Util Logging、log4j2、logback.(1)JDK自带的logging(java.util.logging)用法&#xff1a;1 importjava.util.…

安卓4.4玩java_Android4.4运行过程中闪退java.lang.NoClassDefFoundError

上周五项目测试时发现一个奇怪的Bug&#xff0c;项目中依赖了一个第三方框架&#xff0c;但是在android4.0-4.4.4之间的系统中运行会直接闪退&#xff0c;抛出错误异常为java.lang.NoClassDefFoundError。第一次遇到这样的问题&#xff0c;google了好久找到了以下几个原因&…

update se_Java SE 7 Update 25 –发行说明进行了解释。

update se昨天是CPU日。 Oracle通过6月的Java重要补丁更新发布了Java SE更新25 。 在4月的最后一次重大更新之后&#xff0c;这是最后一次与Oracle其他所有Oracle产品都不适合的Oracle重要补丁更新计划。 从2013年10月开始 &#xff0c;Java安全修补程序将遵循四个年度安全发布…