object broker that can seamlessly handle interactions with services and applications using disparate transport and messaging
technologies。
在这里我们简单看看如何用Mule发布和调用Web服务,体验一下Mule的简洁和高效。
安装Mule
去 Mule官方下载页下载最新的Full版zip文件,解压到一个目录。
运行一下MULE_HOME\examples\maven\echo目录下的echo.bat,则mule会自动下载合适版本的activation.jar和mail.jar到MULE_HOME\lib\user目录
echo.bat示例了一个command prompt下的echo程序,该程序会echo你在命令行输入的字符串。
创建Eclipse项目
我们在Eclipse下新建命名为mule的Java project,其中包结构如下:
mule src-demo cn.hidetoishandsome.mule.demo EchoService.java IEchoService.java images mule-banner.gif WEB-INF lib mule-echo-config.xml web.xml contents.html echo.jsp header.html index.html welcome.html
将MULE_HOME\lib\mule目录和MULE_HOME\lib\opt目录下所有的jar包以及MULE_HOME\lib\user目录下的activation.jar和mail.jar统统扔到WEB-INF\lib目录下。
其中mule-banner.gif、contents.html、header.html、index.html、welcome.html等来自将MULE_HOME\examples\ant\webapp目录下的build.xml用ant
build后在build目录下生成的mule-example-webapp.war中的文件。
在这里我们修改该mule-example-webapp.war工程来demo一下使用Mule发布和调用Web服务。
写我们要发布的服务
上面列出的IEchoService.java为我们要发布的服务的接口,该接口约束了我们要发布的服务:
package cn.hidetoishandsome.mule.demo; public interface IEchoService { String echo(String s); String haha(String s); }
如上,我们将使用该接口发布echo和haha这两个服务。现在写我们的服务实现类EchoService.java(系统集成时可能实现已经存在,我们只需抽离要
发布的服务的窄接口即可):
package cn.hidetoishandsome.mule.demo; public class EchoService implements IEchoService { public String echo(String s) { return "Hello, " + s + "!"; } public String haha(String s) { return "haha"; } public String hehe(String s) { return "hehe"; } }
可以看到,虽然我们的EchoService提供了echo/haha/hehe三个服务,但我们使用IEchoService来约束它,从而只发布其中的echo和haha这两个服务。
配置使我们的服务以Web Service发布
首先我们修改web.xml来让servlet容器listen和mapping一些东西:
Mule Mule Demo org.mule.config /WEB-INF/mule-echo-config.xml, org.mule.config.builders.MuleXmlBuilderContextListener muleServlet org.mule.providers.http.servlet.MuleReceiverServlet muleServlet /services/* index.html
然后我们配置mule-echo-config.xml来以Web Service方式发布我们的服务:
这里我们的echoService实现为cn.hidetoishandsome.mule.demo.EchoService,inbound-router中
来约束我们要发布的服务接口。
运行和调用服务
让我们将该mule项目在Tomcat中跑起来看看效果吧。
例如配置Tomcat的server.xml,在
启动Tomcat,打开浏览器访问 http://localhost:8181/services/echoService?wsdl可以看到Mule通过xfire自动生成的wsdl文档,其中
我们可以看到Mule只暴露了EchoService和echo和haha方法,而没有暴露hehe方法。
现在我们在echo.jsp中利用Mule的UMO(Universal Message Object)API写对我们刚发布的Web服务的客户端调用:
<%@ page import="org.mule.extras.client.MuleClient, org.mule.umo.UMOMessage"%> <%@ page language="java" contentType="text/html; charset=UTF-8" %>Mule Echo Example <% String s = request.getParameter("name"); if(s!=null) { MuleClient client = new MuleClient(); UMOMessage message = client.send("xfire:http://localhost:8181/services/echoService?method=echo", s, null); %><%=message.getPayload()%>
<%}%> Please enter your name:
好了,用浏览器访问 http://localhost:8080/mule并点击左侧菜单的Echo链接,或者直接访问 http://localhost:8080/mule/echo.jsp,然后在input框输入一些文本内容如"Hideto",点击Go,则你会看到页面返回"Hello, Hideto!"。
现在让我们修改echo.jsp,将UMOMessage message = client.send("xfire:http://localhost:8181/services/echoService?method=echo", s, null);
这段代码中的method改为haha,即:
UMOMessage message = client.send("xfire:http://localhost:8181/services/echoService?method=haha", s, null);
然后刷新一下浏览器页面,再输入一些文本内容,看看页面是不是返回"haha"字样了?