最近刚要开始学习Mule,在此将BookStore作为示例记录下来。在例子之前,首先将mule的环境配置完毕,有助于减少不必要的麻烦。
bookstore中有三个小工程,我分别把它们转成了eclips工程,下面是源代码,加了少量的注释,由于其所必须的jar文件过大,将其删除。
附件中的三个工程分别为:
api--定义webservice接口;
admin-web--作为该示例主要的工程,采用mule方式对外提供webservice服务,类似于bs结构中的server端,其作用不言而喻;
bookstore-web--主要是通过webservice从admin-web中获取必要的数据信息。
admin-web、bookstore-web中都会用到api工程的jar包,只要将这两个工程中的target目录下的bookstore-admin,bookstore发布到tomcat中即可访问,当然要把其需要的jar包分别放入对应的目录中才可。
[size=large][color=red]1.bookstore-admin[/color][/size]
[img]http://dl.iteye.com/upload/attachment/208517/80ee1659-0dec-3558-a0e2-198bd2e1d9bb.jpg[/img]
通过上面的代码可以看到添加book的流程为
servlet://catalog(接收来自admin.jsp的请求)->ParameterMapToBook(转换为book)->CatalogServiceImpl(添加book)->AddBookResponse(生成需要输出的信息)->setHtmlContentType(设定格式)。
[size=large][color=red]2.bookstore[/color][/size]
[img]http://dl.iteye.com/upload/attachment/208528/a3012239-6d27-3efa-94a8-af163bacd1b6.jpg[/img]
用户提交需搜索的书籍,系统调用bookstore-admin的webservice服务(http://0.0.0.0:8777/services/catalog)获取书籍信息与搜索的书籍比对,符合条件列出来。
当用户下单时,调用下面定义好的流程,最后调用邮件服务、消息服务。
邮件服务,别忘记将下面的无效邮箱换成可用的邮箱,否则无法发送邮件。
消息服务, 在DataWarehouse组装消息完毕后将其发送到vm://statistics
一切完毕之后,可以回到bookstore-admin中点击首页中的Get Stats按钮从消息队列获取DataWarehouse组装的消息,基本就是这个样子了。
bookstore中有三个小工程,我分别把它们转成了eclips工程,下面是源代码,加了少量的注释,由于其所必须的jar文件过大,将其删除。
附件中的三个工程分别为:
api--定义webservice接口;
admin-web--作为该示例主要的工程,采用mule方式对外提供webservice服务,类似于bs结构中的server端,其作用不言而喻;
bookstore-web--主要是通过webservice从admin-web中获取必要的数据信息。
admin-web、bookstore-web中都会用到api工程的jar包,只要将这两个工程中的target目录下的bookstore-admin,bookstore发布到tomcat中即可访问,当然要把其需要的jar包分别放入对应的目录中才可。
[size=large][color=red]1.bookstore-admin[/color][/size]
[img]http://dl.iteye.com/upload/attachment/208517/80ee1659-0dec-3558-a0e2-198bd2e1d9bb.jpg[/img]
<service name="CatalogService">
<inbound>
<!-- Public interface,接收来自于bookstore的请求 -->
<inbound-endpoint address="cxf:http://0.0.0.0:8777/services/catalog" />
<!-- Administration interface 接收来自admin.jsp页面的请求-->
<inbound-endpoint address="servlet://catalog">
<transformers>
<!-- Extract parameters from HTTP Request -->
<servlet:http-request-to-parameter-map />
<!-- Convert request parameters to Book object -->
<custom-transformer class="org.mule.example.bookstore.transformers.ParameterMapToBook"/>
</transformers>
<response-transformers>
<!-- Format response to be a nice HTML page -->
<custom-transformer class="org.mule.example.bookstore.transformers.AddBookResponse"/>
<!-- Force text/html, otherwise it falls back to request props, which have form-encoded one -->
<transformer ref="setHtmlContentType"/>
</response-transformers>
</inbound-endpoint>
</inbound>
<component>
<singleton-object class="org.mule.example.bookstore.CatalogServiceImpl" />
</component>
</service>
通过上面的代码可以看到添加book的流程为
servlet://catalog(接收来自admin.jsp的请求)->ParameterMapToBook(转换为book)->CatalogServiceImpl(添加book)->AddBookResponse(生成需要输出的信息)->setHtmlContentType(设定格式)。
[size=large][color=red]2.bookstore[/color][/size]
[img]http://dl.iteye.com/upload/attachment/208528/a3012239-6d27-3efa-94a8-af163bacd1b6.jpg[/img]
// Invoke the CXF web service
JaxWsProxyFactoryBean pf = new JaxWsProxyFactoryBean();
pf.setServiceClass(CatalogService.class);
pf.setAddress(CatalogService.URL);
CatalogService catalog = (CatalogService) pf.create();
Collection <Book> books = catalog.getBooks();
用户提交需搜索的书籍,系统调用bookstore-admin的webservice服务(http://0.0.0.0:8777/services/catalog)获取书籍信息与搜索的书籍比对,符合条件列出来。
当用户下单时,调用下面定义好的流程,最后调用邮件服务、消息服务。
<service name="OrderService">
<inbound>
<!-- Public interface ,接收来自于bookstore的请求 -->
<inbound-endpoint address="cxf:http://0.0.0.0:8777/services/order" />
</inbound>
<!-- 指定由下面的实现类来完成这个请求 -->
<component>
<singleton-object class="org.mule.example.bookstore.OrderServiceImpl" />
</component>
<outbound>
<multicasting-router>
<vm:outbound-endpoint path="emailNotification"/>
<vm:outbound-endpoint path="dataWarehouse"/>
</multicasting-router>
</outbound>
</service>
邮件服务,别忘记将下面的无效邮箱换成可用的邮箱,否则无法发送邮件。
<service name="EmailNotificationService">
<inbound>
<vm:inbound-endpoint path="emailNotification" />
</inbound>
<outbound>
<pass-through-router>
<!-- 成功发送邮件 -->
<smtp:outbound-endpoint user="username" password="password" host="smtp.gmail.com"
from="username@gmail.com" subject="Your order has been placed!">
<transformers>
<custom-transformer class="org.mule.example.bookstore.transformers.OrderToEmailTransformer" />
<email:string-to-email-transformer />
</transformers>
</smtp:outbound-endpoint>
</pass-through-router>
</outbound>
</service>
消息服务, 在DataWarehouse组装消息完毕后将其发送到vm://statistics
<service name="DataWarehouse">
<inbound>
<vm:inbound-endpoint path="dataWarehouse"/>
</inbound>
<component>
<singleton-object class="org.mule.example.bookstore.DataWarehouse" />
</component>
<outbound>
<pass-through-router>
<!-- 消息发往vm://statistics,以供bookstore-admin获取信息 -->
<outbound-endpoint ref="stats" transformer-refs="setHtmlContentType"/>
</pass-through-router>
</outbound>
</service>
一切完毕之后,可以回到bookstore-admin中点击首页中的Get Stats按钮从消息队列获取DataWarehouse组装的消息,基本就是这个样子了。