0%

JBoss Fuse:开发和部署Web Service

快速开始

因为Fuse的核心组成部分是ServiceMix
所以“用Fuse开发WebService”也就是“用ServiceMix开发WebService”。

[ServiceMix提供了大量的开发工具(http://search.maven.org/#search%7Cga%7C1%7Corg.apache.servicemix.tooling),

其中servicemix-cxf-code-first-osgi-bundle是用于开发“代码优先”的Web Service的一个maven archetype。可以快速创建一个demo:

1
2
3
4
5
6
7
mvn archetype:generate  \
-DarchetypeGroupId=org.apache.servicemix.tooling \
-DarchetypeArtifactId=servicemix-cxf-code-first-osgi-bundle \
-DarchetypeVersion=2013.01 \
-DgroupId=thinkinside.demo.fuse \
-DartifactId=webservice-demo \
-Dversion=1.0.0-SNAPSHOT

会创建如下结构的一个工程:

webservice工程目录结构

pom.xml来看,这是一个使用maven-bundle-plugin构建的OSGi bundle工程

Apache CXF与Spring

上面的工程中包含了`META-INF/spring/beans.xml’文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated by Apache ServiceMix Archetype -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd">


<jaxws:endpoint id="HTTPEndpoint"
implementor="thinkinside.demo.fuse.person.PersonImpl"
address="/PersonServiceCF"/>

</beans>

说明这个bundle依赖ServiceMix中集成的Spring DM插件
可见,该工程中使用了Spring DM。

之所以在ServiceMix中既有Apache Areis Blueprint,又有Spring DM,是因为有很多遗留系统是基于Srping的。比如,Apache CXF就专门提供了使用Sping集成和发布WebService的机制

上面beans.xml中的<jaxws:endpoint>标签,就是由CXF提供的专门用于spring的schema中定义。

在ServiceMix中,CXF通过OSGi bundle: cxf-bundle-compatible被容器管理。

部署到ServiceMix

执行mvn package后,得到webservice-demo-1.0.0-SNAPSHOT.jar,这是一个OSGi bundle。可以将jar文件部署到

$SERVICEMIX_HOME/deploy/目录中。正常情况下,bundle的依赖关系被满足,该bundle会被自动启动。
此时访问http://localhost:8181/cxf,应该能够在Apache CXF服务清单中看到beans.xml中定义的web service。

从ServiceMix到Fuse

上述的过程也适用于JBoss Fuse。

但是Fuse对ServiceMix进行了再次封装,需要使用Fuse对应的版本。比如,servicemix-cxf-code-first-osgi-bundle的版本可能要使用2012.01.0.redhat-60024这样的“Fuse版本号”,否则在部署到Fuse是可能会发生版本不匹配的问题。

Fuse提供了一个maven仓库,专门提供这种定制版本的组件,需要在maven中配置:

1
2
3
4
5
6
7
8
9
10
<repository>
<id>fusesource</id>
<url>http://repo.fusesource.com/nexus/content/groups/public/</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>