使用ServicemixESB发布一个外部的WebServiceWord下载.docx
《使用ServicemixESB发布一个外部的WebServiceWord下载.docx》由会员分享,可在线阅读,更多相关《使用ServicemixESB发布一个外部的WebServiceWord下载.docx(34页珍藏版)》请在冰豆网上搜索。
Servicemix的教程参考:
http:
//servicemix.apache.org/tutorials.html
CXF教程参考:
//servicemix.apache.org/4-beginner-web-services-with-servicemix-and-cxf.html
本文使用CXF-bc来实现,参考:
//servicemix.apache.org/servicemix-cxf-bc.html
所需工具:
apache-Servicemix-3.2.2release(据官方说,开源变化很大,最新的比较完备,至少需要3.2以上版本)
//servicemix.apache.org/download.html
apache-Maven2.0以上版本
//maven.apache.org/download.html
JDK1.5以上版本
apache-axis2
//ws.apache.org/axis2/download.cgi
apache-tomcat
apacheeclipsewsdl插件(ServiceArchiveWizard-EclipsePlug-in,CodeGeneratorWizard-EclipsePlug-in等)
//ws.apache.org/axis2/tools/index.html
示例:
1,安装好JDK,并且配置好JDK的环境变量
2,安装好Maven,并且配置好Maven的环境变量
环境变量:
M2_HOME:
;
解压Maven的目录
M2:
&
nbsp;
M2_HOME%/bin
MAVEN_OPTS:
-Xms256m-Xmx512m
Path:
%M2%
3,安装好Servicemix
测试:
在CMD下,Servciemix安装目录下
运行
cdbin
servicemix
则服务器启动
在http:
//localhost:
8192/可以看到服务器已经在运行。
4,安装好Tomcat,并且配置好环境变量
5,安装好Axis2,并且配置好环境变量
注:
这里可以使用简单方式,下载Axis2的war包,直接发布到Tomcat中就可以。
8080/下检查新添加的Axis2服务
6,将ServiceArchiveWizard-EclipsePlug-in等插件装进Eclipse
这些插件不是必要的,仅仅可以使工作变得简单一些。
7,打开Eclipse并新建动态Web工程(Eclipse需要WTP插件)
输入Project名字HelloWorld,然后点击finish
8,在新建的工程中添加class
在新建的project的src中添加一个package
package名字为sample
在该包中添加一个class
Class的名字为Hello,点击Finish
修改java文件的内容如下。
9,生成wsdl文件
这里可以用CodeGeneratorWizard-EclipsePlug-in插件生成,也可以用其他插件生成,差别不大
以上两种方法都可以,第二种只要按照提示来就可以了,分别是选择class,选择生成路径
下面说第一种方法
这里如果想测试的话,就把左上条子拉到顶,点击finish
点击Operations中刚刚发布Say
输入World,看到返回值正常
10,发布webservice
发布WebService有很多种方式,可以把它直接发布Tomcat中,也可以利用Axis来发布
我们使用Axis2来发布
注意,我们要发布到Axis2中,所以我们service的address就变了,这里需要根据实际发布地址进行修改
例如本示例修改如上
1.<
wsdlsoap:
address
location="
8080/axis2/services/HelloService"
/>
使用插件ServiceArchiveWizard-EclipsePlug-in
点击Next,然后选择Class文件的路径
点击Next,选择我们刚刚发布的wsdl
点击Next,然后来选择必要的jar包。
点击Next,勾选自动生成Service.xml
点击Next,填选Class
点击Next,填写发布路径
点击Finish,则在目标路径生成aar文件
将生成的aar文件复制到%Tomcat%/webapps/axis2/WEB-INF/services下,或者在axis2的admin页面添加该aar文件
默认的用户名是admin,密码是axis2
点击UploadService
将刚刚生成的wsdl发布
发布成功后,就可以在Service中找到刚刚发布HelloService
点击HelloService,我们就可以看到这个服务的具体内容,就是我们刚刚发布wsdl。
至此,我们成功地发布了一个webservice
*以上示例使用的是POJOs形式发布。
11,运行Servicemix
运行cmd,然后启动servicemix服务
等待服务完全开启。
当启动成功之后。
我们就可以在JDK的控制台看到关于ServiceMix的服务信息
%JDK%/bin/jconsole.exe
则我们可以找到servicemix的服务已经开启
点击连接,则我们可以看到servicemix中的所有信息,包括所有的操作及消息队列等等,在此不多述。
12,新建一个Servicemix的组件
我们的目的是WebService,所以我们建一个Cxf-bc的组件
在任意路径下建一个项目工程的目录,示例建立的是D:
/CXFHello
运行cmd,进入该目录
键入
1.mvn
archetype:
create
-DarchetypeGroupId=org.apache.servicemix.tooling
-DarchetypeArtifactId=servicemix-project-root
-DgroupId=org.apache.servicemix.tutorial
-DartifactId=tutorial-wsdl-cxf-service
用来创建一个标准的pom.xml
在这个pom.xml中,对于一些基本的工程配置作了设定
在我们成功建立了之后,会发现CXFHello文件夹下面多出了一个路径
则我们在这个新建的路径下面运行
install
至此,我们已经将这个新建的工程发布到我们的本地Mavenrepository中
下面我们建立一个CXF-BCServiceUnit
在我们刚才建立的工程文件夹下面,运行
-DarchetypeArtifactId=servicemix-cxf-bc-service-unit
-DgroupId=org.apache.servicemix.examples
-DartifactId=my-cxf-bc-su
用来创建一个标准的CXF-BC-SU组件
至此,我们建议了一个标准的CXF-BC-SU组件的框子
现在进入新建的组件的文件夹。
我们看到一个pom.xml文件,这个是对这个组件进行配置的一个文件。
打开,我们可以看到详细内容
现在我们修改这个组件的名字
将<
name>
ACxfBCServiceUnit<
/name>
改成<
Cxf-Hello-SU<
然后我们需要将我们发布在Axis2上的Webservice的wsdl复制下来放入servicemix这个bc组建之中。
关于wsdl文件
打开wsdl文件,我们可以发现,wsdl其实定义了webservice的所有规范,例如它的名字,接口,方法,参数等等
而我们需要将wsdl复制到我们要发布的servicemix当中,是因为我们暴露出去的接口,方法,参数等要能和实际服务的webservice一致。
所以servicemix当中需要一个由同样接口定义的wsdl文件
访问
http:
8080/axis2/services/HelloService?
wsdl
得到我们刚才发布的webservice的wsdl文件
将这个wsdl文件复制到%/my-cxf-bc-su/src/main/resources
下
其实这里原本就预订了一个wsdl文件的位置。
注意,我的wsdl名字叫做Hello.wsdl,因此,当复制过来后,原来的service.wsdl就可以删除了
当然,我们也可以把刚才ecilpse项目中生成的wsdl复制过来,这是一样的文件
现在我们需要修改这个复制进来的wsdl文件
将webservice服务定义作如下替换
1.
<
wsdl:
service
name="
HelloServiceProxy"
>
2.
3.
port
binding="
impl:
HelloSoapBinding"
HelloProxy"
4.
5.
8193/HelloWorld/"
6.
7.
/wsdl:
port>
8.
9.
service>
结果如下图
现在我们已经完成了对wsdl的设定,现在我们需要在xbean.xml设定consumer和provider来帮定这些东西。
打开xbean.xml,作如下修改
首先,我们需要一个namespace,这个namespace要和我们引用的wsdl中的service和endpoint的namespace一致,这样我们才能准确找到service和接口
我们的wsdl定义的targetNamespace="
//sample"
所以我们bc组件中的consumer和provider定义的namespace也必须和上面一样
现在来定义consumer和provider,基本的定义规则参照:
//servicemix.apache.org/servicemix-cxf-bc.html
则最终修改好的文件如下
这里采用轻量级模式,即,将consumer和provider写在一个serviceunit内,如果想在中间加入其它程序,则可以将consumer和provider分成两个serviceunit
这样serviceunit就建好了,接下来我们建立serviceassembly
在我们的工程路目下运行
-DarchetypeArtifactId=servicemix-service-assembly
-DartifactId=my-cxf-sa
现在可以看到工程目录中新建出来了SA的文件夹
同样,我们修改一个名字
Cxf-Hello-SA<
接下来,我们要在这个SA中注册我们刚才制作的SU
1.……
2.
dependencies>
dependency>
4.
groupId>
org.apache.servicemix.examples<
/groupId>
artifactId>
my-cxf-bc-su<
/artifactId>
6.
version>
1.0-SNAPSHOT<
/version>
/dependency>
8.
/dependencies>
9.……
好了现在一切就绪,我们在工程目录下面运行
就可以建立好组件了
在buildsuccessful之后,我们就可以在
%/my-cxf-sa/target
目录下面看到我们建立好的jar包
将这个jar包复制到servicemix目录下面的/hotdeploy文件夹,来正式发布到servicemix当中
如此一来,我们就成功的发布了一个服务到servicemix上
下面让我们来检测一下成果
建立一个客户端html如下
html>
2.<
head>
3.<
title>
ServiceMix
WSDL-First
Example<
/title>
4.<
script
type="
text/javascript"
5.var
urlToOpen
=
"
;
//default
URL
to
open
7.function
getHTTPObject()
{
var
xmlhttp
false;
9.
10.
/*
Compilation
conditionnelle
d'
IE
*/
11.
/*@cc_on
12.
@if
(@_jscript_version
5)
13.
try
14.
new
ActiveXObject("
Msxml2.XMLHTTP"
);
15.
}
catch
(e)
16.
17.
Microsoft.XMLHTTP"
18.
(E)
19.
20.
}
21.
22.
@else
23.
24.
@end
@*/
25.
26.
on
essaie
de
cré
er
l'
objet
si
ce
n'
est
pas
dé
jà
nbsp;
fait
27.
if
(!
typeof
XMLHttpRequest
!
'
undefined'
)
{
28.
29.
XMLHttpRequest();
30.
31.
32.
33.
34.
35.
(xmlhttp)
36.
finit
qui
doit
se
passer
quand&
la
page
ré
pondra
37.
xmlhttp.onreadystatechange=function()
38.
(xmlhttp.readyState
==
4)
{
4
:
é
tat
complete"
39.
response
document.getElementById("
response"
40.
responseStatus
41.
42.
xmlhttp.status
+
43.
44.
ERROR
WHILE
RETRIEVING
STATUS;
MAYBE
UNABLE
TO
CONNECT."
45.
46.
response.value
STATUS:
/n"
xmlhttp.responseText;
47.
48.