介绍Spring Integration

在本文中,我们介绍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 clean安装站点”,这是可选的,但我强烈建议。 假设您已正确配置了一些代码覆盖率工具(在我的情况下为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/353415.shtml

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

相关文章

蓝桥杯 2011年第二届C语言初赛试题(4)

4、某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪&#xff1a; 每位选手需要回答10个问题&#xff08;其编号为1到10&#xff09;&#xff0c;越后面越有难度。答对的&#xff0c;当前分数翻倍&#xff1b;答错了则扣掉与题号相同的分数&#xff08;选手必须回答…

各种资源(持续更新中)

寻找网页设计灵感的27个最佳网站推荐http://www.cnblogs.com/lhb25/archive/2011/04/19/2014303.html 模板王http://www.mobanwang.com/ http://sc.chinaz.com/

Katy Perry - E.T.

作曲 : Katy Perry, Łukasz Gottwald, Max Martin, Joshua Coleman 作词 : Katy Perry, Łukasz Gottwald, Max Martin, Joshua Coleman Youre so hypnotizing // hypnotize /ˈhipnəˌtīz / v.催眠,捕捉全部注意力,吸引 Could you be the devil? 你可会是那魔鬼&#xf…

使用Gradle禁止Java和Spring Boot Web应用程序中的FindBugs警告

如何在 Spring Boot和 Java应用程序中使用注释抑制FindBugs警告 如果您的构建由于FindBugs问题而中断&#xff0c;并且是假阳性&#xff0c;或者由于其他考虑而无法解决问题&#xff0c;则可以添加注释来忽略Findbugs警告。 更新您的Gradle依赖关系 您将需要在build.gradle文…

true,false组合问题

题目&#xff1a;给定n个布尔变量x1,x2,x3…xn&#xff0c;希望输出所有可能的布尔变量组合。例如当n&#xff1d;&#xff12;时&#xff0c;有&#xff14;种组合&#xff1a;a、true,true;b、true,faulse;c、faulse,true;d、faulse,faulse。请编写一个&#xff23;程序实现这…

更改matlab默认启动路径

1. 系统默认的启动路径是“我的文档”里的work目录&#xff0c;如果想要更改启动路径&#xff0c;解决方法是修改桌面上 MATLAB 快捷方式的属性&#xff0c;将原本的参数“目标” -sd 后面的 $documents\MATLAB 替换成自己的目录即可。我试了很多种方法&#xff0c;就这个最好使…

配置gitlab通过smtp发送邮件

https://www.centos.bz/2017/08/gitlab-send-email-with-smtp/ 1. 编辑/etc/gitlab/gitlab.rb文件&#xff08;加到文件最后面就好了&#xff09;。以QQ企业邮箱为例&#xff1a; gitlab_rails[smtp_enable] truegitlab_rails[smtp_address] "smtp.exmail.qq.com"g…

蓝桥杯 2011年第二届C语言初赛试题(5)

今盒子里有n个小球&#xff0c;A、B两人轮流从盒中取球&#xff0c;每个人都可以看到另一个人取了多少个&#xff0c;也可以看到盒中还剩下多少个&#xff0c;并且两人都很聪明&#xff0c;不会做出错误的判断。我们约定&#xff1a;每个人从盒子中取出的球的数目必须是&#x…

CUBA平台–用于快速应用程序开发的开源Java框架

传统上&#xff0c;自计算时代开始以来&#xff0c;企业软件开发自然面临着一个挑战&#xff0c;当时自然而然地&#xff0c;企业软件开发本应专注于解决实际的业务问题&#xff0c;但与此同时&#xff0c;开发人员必须在技术上花费大量时间和精力。解决方案的一面&#xff0c;…

C#与mongoDB初始环境搭建

mongoDB官网https://www.mongodb.com/ mongoDB默认安装路径(Windows x64平台) C:\Program Files\MongoDB\Server\3.4\bin mongoDB环境变量配置 启动mongoDB服务 > mongod -dbpath D:\mongodb > mongo Visual Studio引用mongoDB PM> install-package M…

浅析MATLAB中的内联函数、匿名函数和函数函数

内联函数 内联&#xff08;inline&#xff09;函数是MATLAB 7以前经常使用的一种构造函数对象的方法。在命令窗口、程序或函数中创建局部函数时&#xff0c;通过使用inline构造函数&#xff0c;而不用将其储存为一个M文件&#xff0c;同时又可以像使用一般函数那样调用它。 MA…

二十世纪数学家排名

二十世纪数学家排名 陈彬整理2010.1.1 1.A.N.Kolmogorov(柯尔莫哥(戈)洛夫)——为概率论建立了公理体系的俄罗斯人&#xff0c;但排第一似乎有些不妥? 2.H.Poincare(庞加莱(Jules Henri Poincar))——有些人不需要说明&#xff0c;H.庞加莱就是其中之一。 3.D.Hilbert(希尔伯特…

Matlab英文操作系统下中文乱码的解决方案

打开注册表&#xff08;win&#xff0b;R&#xff0c;运行框中输入regedit&#xff09;&#xff0c;然后进入HKEY_CURRENT_USER\Control Panel\International&#xff0c;将右侧 &#xff1a; "Locale""00000409" 改成 "Locale""00000804&q…

Git 从了解到放弃

1. 简单介绍 1.1. git起源 在1991年linus创建了Linux从此linux成为服务器领域的佼佼者&#xff0c;大部分web服务器、邮件、数据库各种服务器端程序都安装在了linux上面运行&#xff0c;主要是因为它运行的快速、高效、利用率高&#xff0c;这样一个优秀的系统并不是一个人在维…

LIS(Longest Increasing Subsequence)最长上升(不下降)子序列

有两种算法复杂度为O(n*logn)和O(n^2)O(n^2)算法分析如下&#xff1a; &#xff08;a[1]...a[n] 存的都是输入的数&#xff09;1、对于a[n]来说&#xff0c;由于它是最后一个数&#xff0c;所以当从a[n]开始查找时&#xff0c;只存在长度为1的不下降子序列&#xff1b;2、若从a…

java ee 的使用方法_改善Java EE生产支持技能的8种方法

java ee 的使用方法参与Java EE生产支持的每个人都知道这项工作可能很困难。 7/24寻呼机支持&#xff0c;多个事件和错误修复&#xff08;要定期处理&#xff09;&#xff0c;来自客户和管理团队的压力&#xff0c;要求它们尽快解决生产问题并防止再次发生。 在日常工作中&…

Tp3.1 文件上传到七牛云

TP3.1 中不支持Composer 就无法用composer 安装 下载历史的SDK https://github.com/qiniu/php-sdk/releases/tag/v7.0.8 下载下来放到 Think 目录下的Vendor下 进入代码 HTML的代码 <form id"upload" methodpost action"file" enctype"multipart/f…

Matlab元胞数组操作

元胞数组 删除行的方法比较特殊 A(i,:)=[];%注意,两边都没有用花括号 元胞数组中的操作函数 cell:创建空的元胞数组 cellfun:为元胞数组的每个元胞执行指定的函数 celldisp:显示所有元胞的内容 cellplot:利用图形方式显示元胞数组 cell2mat…

激励自己的名言警句

激励自己的名言警句 1、忍别人所不能忍的痛&#xff0c;吃别人所别人所不能吃的苦&#xff0c;是为了收获得不到的收获。 2、销售是从被别人拒绝开始的。 3、好咖啡要和朋友一起品尝&#xff0c;好机会也要和朋友一起分享。 4、生命之灯因热情而点燃&#xff0c;生命之舟因拼搏…

Java Spring 后端项目搭建

参考了几位同行的Blogs和StackOverflow上的许多问答&#xff0c;搭建了此后端项目&#xff0c;替换原来的node.js后端&#xff0c;和前一篇中搭建的Vue Web App项目配合使用&#xff0c;后端准备只提供服务&#xff0c;不包含后端装配的页面&#xff0c;打算只使用MongoDb和Red…