ESB之旅(是骡子是马拉出来溜溜——ESB选型)
? 一段关于MessageBroker与ESB区别的引用:“如果具体的把ESB产品和传统EAI里面的消息总线类产品(ActiveMQ?)做个比较,两者差异就很大了,主要有三方面。第一,ESB以SOA面向业务的哲学为基础,所以它主要是通过配置来建立 ,而不是通过编程建立;第二,ESB必须有能力在不同的协议之间建立互通机制,包括传统的消息机制(JMS)和Web服务接口(WS);第三,除了消息(服务)代理方式外,ESB还必须为SOA服务治理提供服务的生命周期管理,而非简单的过滤、转发、路由”,服务生命周期管理,就是指从服务发布、注册、使用、推广、效益统计、升级等。
? 关于esb的效率问题:”ESB 采用了轻量级的分布式体系结构。当必须将程序间的每次交互转换为规范格式时,集中式的交换中心才有意义。ESB(如 IONA Artix)可以将更多的处理逻辑分配到端点上。这与大型主机和现代的分布式系统体系结构间的区别相似。从广义的角度而言,ESB最主要的技术与Web服务密不可分,如WSDL(Web服务描述语言)、UDDI(统一发现、描述和集成)、SOAP(简单对象访问协议),这方面的技术目前处于稳定的发展阶段,而有关WS*的发展正处于一个整合和渗透不稳定过程中。此外,还有一些相关的技术正在活跃起来,比如流程方面BPEL(业务流程执行语言); 安全方面SAML(安全断言标记语言)、XML处理的XQuery;服务组件模型SCA/SDO(服务组件架构/服务数据对象)与JBI(Java Business Integration)等”。
? 上面这些应该是从老外翻译来的,英语文章尤其是技术类的和汉语语言习惯有着巨大差异,给我们的感觉就是英文技术文章在不必啰嗦的地方莫名其妙的啰嗦,在应该详述的地方一笔带过。
?
? 关于camel的参见:http://www.iteye.com/wiki/interview/1858-apache-camel。jnn在谈到camel比较其他esb优势的时候主要说了两点:一是camel更轻量;二是camel支持java语法方式的Transport配置(比如从jms接收消息处理后转发cxf:from("jms://xxxx").processor(new MyProcessor()).to("cxf://xxxx"))
? 而对于springIntegration,spring做的事情似乎有点太多了,spring的目标似乎是围绕ioc为开发者提供spring style的更轻量级的另一选择,好比springMVC对比struts、spring持久化对比hibernate。Spring作为一种非侵略性的,轻量级的framework能很好地与SCA相融合,下面这段文字出自SCA白皮书 的原文。
SCA views Spring as a natural partner which can be used as a component implementation technology. The Spring framework can be used to create components and wire them within a module using its dependency injection capabilities. SCA may be used to extend the capabilities of Spring components by publishing Spring beans as entry points to be accessed as services by other modules as well as by providing Spring beans with service references wired to services of other modules.
? 以此可以看出,SCA和Spring有着密切的关系,可以相互补充。相信未来SCA和Spring会有更紧密的融合,以更大更好地发挥各自的优点。
?
? 这个mule distribution就是你mule的安装目录,指定它的好处是以后你直接新建一个mule project的时候需要依赖的jar全部自动导入(lib下的opt、user、boot、mule下的必要jar)、你也可以在新建mule project向导中选择直接拷贝一个mule例子过来(所有源码及配置文件都拷贝过来),在其基础上你再原型开发去。使用mule ide再去创建mule的配置文件有很多便利、它还能替你自动从MuleForge上下载第三方module或transport、自动将mule源码与jar包相关联起来、详见:http://www.mulesoft.org/display/MULEIDE/Mule+IDE+2.0+User+Guide
?
? 三、照Installing Mule IDE 的说法,需要装好一个合适的JAXP (Java API for XML Processing) 实现、mule本身提供了xml parser相关jar位于lib\endorsed下。要自己下载的话可以去:http://xerces.apache.org/mirrors.cgi 和 http://www.apache.org/dyn/closer.cgi/xml/xalan-j 下载好 Apache Xerces 和 Xalan 并扔到: "JVM's jre/lib/endorsed" 目录下,在eclipse中的运行时虚拟机应该就是 D:\Java\jdk1.6.0_04\jre。在cmd命令行中直接运行java的运行时jre是 JAVA_HOME环境变量指向的那个jre 、而浏览器用的jre应该是在c:\programmer and document里面的那个jre......java这点有点烦、一台机器装n个jre:一个是jdk自带server jre、一个是装jdk时也一块装上的client jre、还有一个是当网页遇到applet时提示你安装的client jre。 要是你装了oracle等它们也会给你装个jre。如果你使用JDK6这些就不用管了。mule官网直接说这个问题是JDK5以下的bug。
?
? 四、下载安装不多说了没啥特别的,
?
? 五、mule的例子:
? 1、echo
? 2、hello
? 3、stockquote
? 4、errorhandler
? 5、scripting
? 6、loanbroker ——最常用的例子
? 7、webapp
? 8、bookstore
? mule的企业版还有额外3个例子:
? 9、JDBC Examples
? 10、WebSphere MQ Example
? 11、WS-Security Example
?
<myns:dateformat id="dateFormat" pattern="yyyy-MM-dd HH:mm" lenient="true"/>?? 这段配置本质上和如下老式配置一样:
<bean id="dateFormat" value="true"/></bean>?
<!-- myns.xsd (inside package org/springframework/samples/xml) --><?xml version="1.0" encoding="UTF-8"?><xsd:schema xmlns="http://www.mycompany.com/schema/myns" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:beans="http://www.springframework.org/schema/beans" targetNamespace="http://www.mycompany.com/schema/myns" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xsd:import namespace="http://www.springframework.org/schema/beans"/> <xsd:element name="dateformat"> <xsd:complexType> <xsd:complexContent> <xsd:extension base="beans:identifiedType"><!-- 使用id属性来唯一标识bean --> <xsd:attribute name="lenient" type="xsd:boolean"/> <xsd:attribute name="pattern" type="xsd:string" use="required"/> </xsd:extension> </xsd:complexContent> </xsd:complexType> </xsd:element></xsd:schema>?? 使用一个schema-aware XML editor,你就可以在IDE中得到枚举属性值提示能力。
http\://www.mycompany.com/schema/myns/myns.xsd=org/springframework/samples/xml/myns.xsd?
<foo:component id="bionic-family" name="Bionic-1"> <foo:component name="Sport-1"/> <foo:component name="Rock-1"/> </foo:component>?
自定义的foo空间Component组件类有个List components集合成员,但是对这个成员没有setter方法,只能一个一个放入元素。对此情况的解决方式就是创建一个自定义org.springframework.beans.factory.public class ComponentFactoryBean implements FactoryBean { private Component parent; private List children; public void setParent(Component parent) { this.parent = parent; } public void setChildren(List children) { this.children = children; } public Object getObject() throws Exception { if (this.children != null && this.children.size() > 0) { for (Iterator it = children.iterator(); it.hasNext();) { Component childComponent = (Component) it.next(); this.parent.addComponent(childComponent); } } return this.parent; } public Class getObjectType() { return Component.class; } public boolean isSingleton() { return true; }}?
<?xml version="1.0" encoding="UTF-8" standalone="no"?><xsd:schema xmlns="http://www.foo.com/schema/component" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.foo.com/schema/component" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xsd:element name="component"> <xsd:complexType> <xsd:choice minOccurs="0" maxOccurs="unbounded"> <xsd:element ref="component"/> </xsd:choice> <xsd:attribute name="id" type="xsd:ID"/> <xsd:attribute name="name" use="required" type="xsd:string"/> </xsd:complexType> </xsd:element></xsd:schema>?
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;public class ComponentNamespaceHandler extends NamespaceHandlerSupport { public void init() { registerBeanDefinitionParser("component", new ComponentBeanDefinitionParser()); }}?
public class ComponentBeanDefinitionParser extends AbstractBeanDefinitionParser { protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) { BeanDefinitionBuilder factory = BeanDefinitionBuilder.rootBeanDefinition(ComponentFactoryBean.class); BeanDefinitionBuilder parent = parseComponent(element); factory.addPropertyValue("parent", parent.getBeanDefinition()); List childElements = DomUtils.getChildElementsByTagName(element, "component"); if (childElements != null && childElements.size() > 0) { parseChildComponents(childElements, factory); } return factory.getBeanDefinition(); } private static BeanDefinitionBuilder parseComponent(Element element) { BeanDefinitionBuilder component = BeanDefinitionBuilder.rootBeanDefinition(Component.class); component.addPropertyValue("name", element.getAttribute("name")); return component; } private static void parseChildComponents(List childElements, BeanDefinitionBuilder factory) { ManagedList children = new ManagedList(childElements.size()); for (int i = 0; i < childElements.size(); ++i) { Element childElement = (Element) childElements.get(i); BeanDefinitionBuilder child = parseComponent(childElement); children.add(child.getBeanDefinition()); } factory.addPropertyValue("children", children); }}?
# in 'META-INF/spring.handlers'http\://www.foo.com/schema/component=com.foo.ComponentNamespaceHandler?
# in 'META-INF/spring.schemas'http\://www.foo.com/schema/component/component.xsd=com/foo/component.xsd?
?