作者:李红霞
时间:2006-10-19
声明:本文可以算作Axis2用户手册的翻译,但是翻译后的文本是经过作者理解写出来的,可能有些偏差,欢迎讨论。本文属作者原创,允许转载,但请注明出处。
英文原文http://ws.apache.org/axis2/1_0/userguide.html
概述
这个说明文档涉及以下内容:
Ø 如何使用 axis2 创建 web service 和客户端程序
Ø 如何定制一个模块 (Module) 并在 web service 中使用它
Ø Samples discussion
Ø Advanced Topics
第一部分:简介
Axis2 是重新设计的一个架构,它没有基于 Axis1.* 的结构,这种新的架构 much more flexible, efficient and configurable 。
Axis2 的特性有:
Speed 采用自己的对象模型,利用 StAX 解析
Low memory foot print Axis2 在设计过程中一直遵循 low memory cost 的理念
AXIOM 采用自己的轻量级的对象模型,使得消息处理过程可扩展、性能高,对开发者来说更加简单。
Hot Deployment Axis2 装备了在系统运行时部署服务和处理器的能力。也就是说,新的服务新服务的添加不再需要重启服务器。将服务的发布包放在服务部属文件夹中,部署模型将自动部署该服务。
Asynchronous Web Services Axis2 现在可以通过 non-blocking clients and transports 支持异步的服务和异步的服务调用。(?什么是异步的服务 ? )
MEP Support Axis2 具备良好的伸缩性来支持 MEPs ,因为它内置了对 WSDL2.0 中 MEPs 的支持。
Flexibility Axis2 的架构使得程序员能自由的对 Axis 添加扩展,这些扩展包括对自定义 Header 的处理,系统管理,甚至是任何一件你可以想象的到的事情
Stability Axis2 定义了一套公共接口,这些接口相对于其他代码而言改动很小
Component-oriented Deployment 你可以自定义一些在处理过程中常用的可重用的处理器,并可以将这些处理器发布出来供其它人使用
Transport Framework 定义了一个干净、简单的抽象作品来集成任意的传输协议,引擎的核心部分的实现是与传输协议无关的
Add-ons 一些 web service 相关的协议也合并了进来。如安全方面的 WSS4J(Rampart), 可靠消息传输的 Sandesha ,封装了 WS-Coordination, WS-AtomicTransaction 和 WS-BusinessActivity 的 Kandula 。
Composition and Extensibility 模块和层支持可扩展性和可组合性( composability )。模块支持可组合性,对添加新的 web service 规范的支持的方式非常简单和干净。但是他们并不是热部署的,因为他们影响整个系统的功能。
Tips:
WSS4J: http://ws.apache.org/wss4j/
Apache WSS4J is an implementation of the OASIS Web Services Security (WS-Security) from OASIS Web Services Security TC. WSS4J is a primarily a Java library that can be used to sign and verify SOAP Messages with WS-Security information. WSS4J will use Apache Axis and Apache XML-Security projects and will be interoperable with JAX-RPC based server/clients and .NET server/clients.
这个项目提供了在 Axis 上部署的帮助文档和例子
Rampart
这是 Axis2 的一个 Module (现在 Axis2 有两个可选的 Module ,分别是 Addressing 和 Security , Addressing 包含在 Standard 版本中,但是 Rampart 需要单独下载),目前作用不详,猜测是与 WSS4J 合作完成 WS-Security
Sendesha: http://ws.apache.org/sandesha/
Sandesha2 is an implementation of WS-ReliableMessaging specification published by IBM, Microsoft, BEA and TIBCO. Sandesha2 was built on top of Axis2. Therefore by using Sandesha2 you can add reliable messaging capability to the web services hosted using Axis2. Sandesha2 can also be used with Axis2 client to interact with already hosted web services in a reliable manner. Please see sandesha2 user guide for more information on using Sandesha2.
Kandula: http://ws.apache.org/kandula/2/index.html
Kandula will provide an open-source implementation of WS-Coordination, WS-AtomicTransaction and WS-BusinessActivity based on Axis. The initial implementation will be in Java using Axis/Java. In addition to providing an implementation, a major focus of this project would be to ensure interoperability with other implementations of above specifications, particularly those by Microsoft (.NET) and IBM.
第二部分:使用 Axis2 开发 web services
首先你需要在 Servlet 容器中部署 axis2.war
可以通过两种方式来创建 web services
1. 使用 Axis2 的 API ,实现业务代码
2. 从 WSDL 开始,生成代码框架,然后实现业务逻辑
1 )使用 Axis2 的 API
首先,计划生成一个服务 MyService ,它有两个方法:
public void ping(OMElement element){} //IN-ONLY operation, just accepts the OMElement and do some processing.
public OMElement echo(OMElement element){}//IN-OUT operation, accepts an OMElement and
// sends back the same again
从例子里找到实现的代码: "Axis2Home/samples/userguide/src" 中的 "userguide/example1"
创建一个服务分 4 个步骤
a. 编写实现代码
b. 用 service.xml 来解释这个服务
c. 创建一个 *.aar 的服务部署包
d. 发布服务
Step 1: 实现代码
public class MyService{
public void ping(OMElement element){
......
}
public OMElement echo(OMElement element){
......
}
}
Step 2: 通过 service.xml 来描述服务
<service >
<description>
This is a sample Web Service with two operations, echo and ping.
</description>
<parameter name="ServiceClass" locked="false">userguide.example1.MyService</parameter>
<operation name="echo">
<messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>
<actionMapping>urn:echo</actionMapping>
</operation>
<operation name="ping">
<messageReceiver class="org.apache.axis2.receivers.RawXMLINOnlyMessageReceiver"/>
<actionMapping>urn:ping</actionMapping>
</operation>
</service>
说明: For the "echo" operation we have used a RawXMLINOutMessageReceiver since it is an IN-OUT operation. For IN-ONLY operation "ping", we have used RawXMLINOnlyMessageReceiver as the message receiver.
The actionMapping is required only if you want to enable WS-Addressing.
还可以用这个文件来描述一组服务,这组服务之间可以共享 ServiceGroupContext
<serviceGroup>
<service name="Service1">
<!-- details for Service1 -->
</service>
<service name="Service2">
<!-- details for Service2 -->
</service>
<module ref="ModuleName" />
<parameter name="serviceGroupParam1" locked="false">value 1</parameter>
</serviceGroup>
Step 3: 创建服务发布包
这个服务发布包的结构如图所示。将这些文件按照图中的结构组织好,然后打包成 jar 或者 rar ,然后修改后缀名为 aar 即可。
Step 4: 部属服务
将服务发布包放到 "\webapps\axis2\WEB-INF" 中的 "services" 文件夹下,然后在 Axis2 的首页 (http://localhost:8080/axis2/index.jsp) 的 ’services’ 连接下察看服务发布情况
2 )用服务代码生成的方式创建服务
首先要写好服务的 wsdl
然后利用 WSDL2Java 工具
该工具的命令有:
Usage WSDL2Code -uri <Location of WSDL> : WSDL file location
-o <output Location> : output file location
-a : Generate async style code only. Default is off
-s : Generate sync style code only. Default is off. takes precedence over -a
-p <package name> : set custom package name
-l <language> : valid languages are java and csharp. Default is java
-t : Generate TestCase to test the generated code
-ss : Generate server side code (i.e. skeletons). Default is off
-sd : Generate service descriptor (i.e. services.xml). Default is off. Valid with -ss
-d <databinding> : valid databinding(s) are adb, xmlbeans and jaxme. Default is adb
-g Generates all the classes. valid only with the -ss
-pn <port_name> : name of port in the presence of multiple ports
-sn <service_name> : name of service in the presence of multiple services
-u : unpacks the databinding classes
-r <repository_path> : path of the repository against which code is generated
在 windows 平台下可以用
WSDL2Java -uri ..\samples\wsdl\Axis2SampleDocLit.wsdl -ss -sd -d xmlbeans -o ..\samples -p org.apache.axis2.userguide
在 Linux 平台下可以用
WSDL2Java -uri ../samples/wsdl/Axis2SampleDocLit.wsdl -ss -sd -d xmlbeans -o ../samples -p org.apache.axis2.userguide
于是生成了服务的代码框架,在代码框架中填入代码
第三部分:用 Axis2 创建服务客户端
服务可以完成各种各样的功能,有的简单,时间消费比较低,有的复杂,时间消费比较高。我们不能采用一个统一的机制来调用这些时间消费区别很大的服务。例如:我们用 HTTP 协议来带调用一个 IN-OUT 类型的服务,而这个服务的执行时间很长,于是我们可能得到一个 connection time out 的结果。而且,在一个客户端同时发出两个服务调用请求的情况下,使用 ’blocking’ 的客户端 API 将降低客户端程序的性能。类似的,当我们使用 One-Way 传输的时候还可能有很多其他的后果产生。
Blocking API: 当服务调用请求发出后,客户端等待服务结果的返回,这期间不能再发出服务调用请求。
Non-Blocking API: 这是一个基于 callback 或者 polling 的 API ,让客户端发出服务调用请求的时候,客户端程序立刻得到控制权,服务的调用结果由 callback 对象来接收。这样,客户端就可以同时调用多个服务而不进行阻止。
Axis 将利用 Non-Blocking API 方式的异步叫做 API Level Asynchrony
前面提到的两个机制在 Request 和 Response 上使用了一个的传输连接,他们限制了服务调用在请求与结果返回使用两个传输连接的情况 ( either One-Way or Two-Way ) 。所以这两种机制都无法解决在长时间运行的事务中的寻址问题(传输连接可能在操作结束前就已经 timeout 了)。一种解决方案是在 request 和 response 中使用两个不同的传输连接。
在这个级别上得到的异步属性,称为 Transport Level Asynchrony
将前面的 2 种异步结合起来,就有了四种不同的调用模式
API (Blocking/Non-Blocking)
|
Dual Transports (Yes/No)
|
Description
|
Blocking
|
No
|
Simplest and the familiar invocation pattern
|
Non-Blocking
|
No
|
Using callbacks or polling
|
Blocking
|
Yes
|
This is useful when the service operation is IN-OUT in nature but the transport used is One-Way (e.g. SMTP)
|
Non-Blocking
|
Yes
|
This is can be used to gain the maximum asynchronous behavior. No blocking in the API level and also in the transport level
|
服务的调用代码:
blocking invocation
try {
OMElement payload = ClientUtil.getEchoOMElement();
Options options = new Options();
options.setTo(targetEPR); // this sets the location of MyService service
ServiceClient serviceClient = new ServiceClient();
serviceClient.setOptions(options);
OMElement result = sender.sendReceive(payload);
System.out.println(result);
} catch (AxisFault axisFault) {
axisFault.printStackTrace();
}
IN-ONLY
try {
OMElement payload = ClientUtil.getPingOMElement();
Options options = new Options();
options.setTo(targetEPR);
ServiceClient serviceClient = new ServiceClient();
serviceClient.setOptions(options);
serviceClient.fireAndForget(payload);
/**We have to block this thread untill we send the request , the problemis if we go out of the
*main thread , then request wont send ,so you have to wait some time :) */
Thread.sleep(500);
} catch (AxisFault axisFault) {
axisFault.printStackTrace();
}
You can test this client by running the target "testPingClient" of the ant build file at "Axis2Home/samples/userguide".
EchoBlockingClient
将第一段代码的调用代码改为 serviceClient.sendReceiveNonblocking(payload, callback);
具体的例子在 "Axis2Home/samples/userguide/src/userguide/clients" 中
Axis 提供三个方法来接收 callback 对象
public abstract void onComplete(AsyncResult result);
public abstract void onError(Exception e);
public boolean isComplete() {}
其中,前面两个是需要用户来实现的
分享到:
相关推荐
AXIS2是一个流行的开源Web服务框架,用于创建和部署SOAP(简单对象访问协议)和RESTful服务。这个压缩包文件包含AXIS2...如果遇到问题,可以查看AXIS2的官方文档、社区论坛或者提交问题反馈,以便得到帮助和解决方案。
5. `(axis2_version_number)`:可能是特定版本的Axis2子目录,包含该版本的详细文档、源代码等资源。 总结来说,Apache Axis2是一个强大的Web服务框架,易于部署,尤其在与Tomcat结合时,为开发者提供了便利的环境...
- 文档:包含API参考、用户指南和安装说明,帮助开发者理解和使用该框架。 - 配置文件:用于设置服务的行为和日志记录级别。 - 工具:可能包括编译和部署Web服务的辅助脚本或程序。 **使用Apache Axis的流程** 1. *...
标题中的“PowerMILL-five_axis.rar”和描述中的“PowerMILL-five_axis.rar 高级五轴功能应用”都指向了著名的CAM软件PowerMILL的一个关键特性——五轴加工。PowerMILL是英国Delcam公司开发的一款强大的计算机辅助...
**OxyPlotTest.7z** 是一个包含 WPF(Windows Presentation Foundation)图形绘制示例的压缩包,其中的核心技术是 OxyPlot,一个用 C# 编写的开源图表库。OxyPlot 提供了丰富的功能,使得开发者能够在 WPF 应用程序...
- `-c` 或 `--convert-up-axis`:指定转换轴向,例如从Z-up到Y-up。 3. **转换过程**:在命令行中,你可以组合这些参数来执行转换。例如,如果有一个名为"myModel.fbx"的FBX文件,你可以用以下命令将其转换为glTF...
文档还提到了技术特性,如模拟轴模块AAZ1/AAZ2/AAZ4的技术特性。文档强调了这些轴模块不具有自己的智能,它们作为控制系统的组成部分,需要与外部控制单元(如CNC控制系统)协同工作来完成复杂的控制任务。 由于...
- 【例4.23】通过`plot3(x, y, z)`绘制一条三维曲线,其中x、y、z由时间t的函数关系生成,最后使用`axis`、`title`、`xlabel`、`ylabel`和`zlabel`函数进行坐标轴范围、标题和标签的设置,以及使用`grid on`显示...
2. **五轴联动**:在CNC系统中,五轴联动意味着设备可以同时控制五个自由度,即X、Y、Z三个直线轴加上A、B、C中的两个旋转轴,允许更复杂、精度更高的三维曲面加工。 3. **人机界面(HMI)**:HMI是用户与机器交互...
- **曲面参数方程**:\[ x = \sqrt{4 - z^2}\cos(t), y = \sqrt{4 - z^2}\sin(t), z = z \] - **曲线参数方程**:\[ x = \cos(t) + 1, y = \sin(t), z = \sqrt{2 - 2\cos(t)} \] - **程序代码**: ```matlab z ...
5. **Axis**: JFreeChart 支持 X 轴和 Y 轴,以及 Z 轴(对于3D图表)。`ValueAxis` 是所有轴的基类,可以设置刻度间隔、标签、显示范围等。`DateAxis` 用于时间轴,可以处理日期和时间数据。 6. **Renderer**: ...
- **数据可视化**:MATLAB拥有强大的二维和三维图形绘制功能,能够直观地展示数据特征,帮助用户更好地理解数据背后的模式和趋势。 **3. 多领域应用** - **科学研究与教学**:在数学、物理、电子学等多个学科的...
#define HOMING_CYCLE_0 (1<<Z_AXIS) // 第一步 Z 清除工作区。 #define HOMING_CYCLE_1 ((1<<X_AXIS)|(1<<Y_AXIS)) // 然后 X,Y 在同一时间。 这是 GRBL 的回原点设置,用于控制机器的回原点循环和保护锁。 四、...
通过查阅MATLAB的帮助文档或在线资源,可以解决这些问题。 总结: 通过本实验,学生不仅掌握了MATLAB的基本绘图功能,还学会了如何在图形上添加注释,以及如何处理和展示数据。此外,对三维图形的理解也得到了提升...
根据提供的文档资料,本文将详细解释FANUC机器人如何添加外部轴及协调功能,并通过具体步骤来阐述这一过程。FANUC机器人广泛应用于工业自动化领域,其强大的扩展性和灵活性允许用户根据需求添加额外的轴来扩展机器人...
在Blender2.8中,快捷键...以上内容仅为Blender2.8快捷键指南中的一部分知识点,由于文档内容的复杂性和篇幅限制,这里无法详尽列出所有快捷键,但已提供的信息能够帮助用户建立起对文档主要功能区域快捷键的基本认识。
这个函数接受几个参数,帮助用户灵活地定制矢量图的显示方式: - `quiver(X,Y,U,V)`:这里的`X`和`Y`是位置坐标矩阵,而`U`和`V`分别是对应位置上的速度或矢量分量。所有矩阵必须具有相同的大小。 - `quiver(U,V)...
最后,`html`可能是包含帮助文档或报告的HTML文件,可以在浏览器中打开以获取更多关于3D线图的信息。 总的来说,MATLAB中的3D线图是探索和理解三维数据的有效方式。通过`plot3`函数、数据加载、视图调整以及轴和...
同时,使用`axis`定义坐标轴范围,`title`、`xlabel`、`ylabel`和`zlabel`设置图形标题及坐标轴标签,`grid on`则显示网格线,使得图形更易于理解。 在【例4.24】中,绘制了三维螺旋线,通过计算x、y、z的值并用`...
4. 计算心形函数:`val=(x.^2 + (9/4).*y.^2+z.^2-1).^3-x.^2.*z.^3-((9/80).*y.^2).*z.^3`该行代码计算了心形函数的值,并将其存储在变量`val`中。 5. 绘制心形图形:`isosurface(x,y,z,val,0)`该行代码使用心形...