读书人

使用CXF-DOSGi将Bundle公布为WebServi

发布时间: 2013-10-22 16:16:51 作者: rapoo

使用CXF-DOSGi将Bundle发布为WebService

《使用CXF-DOSGi将Bundle发布为WebService》

一、本文摘要

本文讲述了通过Apache CXF DOSGi的部署,将有依赖的Bundle发布为WebService的方法。

cxf-dosgi(Apache CXF 的分布式 OSGi 框架)将和 Eclipse 的 Equinox OSGi 框架一起用于开发和部署服务包。

二、环境准备

l 下载CXF的包:cxf-dosgi-ri-singlebundle-distribution-1.3.1.jar

网址:http://cxf.apache.org/dosgi-releases.html

l 下载osgi compendium 包:org.osgi.compendium-1.2.0.jar

网址:OSGi Compendium 包

l 在Eclipse中,把 Perspective 设置为 “Plug-In Development”。

l 然后导入上两个包。File/Import/Plug-In Development/Plug-ins and Fragments

l 接下来我们需要把 osgi compendium 包作为所需的包指定到 dosgi 包中。双击 cxf-dosgi-ri-singlebundle-distribution 项目中的 META-INF/MANIFEST.MF 文件。当 Eclipse 在设计模式中打开清单文件时,选择 Dependencies 选项卡,然后添加 org.osgi.compendium 作为 “Required Plug-ins”。

三、开发一个服务Bundle,并且发布为WebService

l 使用一个方法创建一个基于 POJO 的简单 Web 服务。

l Eclipse->File->new->project->Plug-in Project:

创建Bundle名为:HelloWprldService

l 新建一个HelloWorldService类,代码如下:

package com.edu.scut;

public interface HelloWorldService {

String sayHello();

}

l 导出这个Bundle以提供服务。

l 同样的方法创建一个HelloworldService的实现工程:

l 整个项目的目录结构如下:

l 首先添加对接口的依赖。

l 创建Activator类:

package helloworldimpl;

import java.util.Dictionary;

import java.util.Hashtable;

import org.osgi.framework.BundleActivator;

import org.osgi.framework.BundleContext;

import org.osgi.framework.ServiceRegistration;

import com.edu.scut.HelloWorldService;

public class Activator implements BundleActivator {

@SuppressWarnings("rawtypes")

private ServiceRegistration registration;

private static BundleContext context;

static BundleContext getContext() {

return context;

}

@Override

public void start(BundleContext bundleContext) throws Exception {

Activator.context = bundleContext;

//设置服务的属性

Dictionary<String, String> props = new Hashtable<String, String>();

props.put("service.exported.interfaces","*");

props.put("service.exported.intents","SOAP");

props.put("service.exported.configs","org.apache.cxf.ws");

props.put("org.apache.cxf.ws.address","http://localhost:8080/hello_world");

//注册服务

registration = Activator.context.registerService(HelloWorldService.class.getName(), new HelloWorldServiceImpl(), props);

}

@Override

public void stop(BundleContext bundleContext) throws Exception {

Activator.context = null;

registration.unregister();

}

}

l 创建HelloWorldServiceImpl类:

package helloworldimpl;

import java.util.Date;

import com.edu.scut.HelloWorldService;

public class HelloWorldServiceImpl implements HelloWorldService {

@Override

public String sayHello() {

System.out.println("HelloWorld");

return (new Date()).toString();

}

}

l Eclipse-Run->Run configuration,配置结果如下图所示:

l 点击run运行OSGi框架。

l 说明了我的web服务已经注册成功了,好了,我们在浏览器中看一下结果,在浏览器中输入:http://localhost:8080/hello_world?wsdl,就可以看到如下结果:

四、创建客户端调用WebService:

l Run->launch the web service explorer->WSDL page->GO

l 服务器端打印出了:

l 编写普通的Java类,添加Axis2的包。

l 在Client工程下创建SayHello类:

package com.edu.scut.client;

import javax.xml.namespace.QName;

import org.apache.axis2.AxisFault;

import org.apache.axis2.addressing.EndpointReference;

import org.apache.axis2.client.Options;

import org.apache.axis2.rpc.client.RPCServiceClient;

public class SayHello {

public static void main(String[] args) throws AxisFault {

// TODO Auto-generated method stub

// 使用RPC方式调用WebService

RPCServiceClient serviceClient = new RPCServiceClient();

Options options = serviceClient.getOptions();

// 指定调用WebService的URL

EndpointReference targetEPR = new EndpointReference(

"http://localhost:8080/hello_world");

options.setTo(targetEPR);

// 指定要调用的计算机器中的方法及WSDL文件的命名空间:helloworldimpl

QName opAddEntry = new QName("http://helloworldimpl","sayHello");//加法

// 指定sayhello方法的参数值为两个,分别是加数和被加数

Object[] opAddEntryArgs = new Object[] { };

// 指定sayhello方法返回值的数据类型的Class对象

Class<?>[] classes = new Class[] { String.class };

// 调用sayhello方法并输出该方法的返回值

System.out.println(serviceClient.invokeBlocking(opAddEntry,opAddEntryArgs, classes)[0]);

}

}

l 运行后正确返回信息,并在服务器打印HelloWorld。

五、总结

本文描述了以 OSGi 包的形式开发和部署 WebService的详细方法。

读书人网 >操作系统

热点推荐