使用ActiveMQ支持Spring Integration路由

正如我在上 一篇 文章中所讨论的那样 ,Spring Integration(SI) 是在Spring Framework之上构建的路由框架 ,它使您可以使用经过验证的企业集成模式来通过消息传递解决系统集成问题。 配置好SI并执行路由和中介逻辑后,您可能会发现您想采取下一步措施,并为解决方案增加更多的稳定性 。

您可能希望将某些路由,中介或服务逻辑分布在多个主机上,可能希望为通过SI通道传输的消息增加一些可靠性,并且可能希望比采用传统的客户端-服务器体系结构。 好吧,实现上述某些目标的一种方法是使用消息代理来支持您的SI路由。 SI为AMQP代理和JMS代理提供抽象。 在本文中,我想使用Spring Integration Samples项目中的Cafe示例来说明如何使用流行的ActiveMQ消息代理通过JMS支持您的SI路由。

JMS是将现有Java解决方案与消息传递集成的好方法。 由于JMS规范是一个API,因此无论您使用的是哪个代理,都可以充分利用依赖于代理的接口。 您可以使用ActiveMQ,WebSphere MQ或任何其他符合JMS的消息代理。 在本示例中,我选择ActiveMQ是因为它的成熟度,健壮性,在行业中的普遍性以及它是具有Apache许可的Apache Software Foundation的开源软件。 它完全实现了JMS 1.1,提供了高可用性,并且可以通过代理网络进行水平扩展。 如果要集成Java应用程序,请坚持使用JMS。 ActiveMQ还为C ++,C#,Ruby,Python,Erlang和其他许多应用程序提供绑定( 完整列表请参见其网站 )
注意,AMQP也是可行的选择。 AMQP指定了一种线级协议,该协议允许在不同平台和/或异构语言上构建的消息传递系统彼此进行互操作(不只是可以使用JMS API的java / JVM)。 Cafe演示已经实现了与Spring的RabbitMQ服务器(Spring产品组合中的流行开源AMQP代理)一起使用的AMQP实现。
有关AMQP和JMS之间区别的更多信息,包括它们如何工作,各自使用的不同术语以及两者的简要历史记录, 请参阅Mark Richards ( Java消息服务书的作者之一) 撰写的这篇出色的PDF文章。 (来自O'Reilly)
可以在我在github.com 上的Spring Integration Samples项目的分支版本中找到与该帖子相关的代码。 查看/ applications / cafe maven模块以获取我的代码。  
使用点对点或发布-订阅JMS目标支持频道
在我的示例中,我选择使用嵌入式代理 。 由于ActiveMQ是纯Java解决方案,因此您可以将代理嵌入Java应用程序中并在内部使用它,并允许外部客户端连接并参与消息传递。 这样做不会以任何方式限制您配置ActiveMQ的能力。 使用自己的嵌入式代理部署完整的集成解决方案要比依靠(由另一个组?)或在外部配置外部实例更容易。
基于ActiveMQ的解决方案的所有spring配置文件可以在/ src / main / resources下的META-INF / spring / integration / activemq类路径中找到。
与支持具有JMS目标的SI通道有关的文件是cafeDemo-amq-config.xml和cafeDemo-amq-jms-backed.xml 。 cafeDemo-amq-config.xml文件负责配置与ActiveMQ代理的连接。 连接工厂的名称非常重要,在本例中为“ connectionFactory”,因为SI缺省情况下将查找具有该名称的bean,以配置稍后由JMS支持的通道使用的目的地。
cafeDemo-amq-jms-backed.xml文件看起来与cafe示例的非经纪人实现( cafeDemo-xml.xml )非常相似,不同之处在于通道已转换为JMS支持的版本,并且ActiveMQ代理是嵌入其余配置。 请注意,用于嵌入代理的方法允许在spring文件中进行完整配置。对于此示例,不依赖于外部运行的代理。 这个小示例的配置仅设置了一个传输连接器(在默认端口61616上,我们可以使用vm:// transport ,但是我想显示一个使用TCP的示例),并且未配置代理安全性,目标策略但是,它的确利用了现成的配置详细信息,包括JMX管理MBean,以及通过推荐并高度优化的KahaDB进行的消息持久性。 有关更多信息,请参见ActiveMQ文档。
在原始配置中,将用于“ coldDrinks”和“ hotDrinks”的通道设置为轮询通道。 要使用JMS目标完成此操作,请将通道上的“消息驱动”属性设置为“ false”。 在这种情况下,我们不需要提前声明目的地名称,但是如果您想在目的地周围添加额外的安全性和授权属性,则不妨在代理上或通过代理提前创建它们。 SI配置。 运行此样本的主要类是org.springframework.integration.samples.cafe.xml.CafeDemoActiveMQBackedChannels 。
观察是否确实在使用ActiveMQ的最佳方法是运行该示例,并使用JConsole复审JMX服务器中的MBean。 在JConsole中,您确实可以看到消息正在通过队列入队和出队,和/或从主题中使用。 要测试使用ActiveMQ获得的鲁棒性,请尝试运行示例并中途中止它。 然后注释掉主文件中添加订单到系统的行,然后重新启动示例。 当异常终止时,它将继续处理从其中断处开始的处理。 只需更改通道的几行配置,即可获得可靠性和恢复能力。  
如何在不同的服务器上或至少在同一JVM外部运行路由的不同部分呢?
这使您可以添加路由的特定部分的更多实例,以提高吞吐量和可伸缩性,而无需进行任何代码更改(其他优点)。 只需将更多消费者吸引到队列/主题即可。 两种概念都可以在SI流程内(仅使用SI通道)使用,也可以在其流程外(使用JMS)使用。
为了证明这一点,我们将使用SI提供的JMS入站/出站网关和/或通道适配器。 使用JMS网关,我们可以实现请求-答复消息交换,而通道适配器则允许我们使用异步语义来激发和忘记。
该示例的设置方法与AMQP示例的设置方法相同,它也依赖于外部运行的代理(尽管我们可以如上所述嵌入它)。 首先,运行运行消费者(CafeDemoAppBaristaColdActiveMQ,CafeDemoAppBaristaHotActiveMQ),以监听冷饮或热饮订单。 接下来,启动负责主要流程和业务流程的流程(CafeDemoAppOperationsActiveMQ)。 编排流程处理接单,将订单分流,将其路由到适当的服务(上面的冷热咖啡Baristas),然后处理响应并汇总以供服务员交付。 在这里,您将看到正确设置的JMS网关。 最后,您需要运行将订单发送到订单队列(CafeDemoAppActiveMQ)实际启动订单的过程。
所有这四个过程都彼此独立运行,并且在必要时可以在单独的计算机上运行。 它们具有自己的应用程序上下文,并且仅对ActiveMQ消息代理可见。 这是一个高度模块化且解耦的解决方案,使用消息代理进行可靠的通信。 如上所述,可以将代理配置为具有高可用性,因此这不是故障点。
这种架构的优点:
  • 消息可靠性–消息代理存储和转发消息。 邮件最多只能发送一次。 如果代理崩溃,以前未发送的消息将保留,并且如果消费者没有收到,则可以重新发送
  • 灵活性–通过分离组件并依靠EIP,您可以彼此独立维护,包括部署,增强功能等
  • 限制或增加消息处理–组件在自己/独立的进程或盒子或世界各地运行,您可以配置每个组件以消耗或限制消息,具体取决于环境可以处理的数量
  • 扩展–为了处理更高的吞吐量,只需添加更多组件实例以侦听JMS目标
缺点:
  • 复杂性–将多个组件打包到一个流程中,维护多个组件更为复杂
  • 调试–复杂性增加,调试困难。 异步过程天生就很难调试
看一下我的github repo中的Spring Integration示例 。 完整记录了用于配置ActiveMQ连接的应用程序上下文文件。
参考: Christian Posta软件博客中的JCG合作伙伴 Christian Posta从ActiveMQ支持Spring集成路由 。

翻译自: https://www.javacodegeeks.com/2012/05/backing-spring-integration-routes-with.html

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

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

相关文章

quagga源码分析--路由信息处理zebra-rib

对于各个协议生成的路由信息的处理属于quagga中非常重要的一个功能,如何在内核进行路由增加,更新,删除是一个复杂的过程。 quagga在thread任务调度中加入了一种工作队列,work_queue,与内核的工作队列类似,是…

android 关闭蓝牙打电话功能,Android蓝牙开发【八】hfp接听、挂断电话

继续研究hfp相关功能。蓝牙耳机可以控制手机接听、拒接、挂断电话,拨打电话等功能。本文主要分析下起这些操作的大致流程。在系统应用Bluetooth中com_android_bluetooth.cpp提供了多个回调方法,由hardware、协议栈回调过来。蓝牙耳机的一些控制命令都会发…

android在listview中放入从sdcard读取的bitmap

重写viewbinder public class viewbinder_bookmark implements SimpleAdapter.ViewBinder{Overridepublic boolean setViewValue(View view, Object data, String textRepresentation){if(view instanceof ImageView && data instanceof Bitmap){ImageView imageview(I…

将状态机模式实现为流处理器

在我的上一个博客中,我说我真的以为某些“四人行”(GOF)模式已经过时了,如果不是过时的话肯定不受欢迎。 特别是我说过StateMachine不是那么有用,因为您通常会想到另一种更简单的方式来执行您正在执行的事情&#xff0…

android 自定义actionbar,如何让android的actionbar浮动且透明

如上图所示,谷歌地图的actionbar是透明的,且浮动在整个布局之上,没有占用布局空间。其实要做到这样的效果,我们首先想到的是两个方面:1.将让actionbar浮动起来。2.给actionbar一个背景,可以为颜色也可以为图…

CentOS 7安装redis及php扩展

安装remi源 # wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm # rpm -Uvh remi-release-7.rpm # sed -i -e "s/enabled1/enabled0/g" /etc/yum.repos.d/remi.repo 确认使用remi源时安装的Redis版本。 安装Redis 使用remi源yum安装Redis。 # yum …

对Openshift上的Play Framework 2应用进行故障排除

Openshift故障排除 使用“ 自己动手”应用程序类型,您实际上可以有很大的自由度来支持几乎可以在Linux机器上构建和运行的任何框架或服务器。 但是您必须做功课,并做一些研究。 因此,在本文中,我将向您展示一些我在使用Openshift和…

关于更换头像的整个过程理解

之前我遇到一个问题,就是怎样修改头像,都没有更改,后来把某个参数置为null,就解决了问题,但是知其然还要知其所以然,现在还是着重去梳理整个流程 头像,需要关注的是3个变量: 本地地址…

Ajax与CustomErrors的尴尬

在ASP.NET程序中&#xff0c;为了给用户显示友好的错误信息&#xff0c;通常在web.config中进行如下的设置&#xff1a; <customErrors mode"RemoteOnly" defaultRedirect"/error/error.htm"> </customErrors> 但如果是一个ajax请求在服务端发…

JSF开发人员应该知道的5种有用方法

这篇文章的目的是总结一些JSF开发人员可以在日常工作中使用的便捷方法。 实用程序类是将所有方法放在一起的好地方。 我会称此类为FacesAccessor。 第一种方法可能是最常用的方法。 它以给定名称返回托管bean。 必须按faces-config.xml或注释注册该bean。 注入是好的&#xff0…

android项目编码规范,Android 项目规范

Android 项目规范本文档的目的是定义项目规范。这些应遵循整个 Android 项目以帮助我们保持整洁和统一的代码库。 &#x1f642;

Java创建WebService服务及客户端实现

简介 WebService是一种服务的提供方式&#xff0c;通过WebService&#xff0c;不同应用间相互间调用变的很方便&#xff0c;网络上有很多常用的WebService服务&#xff0c;如&#xff1a;http://developer.51cto.com/art/200908/147125.htm&#xff0c;不同的语言平台对…

01-17权限管理

管理页面&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns"http://www.w3.org/1999/xhtml"><head><meta http-equi…

Java静态方法可能会产生代码异味

代码气味的定义 &#xff08;来自维基百科&#xff09;&#xff1a; “程序源代码中任何可能表明存在更深层问题的症状。” 在Java中&#xff0c; 静态方法允许您在“类范围”内执行代码&#xff0c;而不是像成员方法这样的实例范围。 这意味着&#xff0c;它们依赖于类级别的变…

android json 解析图片,JSON解析并获取android中的图像

我想解析包含字符串和图像的JSON对象。我的代码正在工作&#xff0c;但它加载图像太慢。我想加载另一个asynctask或服务的图像&#xff0c;以减少加载时间。我怎样才能做到这一点&#xff1f;哪一个是最好的方法使用asynctask或服务&#xff1f;这里是我的代码JSON解析并获取an…

Node Express4.x 片段视图 partials

1.在Express 4.x使用片段视图&#xff0c;需要引入partials模块 步骤&#xff1a; 1.在全局中安装express-partials模块&#xff1a; 2.在本地模块中安装express-partials,将模块安装到package.json中&#xff1a; 3.在入口文件(如&#xff1a;app.js)中引入模块&#xff1a; v…

bzoj1690:[Usaco2007 Dec]奶牛的旅行(分数规划+spfa判负环)

PS:此题数组名皆引用&#xff1a;戳我 题目大意&#xff1a;有n个点m条有向边的图&#xff0c;边上有花费&#xff0c;点上有收益&#xff0c;点可以多次经过&#xff0c;但是收益不叠加&#xff0c;边也可以多次经过&#xff0c;但是费用叠加。求一个环使得收益和/花费和最大&…

安全密码存储–请勿做的事和Java示例

安全存储密码的重要性 作为软件开发人员&#xff0c;我们最重要的职责之一就是保护用户的个人信息。 没有我们应用程序的技术知识&#xff0c;用户别无选择&#xff0c;只能相信我们正在履行这一责任。 令人遗憾的是&#xff0c;在密码方面&#xff0c;软件开发社区的记录不一。…

红米note4x Android7,红米Note4X能升级安卓7.0吗?红米Note4X如何升级Android7.0?

欢迎来到PPL网站的行业资讯知识分类&#xff0c;你现在观看的这篇文章要和大家分享的是关于红米Note4X能升级安卓7.0吗&#xff1f;红米Note4X如何升级Android7.0&#xff1f;的一些相关内容&#xff0c;希望大家能够感兴趣&#xff0c;并且希望我们能够帮助到你&#xff01;在…

java基础----数字签名算法的介绍

数字签名&#xff08;又称公钥数字签名&#xff09;是一种类似写在纸上的普通的物理签名&#xff0c;但是使用了公钥加密领域的技术实现&#xff0c;用于鉴别数字信息的方法。关于数字签名的介绍&#xff0c;可以参见百度百科&#xff1a;http://baike.baidu.com/view/7626.htm…