设为首页 收藏本站
查看: 1135|回复: 0

[经验分享] Apache CXF 分布式OSGi部署HelloWorld

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-7-31 08:45:08 | 显示全部楼层 |阅读模式
摘要
  要配置Apache CXF OSGi的部署其实比较简单,但是我们一般都会在网上找资料,会遇到怎么也发现不了服务的情况,让人都很郁闷。
  有了这次的经历,我要看官方的文档,以防上当。

一、环境准备
  首先下载Apache CXF 的包,下载地址:http://cxf.apache.org/dosgi-releases.html
  我们下载下面这两个就可以了,我们这次会用到cxf-dosgi-ri-singlebundle-distribution
  Multi-bundle distribution (zip)
cxf-dosgi-ri-multibundle-distribution-1.3.1-dir.zip
  Single-bundle distribution
cxf-dosgi-ri-singlebundle-distribution-1.3.1.jar
  目前需要3个bundle
DSC0000.png
  注意版本号
  导入cxf-dosgi-ri-singlebundle-distribution-1.3.1.jar 包,在Eclipse中菜单:File->import,选择如下图所示
DSC0001.png
  选择文件所在的路径
DSC0002.png
DSC0003.png
  我们会在Package Explorer视图中看到
DSC0004.png
  好了,我们的开发环境就配置好了。

二、创建演示程序-生产服务
  创建HelloWorld演示程序
  Eclipse->File->new->project-
DSC0005.png
DSC0006.png
DSC0007.png
  我们就写一个helloworld的接口
  代码如下:
public interface HelloWorldService {
String sayHello();
}接下来我们用同样的方法来,做一个HelloworldService的实现工程  Eclipse->File->new->project
DSC0008.png
DSC0009.png
DSC00010.png
  我们来写一个实现类如下,首先添加对接口的依赖
DSC00011.png
  实现类如下:
public class HelloWorldServiceImpl implements HelloWorldService {
@Override
public String sayHello() {
System.out.println("HelloWorld");
return (new Date()).toString();
}
}现在实现类有了,我们现在要注册成web服务,打开实现工程中的Activator类,注册服务代码如下: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 props = new Hashtable();
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:9000/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();
}
}好了,我们的服务已经注册成功了,我们看看在浏览器中是什么样子的,Eclipse-Run->Run configuration,配置结果如下图所示: DSC00012.png 点击run后我们可以看到如下日志: DSC00013.png 这就说明了我的web服务已经注册成功了,好了,我们在浏览器中看一下结果,在浏览器中输入:http://localhost:9000/hello_world?wsdl,就可以看到如下结果 DSC00014.png 接下来我们会消费服务
三、消费服务
  我们建一个插件工程,命名为:HelloWorldClient,创建好以后如下:
DSC00015.png
  我们要使用服务就要先引用依赖组件,如下图所示
DSC00016.png
  我们还要配置一下服务的发现,在工程下建立OSGI-INF文件夹,里面新建一个remote-service文件夹,在remote-service新建一个remote-services.xml,该文件内容如下:







*

SOAP

org.apache.cxf.ws

http://localhost:9000/hello_world


  和我们在实现类里面注册服务的代码一样
  我们来看一下HelloWorldClient的Activator类的内容,主要的内容就是获取服务,然后调用服务,很简单。
public class Activator implements BundleActivator {
@SuppressWarnings("rawtypes")
private ServiceTracker tracker;
private static BundleContext context;
static BundleContext getContext() {
return context;
}
/*
* (non-Javadoc)
* @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public void start(BundleContext bundleContext) throws Exception {
Activator.context = bundleContext;
//创建ServiceTracker,捕获HelloWorldService添加到OSGi框架的事件
tracker = new ServiceTracker(Activator.context, HelloWorldService.class.getName(), null) {
@Override
public Object addingService(ServiceReference reference) {
Object result = super.addingService(reference);
//获取服务
HelloWorldService helloWorldService = (HelloWorldService)Activator.context.getService(reference);
//使用服务
System.out.println("call say hello at " + helloWorldService.sayHello());               
return result;
}
};
tracker.open();
}
/*
* (non-Javadoc)
* @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
*/
public void stop(BundleContext bundleContext) throws Exception {
Activator.context = null;
System.out.println("hello world client close");
tracker.close();
}
}好了,我们的消费者就创建好了,来看一下运行效果吧先进行运行 配置,如下图所示 DSC00017.png DSC00018.png 我们在上图中可以看到结果 好了,我们的演示已经结束了,看起来还是比较简单的,但是在做的过程中还是遇到一些问题,比如使用了老的注册服务代码如下:  props.put("osgi.remote.interfaces", "*");
props.put("osgi.remote.configuration.type", "pojo");
props.put("osgi.remote.configuration.pojo.address", "http://localhost:9000/hello_world");
  使用这个代码是注册服务不成功的,请大家注意!
  源码下载:下载

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-92504-1-1.html 上篇帖子: Apache开启伪静态 下篇帖子: 在 Apache Tuscany 上开发基于 SCA 的 Web 2.0 应用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表