正如我在上 一篇 文章中所讨论的那样 ,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

使用ActiveMQ支持Spring Integration路由相关推荐

  1. Spring Integration Framework简介

    我们非常了解Spring框架和JMS . 在本文中,我们将介绍称为Spring Integration的企业集成框架 . Spring Integration是一个开源企业集成框架,可增强Spring ...

  2. Spring Integration 4.0:完整的无XML示例

    1.简介 Spring Integration 4.0终于发布了 ,并且此版本具有非常好的功能. 本文介绍的一种可能性是完全不使用XML即可配置集成流程. 那些不喜欢XML的人仅使用JavaConfi ...

  3. amqp rabbitmq_通过Spring Integration和RabbitMQ获得高可用性的AMQP支持的消息通道

    amqp rabbitmq Spring Integration消息通道默认情况下将消息存储在内存中. 这是因为内存速度快,易于实现,并且不会增加网络成本. 但是,在某些情况下,这可能会引起问题,因为 ...

  4. 通过Spring Integration和RabbitMQ获得高可用性的AMQP支持的消息通道

    Spring Integration消息通道默认情况下将消息存储在内存中. 这是因为内存速度快,易于实现,并且不会增加网络成本. 但是,在某些情况下,这可能会引起问题,因为如果应用程序崩溃或服务器意外 ...

  5. java中channelmessage,MessageStore支持的QueueChannel与Spring Integration Java Config

    Spring Integration reference guide指的是使用MessageStore实现为QueueChannel提供持久性. 提到了很多次,但是所有示例都使用XML配置,即 但是Q ...

  6. Spring Integration 实例讲解

    Spring Integration 简介 组件介绍 实例演示 买饮料 jms做一个简单的示例. 实例三集成JDBC 简介 最近学习到的工具,资料很少,但还是要记录下自己目前的理解,官方的说发就不说了 ...

  7. Spring Integration学习资料

    Spring Integration学习资料 1.1     背景 Spring框架的一个重要主题是控制反转.从广义上来说,Spring处理其上下文中管理的组件的职责.只要组件减轻了职责,它们同时也被 ...

  8. #翻译NO.4# --- Spring Integration Framework

    为什么80%的码农都做不了架构师?>>>    Part III. Core Messaging This section covers all aspects of the cor ...

  9. 使用Spring Integration进行消息处理

    Spring Integration提供了Spring框架的扩展,以支持著名的企业集成模式. 它在基于Spring的应用程序中启用轻量级消息传递,并支持与外部系统的集成. Spring Integra ...

最新文章

  1. 不可逆的类初始化过程
  2. 实验5 函数程序设计 6-8 使用函数求最大公约数
  3. size()函数的使用
  4. OpenMap教程5 – 3层GIS应用程序
  5. 【hihocoder - offer编程练习赛60 C】路径包含问题(LCA,树上倍增)
  6. Java之美[从菜鸟到高手演变]之Exception
  7. 跟小丸子学基础口语16-20
  8. 白盒测试方法与黑盒测试方法简析
  9. pp助手可以刷机吗android,pp助手刷机 pp助手怎么刷机
  10. 多路归并算法从理论到应用(易懂)
  11. 《天下强汉》6、西汉历史的最后一抹辉煌——绝域名将陈汤
  12. 复杂材料棱柱体单站RCS
  13. 子母钟时钟系统工业应用
  14. html方框里打勾,word里如何在□里打√!框框里打勾!!!!!
  15. NVIDIA-TLT训练行人检测模型(一)----算法模型的训练(finetuning)
  16. GnuRadio Hacking②:使用SDR嗅探北欧芯片无线键盘鼠标数据包
  17. 2023年湖南中专单招报名流程
  18. matlab ezplot hod,Matlab学习笔记三:绘图
  19. 从零开始—仿牛客网讨论社区项目(六)
  20. NR SSB Beam Sweeping

热门文章

  1. 使用vo注释做一个poi导出功能
  2. JMetro版本5.2已发布
  3. jdbc时区_什么比日期和时区更难? SQL / JDBC中的日期和时区!
  4. 使用Spring Boot和Project Reactor处理SQS消息-第2部分
  5. 1.0jpa 2.0_JPA 2.1类型转换器–持久枚举的更好方法
  6. Apache Ranger插件的美丽简洁
  7. 将Amazon Cognito与单页面应用程序(Vue.js)集成
  8. API网关正在经历身份危机
  9. 您将在下一个项目中使用JSF吗?
  10. jdeveloper_适用于JDeveloper 11gR2的Glassfish插件