在性能和速度无关紧要的情况下,有一种非常容易且具有异步性的应用集成方式:基于邮件的集成。使用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进行设置,以便我们能够把电子邮件发送到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 #2to="johndoe@localhost"cc="info@localhost"from="mu le@localhost"replyT o="sales@localhost"subject="You've got mail from Mule!"host="localhost" #3port="10025" #3user="mule" #3password="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" #1deleteReadMessages="false"/> #2<model name="mail-model"><service name="mail-sender"><inbound><pop3:inbound-endpoint #3host="localhost"name="mule"password="mule"port="10110" /></inbound><outbound><outbound-pass-through-router><file:outbound-endpointpath="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有一个可用的邮件绑定组件,但只在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" #1targetEndpoint="mailEndpoint" #1file="chapter6/6a-mail/in" #2period="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" #1service-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 #1interface-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"> #2localhost</petals:param><petals:param name="port">10110</petals:param><petals:param name="username"> #3servicemix</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版本将提供一个开箱即用的邮件绑定组件。
联系客服