您的位置:首页 > 其它

Karaf教程第4部分 OSGi中的CXF服务

2017-10-08 08:59 441 查看
Karaf教程第4部分 OSGi中的CXF服务
本教程演示如何在Karaf中使用cxf和blueprint发布和使用简单的REST和SOAP服务。
运行这个示例,你需要在Karaf中安装http feature。默认的http端口是8080,可以使用config admin pid "org.ops4j.pax.web"进行配置。你还需要安装cxf feature。Cxf servlet的默认url是"/cxf"。
这个url也可以在config pid "org.apache.cxf.osgi"中进行配置。

4.1 PersonService示例

"商业案例"是为了管理人的列表。服务应该提供典型的CRUD操作。前端使用REST服务、SOAP服务和web UI



这个示例包含四个工程:
•model:Person类和PersonService接口
•server:服务实现,使用REST和SOAP发布服务逻辑
•proxy:访问SOAP服务和并将其发布为OSGi服务
•webui:提供基于web ui简单的servlet,使用OSGi服务罗列和增加人
你可以在github找到完整的源代码:https://github.com/cschneider/Karaf-Tutorial/tree/master/cxf/personservice。

4.2 安装和运行测试
首先我们构建、安装和运行示例程序,大概浏览一下它做了什么。下面主要的章节解释程序工作的细节。
4.2.1 安装Karaf并准备CXF
我们启动一个全新的Karaf 2.3.1:
•解压从http://karaf.apache.org/index/community/download.html下载的Karaf 2.3.1;
•如果你使用的是Karaf 2.2.x,你需要将etc/jre.properties.cxf的内容复制到jre.properties中;
•使用bin/karaf运行Karaf。
4.2.2 安装CXF
在Karaf控制台运行如下命令:
features:chooseurl cxf 2.7.4
features:install http cxf
4.2.3 构建和测试
从github Checkout工程,用你下面的命令构建这个工程:mvn clean install
4.2.4 在Karaf中安装服务和ui
install -s mvn:net.lr.tutorial.karaf.cxf.personservice/personservice-model/1.0-SNAPSHOT
install -s mvn:net.lr.tutorial.karaf.cxf.personservice/personservice-server/1.0-SNAPSHOT
install -s mvn:net.lr.tutorial.karaf.cxf.personservice/personservice-proxy/1.0-SNAPSHOT
install -s mvn:net.lr.tutorial.karaf.cxf.personservice/personservice-webui/1.0-SNAPSHOT
4.2.5 测试服务
Person服务应该在当前安装的服务列表中显示出来,安装服务可以通过http://localhost:8181/cxf/找到。
列表已知的人:http://localhost:8181/cxf/person。这应该会显示出一个人"chris"。现在使用火狐浏览器的扩展插件例如Poster或者Httprequester,你可以添加一个人,发送下面的xml片段:
<?xml version="1.0" encoding="UTF-8"?>
<person>
<id>1001</id>
<name>Christian Schneider</name>
<url>http://www.liquid-reality.de</url>
</person>
Content-Type使用text/xml,使用PUT:http://localhost:8181/cxf/person/1001
或使用POST:http://localhost:8181/cxf/person
现在人员列表应该显示出两个人。
4.2.6 测试代理和web UI
访问http://localhost:8181/personui,你应该能看到由person服务管理的人员列表,并且可以添加新的人员。

4.3 它是如何工作的
4.3.1 定义模型
Model工程是一个简单的java maven工程,它定义了一个JAX-WS服务和JAXB数据类。它不依赖于cxf。这个服务的接口只是一个带有@WebService注解的普通Java接口。
@WebService
public interface PersonService {
public Person[] getAll();
public Person getPerson(String id);
public void updatePerson(String id, Person person);
public void addPerson(Person person);
}
Person类只是一个简单的pojo,具有id、name、url的访问器和修改器以及必要的JAXB注解。另外,你需要一个ObjectFactory类告诉JAXB,用什么样的xml元素来表示Person类。
这个工程中也没有特殊的OSGi代码。所以这个模型在OSGi容器内外都工作的很完美。
注意:首先这些服务是由java定义的。使用SOAP和rest是相当透明的。这非常适合相同应用的客户端和服务器之间的通信。如何服务要被其他的应用使用,那么wsdl方式是更加适合的。在这中场景下,model工程应该配置为能够从wsdl中生成数据类和服务接口。(参见cxf wsdl_first例子的pom文件)。对于rest服务,首选Java的方式是相当普遍的,因为客户端通常不会使用任何代理类。
4.3.2 服务实现(服务器)
PersonServiceImpl是一个java类,它实现了服务接口,包含一些额外的JAX-RS注解。这种定义类的方式允许它同时实现REST服务和SOAP服务。
服务器工程也包含小的启动类,它允许服务在eclipse中直接发布。但是这个类对于在Karaf中部署是没有必要的。
服务的产品部署是在src/main/resources/OSGI-INF/blueprint/blueprint.xml文件中完成的。
由于这个文件位于特殊的位置OSGI-INF/blueprint,它可以被blueprint实现自动处理(blueprint implementation aries)。REST服务使用jaxrs:server元素发布,而SOAP服务是用你jaxws:endpoint 元素发布。Blueprint命名空间与spring是不同的,但除此之外,这个xml文件与spring.xml非常相似。
4.3.3 服务代理
服务代理工程只包含一个blueprint xml文件,它使用CXF JAXWS客户端来消费SOAP服务,并就将该服务导出为OSGi服务。将服务客户端封装为OSGi服务(proxy工程)不是严格必要的,但是它的优势是webui完全依赖于cxf。所以改变服务的访问方式是非常容易的。所以这被认为是OSGi的一个最佳实践。参见blueprint.xml。
4.3.4 Web UI (webui)
该工程消费PersonService OSGi服务,并将PersonServlet导出为OSGi服务。pax web whiteboard extender会将这个servlet发布在/personui。
PersonServlet被注入PersonService服务,用于获取所有的人员,也可以添加人员。使用blueprint上下文完成这个“连接”。
4.3.5 一些深入的评论
这个例子使用了blueprint而不是sping dm,因为blueprint在OSGi环境下工作的更好。使用maven bundle plugin创建bundle。事实表明,blueprint工作的很好,因为maven bundle plugin使用默认的设置。在spring dm中,导入必须配置为spring需要访问许多cxf的实现类。例如,可以看看Talend 服务工厂例子(https://github.com/Talend/tsf/tree/master/examples)。
这个例子表明使用aries和blueprint编写OSGi应用是相当简单的。它只需要153行java代码(没有注释)就可以编写出一个完整的小应用。
blueprint xml也是相当的小且易于阅读。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: