Spring Integration入门
Spring Integration 系统集成

Spring Integration 系统集成Spring Ingegration 提供了基于Spring的EIP(Enterprise Integration Patterns,企业集成模式)的实现。
Spring Integration 主要解决的问题是不同系统之间交互的问题,通过异步消息驱动来达到系统交互时系统之间的松耦合。
Spring Integration 主要有Message、Channel、Message EndPoint组成。
MessageMessage是用来在不同部分之间传递的数据。
Message有两部分组成:消息体(payload)与消息头(header)。
消息体可以是任何数据类型;消息头表示的元数据就是解释消息体的内容。
/*** A generic message representation with headers and body.** @author Mark Fisher* @author Arjen Poutsma* @since 4.0* @seeorg.springframework.messaging.support.MessageBuilder */public interface Message {/*** Return the message payload.*/T getPayload();/*** Return message headers for the message (never {@code null} but may be empty).*/MessageHeaders getHeaders();}123456789101112131415161718192021Channel在消息系统中,消息发送者发送消息到通道(Channel),消息接受者从通道(Channel)接收消息。
1、顶级接口(1) MessageChannelMessageChannel 是Spring Integration消息通道的顶级接口:public interface MessageChannel {/*** Constant for sending a message without a prescribed timeout.*/long INDEFINITE_TIMEOUT = -1;/*** Send a {@link Message} to this channel. If the message is sent successfully,* the method returns {@code true}. If the message cannot be sent due to a* non-fatal reason, the method returns {@code false}. The method may also* throw a RuntimeException in case ofnon-recoverable errors.* This method may block indefinitely, depending on the implementation.* To provide a maximum wait time, use {@link#send(Message, long)}.* @param message the message to send* @return whether or not the message was sent*/boolean send(Message message);/*** Send a message, blocking until either the message is accepted or the* specified timeout period elapses.* @param message the message to send* @param timeout the timeout in milliseconds or {@link #INDEFINITE_TIMEOUT}* @return {@code true} if the message is sent,{@code false} if not* including a timeout of an interrupt of the send*/boolean send(Message message, long timeout);}1234567891011121314151617181920212223242526272 8293031MessageChannel 有两大子接口,分别是PollableChannel(可轮询)和SubscribableChannel(可订阅)。
Spring官网教程学习1和使用Gradle

Spring 官⽹教程学习1和使⽤Gradle1、我选择的⽅式是+构建⼯程IDEA 构建Gradle ⼯程知识和概念gradle 命令gradle :开始构建gradle tasks :查看有哪些任务gradle build :编译代码 ⽣产jar 包gradle wrapper --gradle-version 2.13 ⽆环境构建build.gradleplugins {id 'java'--java 环境 会多了javadoc-=(including tasks for building the project, creating JavaDoc, and running tests )}repositories {mavenCentral() ---配置仓库--(build should resolve its dependencies from the Maven Central repository )}sourceCompatibility = 1.8 --java 版本targetCompatibility = 1.8dependencies {compile "joda-time:joda-time:2.2" ---配置依赖testCompile "junit:junit:4.12"}jar {baseName = 'gs-gradle'---打成jar 的名称(已经过期l )version = '0.1.0'}这⾥可以改jar 名称 否则会打俩个包dependencies -compile分为 providedCompile 、testCompileGradle Wrapper包含linux+IOS+Window ,(没有安装gradle 环境也可以使⽤gradle 构建)。
⽤途:Add it to your version control system, and everyone that clones your project can build it just the same每⼀个克隆项⽬的⼈ ()有gradle Wrapper ⽂件的都可以直接构建此项⽬(不⽤安装gradle )1、 gradle wrapper --gradle-version 2.13 (⽣成gradle 构建版本⽂件)⽣成的⽂件格式2、运⾏./gradlew build 或者 运⾏gradlew.bat (gradle 构建)##############已经构建好了 但是⾄少⽣命了依赖⽽已 还不能运⾏3、 use gradle’s application plugin添加-+apply plugin: 'application'mainClassName = 'hello.HelloWorld'4、./gradlew run 或者gradlew.bat runRESTful Web ServiceBuilding a RESTful Web Service发送参数(设置默认差数)和设置依赖plugins { id 'org.springframework.boot' version '2.3.2.RELEASE' id 'io.spring.dependency-management' version '1.0.8.RELEASE' id 'java'}group = 'com.example'version = '0.0.1-SNAPSHOT'sourceCompatibility = '1.8'repositories { mavenCentral()}dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation('org.springframework.boot:spring-boot-starter-test') { exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' }}test { useJUnitPlatform()}返回值参数AtomicLong 可以⾃动增加返回值JOSNuses the Jackson JSON library to automatically marshal instances of type Greeting into JSON.Resource Controllerspringboot 命令编译运⾏spring 服务 ./gradlew bootRun构建 ./gradlew build运⾏jar 包 java -jar build/libs/gs-rest-service-0.1.0.jar ###########MultipartConfigElement class(which would be in web.xml)这个MultipartConfigElement 上传的配置 springboot 已经配好了(⾃动配置)As part of auto-configuring Spring MVC, Spring Boot will create a MultipartConfigElement bean and make itself ready for file uploads.最好放在nosql ⽂件存储 或者数据库control storageService private final StorageService storageService; @Autowired public FileUploadController(StorageService storageService) { this.storageService = storageService;}上传限制启动时候删除所有⽂件FileSystemStorageService⽂件服务找不见⽂件的⾃定义异常StorageFileNotFoundException⽂件位置配置改变⽂件路径结果可以学习获取配置类来 对象的时候 (保证bean 是唯⼀的 不可改变的)继续看官⽹教程Spring Boot 有四⼤神器,分别是auto-configuration 、starters 、cli 、actuator定时任务(scheduling tasks )1、周期任务2、开启定时任务####springboot ⼊门启动类CommandLineRunnerspring 的测试1、依赖testImplementation('org.springframework.boot:spring-boot-starter-test') { exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'}2、MockMvc 模拟请求测试@SpringBootTest @AutoConfigureMockMvc public class HelloControllerTest { @Autowired private MockMvc mvc; @Test public void getHello() throws Exception { mvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(content().string(equalTo("Greetings from Spring Boot!"))); }}3、全堆栈集成测试(full-stack integration test )@BeforeEach 在@test 前执⾏。
Spring核心技术详解

Spring核⼼技术详解⼀、Sring简介Spring是⼀个分层的Java SE/EE应⽤⼀站式的轻量级开源框架。
Spring核⼼是IOC和AOP。
Spring主要优点包括:⽅便解耦,简化开发,通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进⾏控制,避免硬编码造成的程序耦合度⾼。
AOP编程的⽀持,通过Spring提供的AOP功能,⽅便进⾏⾯向切⾯编程。
声明式事务的⽀持,在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式⽅式灵活地进⾏事务的管理,提⾼开发效率和质量。
⽅便程序的测试,可以⽤⾮容器依赖的编程⽅式进⾏⼏乎所有的测试⼯作。
⽅便集成各种优秀框架,Spring提供了对各种优秀框架的直接⽀持。
⼆、Spring体系结构如下图所⽰,整个spring框架按其所属功能可以划分为五个主要模块,这五个模块⼏乎为企业应⽤提供了所需的⼀切,从持久层、业务层到表现层都拥有相应的⽀持,这就是为什么称Spring是⼀站式框架的原因。
核⼼模块(Core Container) Spring的核⼼模块实现了IoC的功能,它将类和类之间的依赖从代码中脱离出来,⽤配置的⽅式进⾏依赖关系描述。
由IoC容器负责类的创建,管理,获取等。
BeanFactory接⼝是Spring框架的核⼼接⼝,实现了容器很多核⼼的功能。
Context模块构建于核⼼模块之上,扩展了BeanFactory的功能,包括国际化,资源加载,邮件服务,任务调度等多项功能。
ApplicationContext是Context模块的核⼼接⼝。
表达式语⾔(Expression Language)是统⼀表达式语⾔(EL)的⼀个扩展,⽀持设置和获取对象属性,调⽤对象⽅法,操作数组、集合等。
使⽤它可以很⽅便的通过表达式和Spring IoC容器进⾏交互。
AOP模块Spring AOP模块提供了满⾜AOP Alliance规范的实现,还整合了AspectJ这种AOP语⾔级的框架。
Spring框架入门教程

Spring基础入门一、基础知识1.依赖注入、控制反转依赖注入:在运行期,由外部容器动态地将依赖对象注入到组件中控制反转:应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部窗口负责得。
这样控制权就由应用转移到了外部容器,控制权的转移就是所谓的反转。
2.spring 的主要特性。
(1)降低组件之间的耦合度,实现软件各层之间的解耦。
(2)可以使用容器提供的众多服务,如:事务管理服务、消息服务、JMS 服务、持久化服务等等。
(3)容器提供单例模式支持,开发人员不再需要自己编写实现代码。
(4)容器提供了AOP 技术,利用它很容易实现如权限拦截,运行期监控等功能。
(5)容器提供的众多辅作类,使用这些类能够加快应用的开发,如:JdbcTemplate、HibernateTemplate.(6)对主流的应用框架提供了集成支持。
3.常用技术控制反转/依赖注入---面向切入编程---与主流框架的整合、管理---二、实例拓展1.准备搭建环境dist\spring.jarlib\jakata-commons\commons-loggin.jar如果使用了切面编程,还需下列jar 文件:lib\aspectj\aspectjweaver.jar 和aspectjrt.jarlib\cglib\cglib-nodep-2.1.3.jar如果使用了jsr-250 中的注解,还需要下列jar 文件:lib\j2ee\common-annotations.jar2.搭建并测试环境建立名为spring_01_base项目,根据需求导入jar包。
建立一个Junit测试单元SpringEnvTest,测试代码如下:@Testpublic void testEnv() {ApplicationContext ctx = newClassPathXmlApplicationContext("beans.xml");}beans.xml 配置文件在此省略(见下)。
【SpringFramework】Spring入门教程(三)使用注解配置

【SpringFramework】Spring⼊门教程(三)使⽤注解配置本⽂主要介绍四个⽅⾯:(1) 注解版本IOC和DI(2) Spring纯注解(3) Spring测试(4) SpringJDBC - Spring对数据库的操作使⽤注解配置Spring⼊门说在前⾯学习基于注解的IoC配置,⼤家脑海⾥⾸先得有⼀个认知,即注解配置和xml配置要实现的功能都是⼀样的,都是要降低模块间的耦合度。
仅仅只是配置的形式不⼀样。
关于实际的开发中到底使⽤xml还是注解,每家公司有着不同的使⽤习惯。
所以这两种配置⽅式我们都需要掌握。
基于注解配置的⽅式也已经逐渐代替xml配置。
所以我们必须要掌握使⽤注解的⽅式配置Spring。
配置步骤注意:如果使⽤Eclipse需要先安装了STS插件,或者使⽤STS开发⼯具创建项⽬。
本⽂使⽤IDEA进⾏演⽰。
1.2.1. 第⼀步:拷贝必备jar包到⼯程的lib⽬录。
注意:在基于注解的配置中,我们还要多拷贝⼀个aop的jar包。
如下图:1.2.2. 第⼆步:在类的根路径下创建⼀个任意名称的xml⽂件(不能是中⽂)注意:基于注解整合时,Spring配置⽂件导⼊约束时需要多导⼊⼀个context命名空间下的约束。
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans.xsd/schema/context/schema/context/spring-context.xsd"></beans>1.2.3. 第⼆步:创建⼀个服务类创建⼀个测试的服务类,并且加⼊使⽤@Component注解,声明该类允许注⼊到Spring容器package org.cjw.service;import ponent;/*使⽤注解配置时,需要将Spring框架启动就创建对象的类表⽰为组件类表⽰组件类使⽤@Component注解*/@Componentpublic class CustomerService {public void save() {System.out.println("-保存数据-");}}1.2.4. 第四步在spring的配置⽂件加⼊扫描注解<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans.xsd/schema/context/schema/context/spring-context.xsd"><!-- 声明扫描包及其⼦包的类,如果发现有组件注解的类,就创建对象并加⼊到容器中去 --><context:component-scan base-package="org.cjw" /></beans>1.2.5. 第五步:测试调⽤代码package org.cjw.test;import org.cjw.service.CustomerService;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class CustomerServiceTest {@Testpublic void testSave() {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");CustomerService customerService = context.getBean(CustomerService.class);customerService.save();}}--测试结果,如果可以调⽤服务⽅法,测试成功。
Springintegration基本概念【转】

Springintegration基本概念【转】1.spring integration 's architecture主要提供两个功能:在系统内提供实现轻量级、事件驱动交互⾏为的框架在系统间提供⼀种基于适配器的平台,以⽀持灵活的系统间交互2.spring integration对于企业集成模式的⽀持2.1Message:⼀个信息的单元,通常有消息头(header)和消息内容(payload)组成2.2Message channel:消息处理节点之间的连接,负责将Message从⽣产者传输到消费者。
根据消费者的多少,可分为point to point和publish-subscribe两种根据消息传输⽅式的不同,分为同步和异步两种2.3Message Endpoint:消息处理节点,消息从节点进⼊通道,也是从节点离开通道⼏个常见的Message EndPoint:CHANNEL ADAPTER,⽤于连接该适配器的特点是单向消息流的,要么是消息通过该适配器进⼊通道,要么是消息通过该适配器离开通道MESSAGING GATEWAY,处理的消息流和Channel Adapter不同,不是单向的,即有进⼊该节点的消息,也会从该节点发出消息。
SERVICE ACTIVATOR,该节点调⽤服务来处理输⼊的消息,并将服务返回的数据发送到输出通道。
在spring integration中,调⽤的⽅法被限定为本地⽅法调⽤。
ROUTER,路由器,将输⼊的消息路由到某个输出通道中SPLITTER,将输⼊的消息拆分成⼦消息AGGREGATOR,将输⼊的多个消息合并为⼀个消息3.观看书中例⼦hello-world思考测试gateway时,下⾯代码向通道names内放⼊消息world?然后service-activator从names通道中获得消息world,调⽤⽅法sayHello返回值到给gateway?解释:gateway有⼀个service-interface的属性,这个属性指向⼀个interface。
java 流程编排架构

java 流程编排架构
Java流程编排架构是一种用于构建、管理和执行复杂工作流的系统架构。
它允许您将不同的任务、服务和组件组合在一起,以实现特定的业务目标。
以下是一些常见的Java流程编排架构:
1. Spring Integration:Spring Integration是一个基于Spring的集成框架,它提供了一种用于构建事件驱动的集成应用程序的方法。
它支持多种消息传递协议,包括消息队列、事件总线、电子邮件和文件传输等。
通过使用Spring Integration,您可以轻松地将不同的服务、应用程序和组件连接起来,以实现复杂的业务流程。
2. Camunda BPM:Camunda BPM是一个开源的工作流引擎,它使用BPMN 标准来建模和执行业务流程。
它提供了一个易于使用的API和用户界面,使您能够创建、部署和管理业务流程。
Camunda BPM还支持Java 和JavaScript等编程语言,并与其他平台和框架集成。
3. Activiti:Activiti是一个轻量级的业务流程管理(BPM)平台,它提供了一个易于使用的API和用户界面,使您能够创建、部署和管理业务流程。
Activiti支持BPMN 标准,并与其他平台和框架集成。
4. jBPM:jBPM是一个基于Java的业务流程管理(BPM)框架,它使用BPMN 标准来建模和执行业务流程。
jBPM提供了一个易于使用的API和用
户界面,使您能够创建、部署和管理业务流程。
jBPM还支持多种集成选项,包括与数据库、应用程序和消息队列的集成。
这些架构都具有不同的特点和优势,您可以根据您的具体需求选择最适合您的架构。
Spring BlazeDS Integration简介与入门

Spring BlazeDS Integration简介与入门作者Ryan Knight ,译者张龙发布于九月24, 2009 去年底Adobe与Spring共同宣布将联合开发一个新项目:Spring BlazeDS Integration。
其目标是:开发者可以利用Spring开发模型通过Adobe Flex、BlazeDS、Spring以及Java技术创建RIA。
这样我们就可以通过BlazeDS 公开Spring管理的服务而无需额外的配置文件。
其优势在于将Spring的易用性与Flex、BlazeDS以及Java整合起来以共同创建应用。
我将在本文中介绍Spring BlazeDS Integration项目对传统开发方式有哪些改观,同时展示一些相关示例。
首先,我们一起来看看它是如何改变应用的集成方式以及如何对现有的Spring项目进行转换使之可以利用新的集成。
最后我将对该项目的其他特性以及优势进行适当的介绍。
本文所用的示例应用是个简单的苏打(soda)服务,它提供了基本的账户信息。
其所用的数据模型是SodaAccount,代表了客户端账户信息。
以Spring的方式开发RIASpring的横空出世完全颠覆了传统Java服务端的开发方式。
它鼓励通过依赖注入的方式来装配POJO,这极大地简化了应用的开发与测试。
Spring的核心配置是通过Java bean实现的。
借助于bean,任何Java类都能被公开成为服务。
比如说,下面的配置片段就将Soda服务声明为一个Spring bean:为了将这些bean公开成为Flex客户端所用的远程服务,Integration项目采用了Spring Web MVC。
Spring Web MVC将DispatcherServlet作为一个中央分发器,用以处理任何类型的HTTP请求或是基于HTTP的远程服务。
我们可以通过相同的JavaBean配置方式来配置该DispatcherServlet以将请求转发给相应的处理器进行后续处理。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Spring Integration是Spring框架创建的又一个API,面向企业应用集成(EAI)。
说到集成,并不缺“解决办法”:硬编码的Java客户端、其它ESB产品,还有消息队列等更加传统的应用集成技术。
Spring Integration对以上各种解决方法都有所改进,改进的方式有时还颇具戏剧效果。
Spring Integration非常轻量、易于测试;几乎没有入门门槛,概念上比任何“自己编写”的解决方法都要简单。
长远来看,它更为灵活、更具有适应性。
一旦使用,你就会恋上它。
Spring Integration 可以和EJB、RMI、JMS这些标准技术协同使用,能让你在一处对复杂的解决方法进行建模,从而对标准技术有所增强。
这在很大程度上简化了这些技术的使用。
由于Spring Integration非常轻量(与应用一起部署Spring Integration服务器,不用将应用部署到Spring Integration中去),而且很注重开发生命周期(方便配置的XML schema、友好的POJO形式API、与Spring框架和JEE的强大集成),所以你会发现跟其它很多的ESB产品相比,Spring Integration要更加适用。
Spring Integration本身就很强大,毋庸置疑,它从Spring框架中得到了强大的支持。
比如说,配置格式无非还是Spring schema,这些配置格式反过来又为你抽象出了bean示例。
Spring Integration的使用没什么神奇之处,你可以自信地编写main(String [] args)方法来完成XML配置所做的一切。
Spring Integration中很多对RPC和消息的可用支持都以Spring框架的支持为基础。
Spring Integration配置文件中的所有内容仍是标准的Spring 应用上下文,和通常的Spring bean一样,它也受益于依赖注入和运行时可用的方面(Aspect)。
使用Spring Integration,应用上下文就是总线了。
比如这能使依赖于应用上下文事件的解决方案成为可能。
这是没有独立“运行时”的另一个原因,因为只要上下文可用,总线就存在。
背景企业应用集成(EAI)是集成应用之间数据和服务的一种应用技术。
它解决无限的问题,解决方案也几乎没有穷尽。
工程师们已经为这些解决方案的创建努力了数十年。
就在最近,我们才确定了原则的最佳实践,并对这些方案进行了分类。
现代EAI的模式通常要归功于Gregor Hohpe等人编著的《企业集成模式》[1],该书对集成解决方案共有的很多集成模式进行了分类和阐述。
Hohpe等人列出了四种集成风格:1. 文件传输:两个系统生成文件,文件的有效负载就是由另一个系统处理的消息。
该类风格的例子之一是针对文件轮询目录或FTP目录,并处理该文件。
2. 共享数据库:两个系统查询同一个数据库以获取要传递的数据。
一个例子是你部署了两个EAR应用,它们的实体类(JPA、Hibernate等)共用同一个表。
3. 远程过程调用:两个系统都暴露另一个能调用的服务。
该类例子有EJB服务,或SOAP和REST服务。
4. 消息:两个系统连接到一个公用的消息系统,互相交换数据,并利用消息调用行为。
该风格的例子就是众所周知的中心辐射式的(hub-and-spoke)JMS架构。
这些风格迥然不同,因为没有一种解决办法能在任何情况下都良好运转。
这导致整个中间件领域都在基于这些模式寻求可用的解决办法,通常被称为企业服务总线(ESB)。
ESB是最终的中间人:它知道如何使用各种语言在各种协议上调解传递的消息。
这些架构风格是不同的,它们各有所长。
通常,JEE标准存在着不足(坦率地说,现今的任何开发平台都是一样),与其它系统集成时这些标准并不能提供解决方案。
考虑到很多项目都是维护项目,新平台中又有多少技术会使用旧服务或功能呢?少之又少,这太令人惊讶了。
JEE以及后来的Spring在简化企业编程模型方面都有了长足的进步。
JEE进行了标准化并商业化了常见企业问题——数据库访问、远程过程调用、事务、认证、目录服务等等。
除了基本的RPC和消息,JEE中并没有对EAI解决方案的直接支持。
JMS、REST和SOAP都与平台无关,但这是假设有单一的消息协议。
比如说,有一个旧的主机应用,其输入、输出都是存放在一些FTP端点上的批处理文件,解决方案要求集成该应用就是不可能的。
简单来说:现今的中间件能很好地处理常见问题,但在特殊情况的处理上就有所不足了。
对大多数公告板或电子邮件列表,还是采取订阅流程。
通常,用户给应用发送电子邮件,应用最终接收电子邮件、针对“订阅”解析邮件、提取发送的邮件,然后在邮件列表中登记用户后发送响应。
第一反应可能就是基于CRON或通过Quartz构建定时器应用,以轮询电子邮件,或是为稍后使用的批处理文件去检查FTP。
这种办法很快就会变得单调而脆弱。
之后复杂性会急剧上升。
随着时间的推移,应用变得更为重要,与商业伙伴、其它应用、其它平台集成的负担也变得更加昂贵。
对必须进行维护的系统来说,每次集成都增加了系统间点对点的新通道。
最终,集成各个端点的通道就会成为一个维持不了的烂摊子、复杂的架构。
SpringSource的Spring Integration[2]简化了编程方式,以此改进了标准的ESB。
如何巩固、梳理架构企业应用集成有很多模式,同样有很多需要处理的协议。
Spring Integration提供ESB风格解决方案的建模能力,但使用方法及其便利性与Spring框架并无二致。
ESB不仅能提供消息解决方案的建模能力,还有其它不同的技术/协议。
ESB中的服务大多数ESB产品都有一些共性。
其中最重要的有:1. 路由:能按条件逻辑或配置好的路由规则路由消息。
2. 消息传递:对任何复杂的解决方案来说,将消息的有效负载从一种类型转换为另一种类型都至关重要。
在消息传递中,标准数据模型[3]模式要求系统提供通用的格式。
处理消息自然也是ESB的另一个重要组成部分。
3. 调解:适配器和服务映射。
4. 复杂事件处理(CEP):根据相关性将总线上的事件处理为聚集的能力。
5. 调用:这应该是最明显的一个。
每个ESB都要能消费、提供服务。
除了上面列出的服务,ESB通常还要包括记日志、审计、认证(安全)和管理等机制。
如果你的需求更加复杂,那ESB会提供很大的价值。
对比你在JEE平台中已经获得的东西和ESB能带给你的东西很有价值。
下表比较了适合于ESB、可使用JEE作为替代解决方案的常见用例。
流行的解决方案Spring Integration是新生事物,当然会遭受质疑。
Mule[6]是一个非常受欢迎的的ESB产品,值得密切关注。
Mule似乎有很大的影响力,在解决方案的灵活性上也令人印象深刻。
通过MuleForge[7]实现的开源扩展使其成为几乎所有问题令人信服的选择。
它是一个标准的服务器:能部署并运行解决方案。
Maven插件有助于开发的生命周期。
ServiceMix[8]也比较受欢迎。
ServiceMix原本基于Java业务集成规范(JBI;JSR 208[9])。
JBI是构建ESB产品的JCP规范。
由于出身JBI,ServiceMix不如Mule那般灵活,但它正在进行改进。
容器正转向OSGi基础设施。
这里没有列出其它所有有价值的ESB产品,要是有机会你还是要对它们多了解一下。
有些非常有价值,值得研究。
Spring Integration开箱即用的功能表现得很好,非常易于使用。
开发用例非常引人注目:如果你已经被POJO和近年来测试友好的框架宠坏了,那这个框架也是你的拿手好戏。
只要你愿意,你可以使用接口或标准框架类,你还可以完全为POJO和你的领域模型进行编码,或者,你可以将两者结合使用。
本文中,我选择在解决方案中使用一些框架类,以让发生的事情明确,并提供一致性。
有时候,太过不可思议反而会让人困惑,尽管对入门来说很有成效。
使用入门企业应用集成速成我们实际构建一个非常普通的应用,以此来演示开发周期。
该示例易于理解,但却没有斧凿之嫌。
此外,它还是一个很酷的工具。
需求是:允许通过电子邮件将博客发送到一个已知地址,然后由该地址发布博客。
这么做有一些好的理由。
Blogger([10]Google的博客服务)已经有这个功能。
但我在我博客上运行Apache Roller([11]),所以我可以使用这个解决方案。
写博客的惰性很大程度上是没时间进入“发布”模式的副作用。
Roller的软件强迫用户登录并撰写博客文章。
这么做很麻烦,尤其是你每次都不得不对付WYIWYG(所见即所得)编辑器。
第二,构建该解决办法最好的理由是,它提供了了一种简单的集成,能与尽可能少的运转部分集成在一起。
我们可以在本文中仔细分析该办法。
尽管这是假设的,但很有实际用途。
构建集成非常简单,最好的“IDE”只是一张纸和一支笔。
可以在很多工具中画图。
将图转换成你喜欢的ESB配置格式或工具非常简单。
ESB使用相同的术语。
了解术语要比了解任何一种工具或ESB更为重要。
让我们回顾一些ESB 101定义,权当补习了。
消息是传递到端点的有效负载。
端点是通道的终点。
通道是两个端点间被命名的连接。
通常,消息来自于消息系统,被分发到不了解消息系统的应用中。
同样的事情或者会反过来以其它方式出现:应用可能会发送数据,但并不理解消息系统。
针对这些问题,就需要通道适配器了。
就是这样!这些就是你需要了解的条目,以便讨论解决方案。
其它条目都是这些条目之上的变异或详细说明,或者是关于集成模式的,而不是关于集成本身。
Spring Integration概况Spring Integration应用就是使用Spring schema配置的简单Java程序。
如果你倾向于用常规的Spring配置来配置一切,就可以不使用schema。
Schema会使事情更为简单,这和用schema 配置使用Spring中方面的事务功能会更加简单大致一样。
Spring Integration为一般概念(集成命名空间)提供了方便的schema,还有适配器的具体配置,比如针对电子邮件或文件类型的配置。
Spring Integration应用处理从通道传递过来的消息概念。
消息的生命周期始于一个端点,通常是对适配器做出的反应。
消息在经过处理管道的过程中,会在总线内被转化、路由至其它通道、分发、响应,或者被中断并发送到一个死消息通道中去。
如果你使用Spring Integration接口编程——我们将在很大程度上尽可能保持内容一致并明确,那你要处理Message对象,Message 对象如图1所示。
Message类是个包装器,包装被处理消息的有效负载。