引入Spring集成

在本文中,我们介绍Spring Integration 。 如果您以前没有使用过Spring Integration,那么可能会帮助您复习Gregor Hohpe的Enterprise Integration Patterns 。 我还将推荐Josh Long 撰写的这篇出色的介绍性文章 。

上下文设置

简而言之, 企业集成模式就是如何使两个应用程序(可能位于不同的技术堆栈,不同的机器,不同的网络上)相互通信,以提供单个业务功能。 面临的挑战是如何确保这种通信对业务用户保持透明,同时又对应用程序可靠且容易。 消息传递是模式之一。 使用此模式,应用程序可以使用可自定义的格式频繁,立即,可靠和异步地相互通信。 应用程序通过在虚拟管道(称为Channels )上发送数据(称为Messages )来相互交谈。 这是对该概念的过于简单的介绍,但希望足以理解本文的其余部分。

Spring Integration不是任何模式的实现,但是它支持这些模式,主要是消息传递。

本文的其余部分将动手实践,并且是Spring 3系列的扩展。本系列的早期文章包括:

  1. Hello World with Spring 3 MVC
  2. 使用Spring 3 MVC处理表单
  3. 使用Spring 3进行单元测试和记录
  4. 使用Spring 3 MVC处理表单验证

事不宜迟,让我们开始吧。

裸露骨骼的Spring集成示例

在撰写本文时,Spring的最新版本是3.1.2.RELEASE。 但是,最新版本的Spring Integration是2.1.3.RELEASE,可在Maven Central中找到。 我有些不满意-回想起来不合逻辑-对Spring和Spring Integration应该具有不同的最新版本感到吃惊,但是,嘿,就是这样。 这意味着我们的pom.xml现在应该添加一个(如果您想知道那是从何而来的,至少在很高的层次上,我需要在本文前面提到的Spring 3系列继续学习)。

文件:/pom.xml

<!-- Spring integration -->                           
<dependency>                                          <groupId>org.springframework.integration</groupId><artifactId>spring-integration-core</artifactId>  <version>2.1.3.RELEASE</version>                  
</dependency>

pom中的这一依赖性现在允许我的应用程序通过channel发送消息 。 请注意,现在我们在Spring Integration领域中引用消息和通道,这不一定与本文前面在Enterprise Integration Patterns领域中引用的相同概念完全相同。 此时可能值得快速浏览一下《 Spring Integration参考手册》 。 但是,如果您刚刚开始使用Spring Integration,那么暂时最好阅读本文。 我建议您先洗手,然后再返回参考手册,该手册非常好,但也非常详尽,因此对于初学者来说可能不胜枚举。

为简单起见,由于我通常尝试(尽可能)尝试第一种方法,因此让我们尝试编写一些单元测试以创建消息,然后通过通道发送它,然后再接收它。 我在这里写了关于如何在Spring 3应用程序中使用JUnit和Logback的博客 。 继续相同的原理,假设我们要编写一个HelloWorldTest.java,让我们为测试设置Spring配置。

文件:\ src \ test \ resources \ org \ academy \ integration \ HelloWorldTest-context.xml

<?xml version='1.0' encoding='UTF-8'?>
<beans xmlns='http://www.springframework.org/schema/beans'xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:p='http://www.springframework.org/schema/p' xmlns:int='http://www.springframework.org/schema/integration' xsi:schemaLocation='http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
http://www.springframework.org/schema/integration 
http://www.springframework.org/schema/integration/spring-integration-2.1.xsd'><int:channel id='inputChannel'></int:channel><int:channel id='outputChannel'><int:queue capacity='10' /></int:channel><int:service-activator input-channel='inputChannel'output-channel='outputChannel' ref='helloService' method='greet' /><bean id='helloService'class='org.academy.integration.HelloWorld' /> </beans>

那么,我们只是做什么? 我们已经要求Spring Integration创建一个“ inputChannel”来发送消息。 从中读取消息的“ outputChannel”。 我们还配置了将“ inputChannel”上的所有消息都移交给“ helloService”的功能。 此“ helloService”是org.academy.integration.HelloWorld类的实例,应具有对消息进行某些处理的能力。 之后,我们还配置了“ helloService”的输出,即在这种情况下修改后的消息,将被移交给“ outputChannel”。 很简单,不是吗? 坦率地说,当我几年前第一次与Spring Integration合作时,我发现所有这些都令人困惑。 直到我看到这个工作对我来说,这没有多大意义。 因此,让我们继续前进。 让我们添加关键业务 HelloWorld类。

文件:/src/main/java/org/academy/integration/HelloWorld.java

package org.academy.integration;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class HelloWorld {private final static Logger logger = LoggerFactory.getLogger(HelloWorld.class);public String greet(String name){logger.debug('Greeting {}', name); return 'Hello ' + name; }
}

如您所见,给定一个“名称”,它将返回“ Hello {name}”。 现在,让我们添加单元测试以实际执行此操作。

文件:/src/test/java/org/academy/integration/HelloWorldTest.java

package org.academy.integration;import static org.junit.Assert.*;import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.integration.MessageChannel;
import org.springframework.integration.core.PollableChannel;
import org.springframework.integration.message.GenericMessage;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class HelloWorldTest {private final static Logger logger = LoggerFactory.getLogger(HelloWorldTest.class);@Autowired@Qualifier('inputChannel')MessageChannel inputChannel;@Autowired@Qualifier('outputChannel')PollableChannel outputChannel;@Testpublic void test() {inputChannel.send(new GenericMessage<String>('World'));assertEquals(outputChannel.receive().getPayload(), 'Hello World');logger.debug('Checked basic Hello World with Spring Integration');}}

尽管不是强制性的,但我发现使用以下登录设置更容易。 如果您愿意,可以随时使用它。

文件:/src/main/resources/logback.xml

<?xml version='1.0' encoding='UTF-8'?>
<configuration><appender name='CONSOLE' class='ch.qos.logback.core.ConsoleAppender'><encoder><pattern>%d %5p | %t | %-55logger{55} | %m %n</pattern></encoder></appender><logger name='org.springframework'><level value='ERROR' /><!-- level value='INFO' />  --><!--  level value='DEBUG' />  --></logger><root><level value='DEBUG' /><appender-ref ref='CONSOLE' /></root>
</configuration>

现在,只需键入“ mvn -e clean install”(或使用m2e插件),您就应该能够运行单元测试并确认给定的字符串“ World”,HelloWorld服务的确在整个通道安排中确实返回了“ Hello World”和消息。

同样,可选但我强烈建议您运行“ mvn -e全新安装站点”。 假设您已正确配置了一些代码覆盖率工具(在我的情况下为cobertura),将为您提供一个不错HTML报告,其中显示了代码覆盖率。 在这种情况下,它将是100%。 我已经写了一系列关于代码质量的文章 ,详细介绍了该主题,但是总而言之,确保我使用和推荐使用的任何编码实践/框架都符合一些基本的代码质量标准对我来说非常重要。 。 能够进行单元测试和测量是我所做的这样一项基本检查。 毋庸置疑,一般来说,Spring(包括Spring集成)会通过带有鲜艳色彩的检查。

结论

本文就是这样。 在下一篇文章中,我们将了解如何将应用程序代码与我们当前的JUnit测试中具有的Spring Integration特定代码 (即inputChannel.send(…)等) 隔离 。

建议进一步阅读...
以下是本系列早期文章的链接:

  1. Hello World with Spring 3 MVC
  2. 使用Spring 3 MVC处理表单
  3. 使用Spring 3进行单元测试和记录
  4. 使用Spring 3 MVC处理表单验证

这些是我可以推荐的出色材料:

  1. Spring Integration入门
  2. Spring Integration的示例代码
  3. Spring集成–第1节– Hello World
  4. Spring集成–第2节–更多世界

继续与网关进行Spring集成

参考:在Tech for Enterprise博客中,我们的JCG合作伙伴 Partho 介绍了Spring Integration 。


翻译自: https://www.javacodegeeks.com/2012/08/introducing-spring-integration.html

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

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

相关文章

PAT 1024. 科学计数法 (20)

科学计数法是科学家用来表示很大或很小的数字的一种方便的方法&#xff0c;其满足正则表达式[-][1-9]"."[0-9]E[-][0-9]&#xff0c;即数字的整数部分只有1位&#xff0c;小数部分至少有1位&#xff0c;该数字及其指数部分的正负号即使对正数也必定明确给出。 现以科…

Mac上Hive环境搭建

本文介绍在Mac上搭建Hive环境。 建议首先配置好Hadoop&#xff0c;搭建与配置可以参考我之前的博文Mac Hadoop的安装与配置。 当然你也可以选择使用Docker搭建环境&#xff0c;本文不作介绍。 安装 对于MacOs&#xff0c;推荐使用HomeBrew安装hive&#xff0c;一步到位。 $ bre…

mysql+创建备份账户_mysql 添加用户,授予权限,数据库备份等 (转载)

一&#xff0c;连接MySQL格式&#xff1a;mysql -h 远程主机地址 -u 用户名 -p 回车输入密码进入&#xff1a;mysql -u root -p 回车Enter password: ,输入密码就可以进入mysql> 进入了退出命令:>exit 或者ctrlD二&#xff0c;MySQL管理与授权1.修改密码&#xff1a;格式…

分代缓存和转换

康拉德&#xff08;Konrad&#xff09;最近在我们公司的技术室中分享了有关如何完成缓存的有趣文章&#xff0c;这是一个大型的波兰社交网络nk.pl。 算法中的核心概念之一是分代缓存 &#xff08;请参阅此处或此处 &#xff09;。 基本思想是&#xff0c;对于缓存键&#xff0c…

css精灵

○ css 精灵&#xff08;Sprites&#xff09;技术利用photoshop将图片整合&#xff0c;然后用background-images&#xff0c;background-position&#xff0c;background-repeat技术&#xff0c;对图片进行精确定位。 ○ 优点&#xff1a;减少http请求数量&#xff0c;减少服务…

基于Jenkins+Gitlab的自动化部署实战

故事背景 一个中小型企业&#xff0c;是典型的互联网公司&#xff0c;当初期的时候可能运维只能标配到2~3人&#xff0c;此时随着公司的发展&#xff0c;项目会逐渐增多。前期部署项目可能都是手动的&#xff0c; 俗称“人肉部署”&#xff0c;这简直是无比的痛苦&#xff0c;不…

cmd如何刷新MySQL数据库_怎样在cmd中用命令操作MySQL数据库 需要技巧

用命令来操作MySQL是工作必备的&#xff0c;今天我就来分享一下cmd命令操作MySQL数据库的方法&#xff0c;希望有帮助。工具/材料电脑xampp操作方法01首先&#xff0c;启动MySQL服务才行哦。这里我是用xampp集成的数据库&#xff0c;方便&#xff0c;点击‘start’。02如图&…

Java顺序IO性能

许多应用程序将一系列事件记录到基于文件的存储中&#xff0c;以供以后使用。 从日志记录和审核&#xff0c;直到在事件源设计或其紧密相关的CQRS中保留事务重做日志&#xff0c;这都可以是任何东西。 Java具有多种方法&#xff0c;可以通过这些方法将文件顺序写入或重新读取。…

text段,data段,bss段,堆和栈

.bss段和.data段的区别 text段,data段,bss段,堆和栈转载于:https://www.cnblogs.com/jingzhishen/p/6203107.html

[BZOJ3529][Sdoi2014]数表

[BZOJ3529][Sdoi2014]数表 试题描述 有一张Nm的数表&#xff0c;其第i行第j列&#xff08;1 < i < n&#xff0c;1 < j < m&#xff09;的数值为能同时整除i和j的所有自然数之和。给定a&#xff0c;计算数表中不大于a的数之和。输入 输入包含多组数据。输入的第一行…

ZK的实际应用:MVVM –表单绑定

这是我们从头开始构建ZK应用程序的第二集。 上一篇文章涉及使用MVVM将数据加载和呈现到表中。 在本文中&#xff0c;我们将向您介绍ZK MVVM的表单绑定。 目的 我们将构建一个“添加”功能&#xff0c;使我们能够将新条目保存到清单中。 单击“添加”时出现表格 单击“保存”…

群晖按装mysql_如何连接群晖里的MYSQL数据库

匿名用户1级2018-08-27 回答一、连接远程数据库&#xff1a;1、显示密码如&#xff1a;MySQL 连接远程数据库(192.168.5.116)&#xff0c;端口“3306”&#xff0c;用户名为“root”&#xff0c;密码“123456”C:/>mysql -h 192.168.5.116 -P 3306 -u root -p1234562、隐藏密…

ZK的实际应用:MVVM –以编程方式更新视图

在前两篇文章中&#xff0c;我们使用ZK的MVVM功能来&#xff1a; 将数据加载到表中 使用表单绑定保存数据 我们已经看到&#xff0c;用注解NotifyChange&#xff08;&#xff09;装饰方法时&#xff0c;在执行完成后&#xff0c;将向Binder通知VM属性的更改&#xff0c;以便B…

给你一个笑脸

今日冬至&#xff0c;愿你笑靥如初 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8" /> <title>Document</title> </head> <body> <canvas id"mycanvas" width"800px&qu…

mysql安装与配置的截图_windows下MySQL5.6版本安装及配置过程附有截图和详细说明...

随着MYSQL版本的更新以及电脑系统的变化&#xff0c;我们给大家整理了各种电脑环境下安装MYSQL的图解过程&#xff0c;希望我们整理的内容能够帮助到大家&#xff1a;mysql安装图解总结https://www.jb51.net/article/142398.htm编辑者&#xff1a;Vocabulary下面详细介绍5.6版本…

mysql 更新日的数据类型_[每日更新-MySQL基础]5.常用的数据类型-整数和字符串

1. 数据类型在学习PHP的时候我们已经讲过数据类型了&#xff0c;所谓数据类型就是数据的格式。每一种数据类型在计算机中存储的方式会有差异&#xff0c;占用的存储容量也有区别&#xff0c;所以选择合适的数据类型可以节约我们的存储成本&#xff0c;也方便我们的程序运行和…

Hello World with Spring 3 MVC

在2005年&#xff0c;我对Martin Fowler的这篇文章对Spring进行了介绍。从那时起&#xff0c;我就修改了许多IoC框架&#xff0c;包括Guice &#xff0c; PicoContainer &#xff0c; NanoContainer等。虽然我很喜欢与IoC一起工作&#xff0c;但我必须说Spring在过去的5年中&am…

ansible 安装

1、简介 ansible是新出现的自动化运维工具&#xff0c;基于Python开发&#xff0c;集合了众多运维工具&#xff08;puppet、cfengine、chef、func、fabric&#xff09;的优点&#xff0c;实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的&#…

JS原型详解

参考的别人家的博客http://www.cnblogs.com/ljchow/archive/2010/06/08/1753526.html ###JS原型####JS原型&#xff0c;就是原型对象&#xff0c;简称原型。不仅构造函数有&#xff0c;普通函数也有* 普通函数&#xff1a;javascript function puTong(){ }; alert(puTong.proto…

c# mysql 插入 和 查询_C#对数据库的操作(增删改查)

1、【在web.config文件中配置】2、【连接字符串】private static readonly string StrCon ConfigurationManager.ConnectionStrings["sqlConnection"].ToString();3、【查询数据方法】/// /// 查询数据/// /// 查询语句/// 参数/// public static DataTable QueryDa…