InfoQ

InfoQ

文章

我的书签

登录注册 以永久保存书签。

该内容已经被标记书签!

标记书签错误,请重试!

通过邮件服务器集成应用

作者 Tijs Rademakers and Jos Dirksen 译者 胡键 发布于 2009年2月1日

领域
企业架构
主题
ESB ,
SOA
标签
Mule ,
Apache

这篇文章取自《Open Source ESBs in Action: Example Implementations in Mule and ServiceMix》一书。这部分内容展示了如何通过邮件服务器集成Mule和ServiceMix。

在性能和速度无关紧要的情况下,有一种非常容易且具有异步性的应用集成方式:基于邮件的集成。使用POP3和SMTP可以简化应用之间的通信。除此之外,它还简化了跟终端用户或者具体事件的支持部门之间所进行的通信。例如,当错误发生时,通过发送包含错误及附加信息的邮件自动通知支持部门。

我们将展示如何从Mule和ServcieMix使用SMTP和POP3协议跟邮件服务器通信。至于邮件服务器,我们将使用Apache James,它是一个支持所有邮件相关协议的开源邮件服务器。当然,就本节的例子而言,你也可以使用自己的邮件服务器。

我们会再次关注连通性的功能,并在此向你展示两个基本示例。第一个示例如图6.1,它将展示如何从Mule和ServiceMix给邮件服务器发送电子邮件。

图6.1,在本例中,我们将使用ESB从文件系统中读取文件,并使用SMTP连通性把该消息转发给邮件服务器。

我们使用Mule和ServiceMix实现的另一个示例如图6.2,从邮件服务器接收电子邮件消息。

图6.2,在本例中,我们将使用具有POP3连通性的ESB从邮件服务器接收电子邮件,并把该电子邮件消息发送给文件系统。

为了实现图6.1和6.2的示例,我们将使用文件连通性来触发或处理邮件连通性的结果,因为这样容易测试。这些图也显示了邮件客户端的使用,并且在这些示例中,你可以使用你喜爱的邮件客户端。首先让我们看看如何在Mule中配置SMTP连通性。

将Mule连接到POP3和SMTP

我们将着手的第一件事情就是如何对Mule进行设置,以便我们能够把电子邮件发送到Mule配置中指定的电子邮件地址。我们已在本节的介绍中说过,我们打算从文件系统中读取一个文件,并把这个文件的内容作为电子邮件消息体发送到一个指定电子邮件地址。在如下代码清单中显示的Mule配置定义了这个SMTP 连通性。

清单6.1 Mule服务配置:使用SMTP发送电子邮件

<mule xmlns="http://www.mulesource.org/schema/mule/core/2.0"
  xmlns:file="http://www.mulesource.org/schema/mule/file/2.0"
  xmlns:smtp="http://www.mulesource.org/schema/mule/smtp/2.0">

 <model name="mail-model">
  <service name="file-to-mail">
    <inbound>
      <file:inbound-endpoint path="chapter6/4a/in">	#1

    <file:file-to-string-transformer />
      </file:inbound-endpoint>
   </inbound>
   <outbound>
      <outbound-pass-through-router>
        <smtp:outbound-endpoint	#2
	to="johndoe@localhost"
	cc="info@localhost"
	from="mu le@localhost"
	replyT o="sales@localhost"
	subject="You've got mail from Mule!"
	host="localhost"	#3
	port="10025"	#3
	user="mule"	#3
	password="mule" />	#3
      </outbound-pass-through-router>
   </outbound>
  </service>
 </model>
</mule>
#1: 文件输入路径
#2: 定义SMTP发送端点
#3: 配置SMTP连接属性

我们只需要在SMTP发送端点定义(#2)中告诉Mule连接SMTP服务器的方式(#3)。在这个例子中,我们使用“mule”作为连接本地邮件服务器(Apache James)的用户名和密码。

在使用这个Mule配置启动Mule之前,我们首先需要使用ch6-build.xml文件中的Ant target:ext:start-james来启动Apache James。现在我们可以使用同一Ant构建文件中的Ant target:chapter6-mail-smtp-4a来运行这个示例。为了触发代码清单6.26中的SMTP服务定义,你需要在 chapter6/4a/in目录中放入一个文件(#1)。Mule会把文件内容(文件内容作为电子邮件的消息体)发送到指定端点。我们现在可以使用任何邮件客户端接收这条消息了,如下图:

图6.3 截屏显示了通过我们已经实现的Mule配置,能够接收电子邮件消息。

我们已经看到了如何配置Mule去发送E-Mail,那么现在让我们看看这一节的另一个内容:接收电子邮件消息。为了演示这个示例,我们将使用邮件客户端发送邮件,并使用Mule POP3传输(Transport)读取来自邮件服务器的消息。首先,我们将再次看看Mule配置,如代码清单6.2。

清单6.2 Mule服务配置:使用POP3接收电子邮件。

<mule xmlns="http://www.mulesource.org/schema/mule/core/2.0"
xmlns:file="http://www.mulesource.org/schema/mule/file/2.0"
xmlns:pop3="http://www.mulesource.org/schema/mule/pop3/2.0">


  <pop3:connector name="pop3Connector"
   checkFrequency="5000"	#1
   deleteReadMessages="false"/>	#2

  <model name="mail-model">
    <service name="mail-sender">
      <inbound>
       <pop3:inbound-endpoint	#3
          host="localhost"
	  name="mule"
	  password="mule"
	  port="10110" />
      </inbound>
      <outbound>
        <outbound-pass-through-router>
          <file:outbound-endpoint
            path="chapter6/4b/out"/>	#4
        </outbound-pass-through-router>
      </outbound>
    </service>
  </model>
</mule>
#1: 每隔5秒钟检查一次电子邮件
#2: 不删除已读电子邮件
#3: POP3连接配置
#4: 文件输出路径

上述代码看起来和列表6.1中的代码类似,在6.1中我们讨论了如何发送电子邮件消息。我们配置了POP3服务器的位置和用来创建连接的用户名和密码 (#3). 我们还指定了pop3:connector上某些其它属性。在这个例子中,我们告诉Mule不要删除已被它接收的消息(#2),并且每隔5秒检查一次新的电子邮件消息(#1)。

要想对此进行测试,使用简单的邮件客户端即可。只需向mule@localhost发送一条消息,你就会看到Mule将获得这条消息并对它进行处理。

至此,我们已经知道了Mule如何跟POP3和SMTP一起工作。除了这些协议,Mule还支持其安全变种:SPOP3、SMTPS和IMAP。使用这些安全传输的方式和本节中所讲的方式是一样的,你仅仅需要提供额外的安全属性,如证书。

将ServiceMix连接到POP3和SMTP

为了在ServiceMix上实现邮件连通性,我们需要一个使用POP3接收电子邮件消息的绑定组件,还需要一个使用SMTP发送电子邮件消息的绑定组件。ServiceMix有一个可用的邮件绑定组件,但只在3.3或者更高版本上才提供。在撰写本书的时候,该版本尚未发布,因此我们将使用由另一个 JBI实现提供的邮件JBI组件。

在JDBC示例中,我们已经展示了如何在OpenESB项目中使用JBI组件。在本例中,我们将使用Petals项目提供的JBI组件,该项目已经在第1章讨论过了。当我们在第3章创建环境的时候,我们已经提供了这个绑定组件,所以这里就不需要额外的安装或者下载。

SERVICEMIX中的PETALS组件

遗憾的是,在ServiceMix容器中,Petals组件并不是开箱即用的。之前我们就提到,这通常是由不兼容的Jar文件或其他库以及类加载问题所引起的。然而在这个例子中,这一问题是由ServiceMix的一个bug所引起的。只要检查一下JDBC示例中的jbi.xml文件,你就能发现我们指定了consume和provide元素。JBI规范对这两个元素进行了描述,它们不允许使用特定于服务的配置。ServiceMix使用xbeans完成这一配置,而OpenESB项目则使用WSDL文件配置服务。但是,Petals使用了JBI规范中描述的标准扩展机制。这允许额外的配置元素出现在 jbi.xml文件中。但在ServiceMix中,只有第一个扩展元素能够被处理。我们已经提供了解决这个问题的补丁。

我们在本节一开始就已经说过,我们要从文件系统中读取一个文件,然后使用ServiceMix把包含文件内容的电子邮件消息发送到某个电子邮件地址。

到目前为止,我们在每个示例中所做的第一件事就是配置一个轮询文件系统的简单文件轮询器。该配置如代码清单6.3所示。

清单6.3 文件轮询器配置:向邮件服务发送消息

<beans>
  <file:poller service="esb:filePoller"
    endpoint="simpleToMailPoller"
    targetService="esb:mail-service"	#1
    targetEndpoint="mailEndpoint"	#1
    file="chapter6/6a-mail/in"	#2
    period="2000">
  </file:poller>
</beans>
#1: 待调用的邮件服务
#2: 待轮询的目录

在这个文件轮询器配置中,我们仅仅从文件系统读取文件,然后把收到的文件发送给邮件服务端点。现在让我们把重点放在邮件服务配置上。

我们在前一节就已经解释了,ServiceMix中服务单元的配置是以xbean.xml文件形式完成的。当联合使用Petals的时候,你是在 jbi.xml文件中而不是在xbean.xml文件中配置服务单元。向邮件地址发送消息的Petals服务单元的配置如清单6.4所示。

清单6.4 使用Petals邮件绑定组件发送邮件的配置:

<?xml version="1.0" encoding="UTF-8"?>
<jbi:jbi xmlns:xsi="http://www.w3.org/2001/XMLSchem a-instance"
  xmlns:petals="http://petals.ow2.org/extensions"
  xmlns:jbi="http://java.sun.com/xml/ns/jbi"
  xmlns:esb="http://opensourceesb/mail/"
  version="1.0">

  <jbi:services binding-component="true">
    <jbi:provides interface-name="esb:MailInterface"	#1
       service-name="esb:MailService"
       endpoint-name="mailEndpoint">
     <petals:wsdl></petals:wsdl>
     <petals:su-interceptors></petals:su-interceptors>
     <petals:params>
       <petals:param name="scheme">smtp</petals:param>
       <petals:param name="hostname">localhost</petals:param>	#2
       <petals:param name="port">10025</petals:param>	#2
       <petals:param name="username">petals</petals:param>	#2
       <petals:param name="password">petals</petals:param>	#2
       <petals:param name="from">
       servicemix@localhost
       </petals:param>

       <petals:param name="to">sm@localhost</petals:param>	#3
     </petals:params>
    </jbi:provides>
  </jbi:services>
 </jbi:jbi>
#1: JBI服务定义
#2: 邮件连接定义
#3: 目标电子邮件地址

给ServiceMix添加支持邮件的Petals邮件绑定组件很简单。你所要做的就是配置邮件服务器的位置(#2)。有一件事情你可能已经注意到了:我们没有设置邮件主题。这是Petals邮件组件的一个局限,待发送邮件消息的主题通常被设置成服务的名字。所以在这个示例中,发送邮件的地方,邮件的主题就是“mail-service”。该组件目前的一项工作就是提供主题名的可配置性。

关于这个配置,还需要注意的一件事是“provides”元素(#1)。在第2章中,我们已经讨论了消费者和提供者。这个例子实现了一个提供者,其他JBI服务可通过向这个服务端点发送一条JBI消息,从而对该提供者进行访问。

如果我们现在用Ant构建文件(ch6-build.xml)运行这个例子,往清单6.2中指定的输入目录中放入一个文件,ServiceMix就会取出这条消息并把它发送给Petals邮件组件,然后该组件就会将一条电子邮件消息发送给已配置的邮件地址:sm@localhost(#3)。

为了接收电子邮件消息,我们需要为同一个Petals邮件绑定组件配置另一个jbi.xml文件,只是这次我们需要消费一个由ServiceMix文件绑定组件提供的服务端点。首先让我们看看由如下代码片断中的文件组件所提供的服务端点。

<file:sender service="esb:mailFileWriter"
    endpoint="sender"
    directory="chapter6/6-mail/out">
</file:sender>

这个文件绑定组件的配置提供了一个名为esb:mail-service的JBI服务,并拥有一个名为sender的端点。我们将从代码清单6.5所示的Petals邮件配置中消费这个服务端点。

清单6.5 邮件组件的Petals配置:接收电子邮件。

<?xml version="1.0" encoding="UTF-8"?>
<jbi:jbi xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:petals="http://petals.ow2.org/extensions"
  xmlns:jbi="http://java.sun.com/xml/ns/jbi"
  xmlns:esb="http://opensourceesb/mail/" version="1.0">


<jbi:services binding-component="true">
   <jbi:consumes	#1
    interface-name="esb:mailFileWriterInterface"
    service-name="esb:mailFileWriter"
    endpoint-name="sender">
   <petals:mep>InOnly</petals:mep>
   <petals:operation>sendMessage</petals:operation>
   <petals:params>
    <petals:param name="period">10000</petal s:param>
    <petals:param name="scheme">pop3</petals:param>
    <petals:param name="hostname">	#2
    localhost
    </petals:param>
    <petals:param name="port">10110</petals:param>
    <petals:param name="username">	#3
    servicemix
    </petals:param>
    <petals:param name="password">
    servicemix
    </petals:param>
   </petals:params>
  </jbi:consumes>
 </jbi:services>
</jbi:jbi>
#1: JBI 服务定义
#2: 邮件主机名的配置
#3: 邮件服务器认证所用的用户名

其与代码清单6.4的邮件组件配置最大的区别在于,对于scheme,我们指定的是POP3 ,而不是SMTP。这将告诉Petals邮件组件开始对邮件消息进行轮询。每当一条消息被收到,它都会被发送给“consume”元素的服务端点 (#1)。在这个示例中,我们指定了文件发送者JBI服务的服务和端点名。因此,只要收到一条消息,它都会被传递给文件发送者JBI服务,它负责把消息写入文件系统。

除了Petals,OpenESB也提供了邮件组件。OpenESB的邮件组件提供了大量配置选项和特性,但由于需要基于WSDL的配置(参见6.3节的 JDBC例子),它的使用难度较大。如果你只想用一种容易方式连接到邮件服务器,Petals组件可能是最好的解决方案;但若你需要更多的高级特性且不介意使用基于WSDL的配置,那么OpenESB组件会是一个不错的选择。当然,ServiceMix 3.3版本将提供一个开箱即用的邮件绑定组件。

查看英文原文Application Integration Through Mail Servers


给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家加入到InfoQ中文站用户讨论组中与我们的编辑和其他读者朋友交流。

深度内容

大规模视频网站的计费与流量管理

本次分享将会就大规模视频网站的计费与流量管理这个话题,从操作层面细细进行讲解和分析,为系统工程师们揭示平日里我们没有关心的另一些内容。同时也希望本次分享能揭示行业中的一些“潜规则”,让互联网行业的流量与带宽管理更为开放与简洁。
本次演讲视频录制于QCon杭州2011

专访Jeffrey Richter:Windows 8是微软的重中之重

Jeffrey Richter以其多本Windows核心技术的经典著作而闻名,同时,他深入掌握微软的.NET等一系列核心技术,2012年1月,Jeffrey Richter在北京接受了InfoQ中文站的专访,谈到Windows 8和WinRT编程,并就异步编程、Windows编程中的可扩展性、性能和安全性方面给出自己的建议。

应用云平台的可用性——从新浪SAE看云平台设计

云计算平台的可用性,相比传统互联网服务而言,更加复杂和困难,也更具有挑战性。本文借助新浪SAE云平台为读者讲述了云平台可用性的定义、如何打造高可用的平台,以及对云计算的用户提出了建议。

JVM定制改进 @ 淘宝

淘宝高度重视Java平台的健康发展,组建了一个团队专注于Java平台的底层部分的性能、功能与稳定性改进;工作主要基于OpenJDK中的HotSpot VM开展,其中一些通用的功能随后也会逐渐反馈给OpenJDK社区。希望能与使用Java平台开发应用的大家交流经验。
本次演讲视频录制于QCon杭州2011

"伤得起"的云计算应用——对云端应用之架构的思考

2011年4月21日至22日是值得云计算从业者纪念的日子。Amazon的IaaS服务出现故障,导致许多商业网站的服务中断,影响非常严重。作为云计算用户,我们需要思考的是,如何保证即便在云服务不可用的情况,我们的应用架构仍然能够屹立不倒?本文正是站在云计算用户的角度试图探讨这一问题。

让交付的速度跟上思考的速度

12人的技术团队,4组刀片服务器,每月20亿的访问量,每日1次准时部署,99.9%的可用性。这可能吗?当然。想知道如何做的吗?百姓网将与您分享他们在DevOps实践过程中的经验和技巧。
本次演讲视频录制于QCon杭州2011

架构之路——穿行在产品和业务之间

篱笆作为一家起源于社区的电子商务公司,反映到技术层面就是同时要面对产品和业务,以及经营战略的变化调整。如何在产品和业务的夹缝之间完成技术架构的抽象与平衡,寻找更有效的价值定位,这当中有些经验教训和个人感悟愿与众人分享。
本次演讲视频录制于QCon杭州2011

特性注入:成功三部曲

本文将对特性注入以及相关方法做一个扫盲性的介绍。我们会解释这个框架的关键要素,并附上实例来证实它们。为了让文章保持相对较短,我们不会深入到某个工具或方法中,而是会给出一些参考资料,以便大家做进一步的研究。