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

来源:互联网 发布:js getjson 获取数据 编辑:程序博客网 时间:2024/06/11 03:22

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


    这个示例包含四个工程:

modelPerson类和PersonService接口

server:服务实现,使用RESTSOAP发布服务逻辑

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,具有idnameurl的访问器和修改器以及必要的JAXB注解。另外,你需要一个ObjectFactory类告诉JAXB,用什么样的xml元素来表示Person类。

    这个工程中也没有特殊的OSGi代码。所以这个模型在OSGi容器内外都工作的很完美。

注意:首先这些服务是由java定义的。使用SOAPrest是相当透明的。这非常适合相同应用的客户端和服务器之间的通信。如何服务要被其他的应用使用,那么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,因为blueprintOSGi环境下工作的更好。使用maven bundle plugin创建bundle。事实表明,blueprint工作的很好,因为maven bundle plugin使用默认的设置。在spring dm中,导入必须配置为spring需要访问许多cxf的实现类。例如,可以看看Talend 服务工厂例子(https://github.com/Talend/tsf/tree/master/examples)

    这个例子表明使用ariesblueprint编写OSGi应用是相当简单的。它只需要153java代码(没有注释)就可以编写出一个完整的小应用。

    blueprint xml也是相当的小且易于阅读。


阅读全文
0 0