这一篇文章讲解如何发布一个JINI的服务。

(参考的书是:JINI EXAMPLE BY EXAMPLE)

1.提供一个服务接口

首先,任何JINI服务都需要一个服务接口,表示这个服务能做什么。我们这里使用的是一个货币转换的服务,例如输入数量(单位为美元)和国家,表示将美元转换为某个国家的货币。

这个接口的代码如下:

package example.chapter2; public interface CurrencyConvertServiceInterface { public float convert(float amount,String country); }

这里有几个注意,在eclipse中编辑时,需要导入的2个外部库为:jini2_1/lib/jini-core.jar;jini2_1/lib/jini-ext.jar;

2.创建一个服务的代理

服务接口只是发布出来给客户看的,里面没有任何实现,有实现的在JINI里称为服务代理。服务代理需要实现serializable接口。

服务代理类的代码如下:

package example.chapter2; import java.io.Serializable; import java.util.Hashtable; public class CurrencyConvertServiceProxy implements Serializable, CurrencyConvertServiceInterface { Hashtable<String,Float> exchangerate = new Hashtable<String,Float>(); public CurrencyConvertServiceProxy() { super(); } //initial the convert rate of country public void initRates(){ exchangerate.put("UK", new Float(0.72)); exchangerate.put("Sweden", new Float(200)); } //add a new rate public void addRates(String country,float rate){ exchangerate.put(country, new Float(rate)); } @Override public float convert(float amount, String country) { Float xchrate = exchangerate.get(country); if (xchrate != null){ return amount*(xchrate.floatValue()); }else return -1; } }

这里初始化了2个国家的转化货币的比率。

3.发布服务

package example.chapter2; import java.io.IOException; import java.io.Serializable; import java.rmi.RMISecurityManager; import java.rmi.RemoteException; import java.util.HashMap; import java.util.Hashtable; import net.jini.core.discovery.LookupLocator; import net.jini.core.lookup.ServiceItem; import net.jini.core.lookup.ServiceRegistrar; import net.jini.core.lookup.ServiceRegistration; import net.jini.discovery.DiscoveryEvent; import net.jini.discovery.DiscoveryListener; import net.jini.discovery.LookupDiscoveryManager; //wrapper class that handles publishing the service item. public class CurrencyConvertService implements Runnable { //10 minute lease protected final int LEASE_TIME = 10*60*1000; protected HashMap registrations = new HashMap(); protected ServiceItem item; protected LookupDiscoveryManager discoverymanager; class Listener implements DiscoveryListener{ //called only when we explicitly discard a lookup service. @Override public void discarded(DiscoveryEvent ev) { ServiceRegistrar[] deadregs = ev.getRegistrars(); for (int i=0 ; i<deadregs.length ; i++){ registrations.remove(deadregs[i]); } } //called when we find a new lookup service. @Override public void discovered(DiscoveryEvent ev) { System.out.println("discovered a lookup service!......"); ServiceRegistrar[] newregs = ev.getRegistrars(); for (int i=0 ; i<newregs.length ; i++){ if(!registrations.containsKey(newregs[i])){ registerWithLookup(newregs[i]); } } } private synchronized void registerWithLookup(ServiceRegistrar registrar) { ServiceRegistration registration = null; try { registration = registrar.register(item, LEASE_TIME); } catch (RemoteException e) { System.out.println("Could not register!"); e.printStackTrace(); return; } //if this is our first registration ,use the service ID return to US. if(item.serviceID == null){ item.serviceID = registration.getServiceID(); System.out.println("set ServiceID to :" + item.serviceID); } registrations.put(registrar, registration); } } public CurrencyConvertService() throws IOException { //create an instance of the service proxy //第一步:为此服务创建一个代理对象,此对象实现CurrencyConvertServiceInterface CurrencyConvertServiceProxy proxyobj = createCurrencyProxy(); //create a service item to be added to the lookup service //第二步:将此代理对象放入一个能添加到lookup服务中的ServiceItem中 item = new ServiceItem(null, proxyobj, null); //set a security manager. //第三步:配置一个安全管理器 if(System.getSecurityManager() == null){ System.setSecurityManager(new RMISecurityManager()); } //create a discovery Listener DiscoveryListener myListener = new Listener(); //Search for the public group,which is named by the empty String. //第四步:查找一个lookup服务,使用空字符串来查找一个公共的共同体 LookupLocator look = new LookupLocator("jini://zz439"); discoverymanager = new LookupDiscoveryManager(new String[]{""}, new LookupLocator[]{look}, myListener); } private CurrencyConvertServiceProxy createCurrencyProxy() { CurrencyConvertServiceProxy proxyobj = new CurrencyConvertServiceProxy(); proxyobj.initRates(); return proxyobj; } /** * @param args */ public static void main(String[] args) { System.out.println("Started ....."); try { CurrencyConvertService hws = new CurrencyConvertService(); new Thread(hws).start(); } catch (IOException e) { System.out.println("cann't create service...."); e.printStackTrace(); } } @Override public void run() { while(true){ try { Thread.sleep(1000000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }

发布服务需要首先发现一个查找服务。在JINI里用LookupDiscoveryManager类来进行寻找一个发现服务。

寻找到发现服务后,用一个Listener来进行工作。

当找到发现服务后,Listener调用discovery方法,在discovery方法里,进行服务的注册。

服务注册使用类初始化的时候建立的服务代理的对象。

4.测试

进入源码下的bin目录,执行代码如下:

C:/Documents and Settings/Administrator/workspace/JiniExample1/bin>java -cp D:/j

ini2_1/lib/jini-core.jar;D:/jini2_1/lib/jini-ext.jar;D:/jini2_1/lib/sun-util.jar

;.; -Djava.security.policy=C:/policy -Djava.rmi.server.codebase=http://zz439:808

1/ example.chapter2.CurrencyConvertService

Started .....

discovered a lookup service!......

set ServiceID to :2e68d56d-cebb-4d61-bcd8-bc99ce09a039

可以看到,服务已经被注册上了,而且在窗口界面上也可以看到一个新的服务。

发布一个JINI服务相关推荐

  1. GeoServer中的WPS服务-1 如何发布一个WPS服务

    WPS 服务 WPS服务(Web Processing Service )用于做地理信息处理的服务规范.在GeoServer中又实现.需要安装WPS插件,具体请参照自己的版本去GeoServer官网下 ...

  2. 发布一个适合服务端C++程序的高效日志库

    PPT 见 http://www.slideshare.net/chenshuo/efficient-logging-in-multithreaded-c-server/ 2012年6月30日在深圳的 ...

  3. 搭建一个微服务商城到底可以有多快?

    简介: 极速部署一个微服务电商商城,体验 Serverless 带给您的应用全托管体验. 作者:云原生技术运营 - 望宸 技术实践的门槛不仅在于应用上线后各类问题的排查难度,也在于搭建一个 Demo ...

  4. 利用GeoServer发布地理空间数据服务示例

    题记-- 今天睡了午觉起来头昏脑涨,喉咙还不舒服,我一定是受凉了.啊~ 决定摘(脱)抄(密)节(处)选(理)一篇以前写的技术文档,滥竽充数. 这篇仅介绍地理空间数据服务的基础知识,以及如何在Windo ...

  5. 使用模式创建一个面向服务的组件中间件

    引言 在本文中,您将了解面向服务的组件中间件在用于资源有限的语音设备时,在设计阶段所应用的模式.它涵盖了项目的问题上下文,并被看成是一组决定因素,是对相关体系结构远景的一个简要概括.您还会得到一份描述 ...

  6. 快速搭建一个网关服务,动态路由、鉴权看完就会(含流程图)

    [文章来源]https://sourl.cn/tcbSPi 前 言 本文记录一下我是如何使用Gateway搭建网关服务及实现动态路由的,帮助大家学习如何快速搭建一个网关服务,了解路由相关配置,鉴权的流 ...

  7. 【转】GeoServer地图开发解决方案(四):发布Web地图服务(WMS)篇

    GeoServer 是 OpenGIS Web 服务器规范的 J2EE 实现的社区开源项目,利用 GeoServer 可以方便的发布地图数据,允许用户对特征数据进行更新.删除.插入操作,通过 GeoS ...

  8. 使用超图桌面版制作点图层并发布为地图服务

    现在要用超图桌面版本制作点图层:并发布为地图服务: 进入超图桌面版本:新建文件型数据源: 保存文件型数据源,后缀名如图: 在数据源下新建数据集: 新建数据集对话框:选择创建类型为点:输入数据集名称: ...

  9. 用node搭一个静态服务

    如何搭一个静态服务 新建一个文件夹 初始化 npm init -y 所用到的模块 http-server 起服务 mime chalk debug ejs 所需模块 http fs util path ...

最新文章

  1. 学习笔记Hadoop(八)—— Hadoop集群的安装与部署(5)—— Hadoop配置参数介绍、Hadoop集群启动与监控
  2. 的技术难点_马铃薯收获机研究的技术难点与使用注意事项
  3. 远程桌面连接错误:由于安全设置错误,客户端无法连接到远程计算机。
  4. 深入探讨this指针
  5. 求极大子矩阵的两种方法
  6. 如何在log4j.properties文件中使用相对路径
  7. crond定时任务详细分析
  8. 轮子,辛苦你了。 | 今日最佳
  9. 实用必备xp框架模块_两款实用工具类软件,是你的日常必备!
  10. python字符串的删除操作_Python 字符串操作(string替换、删除、截取、复制、连接、比较、...
  11. php基础之时间函数(date(), time(), microtime())
  12. 人工智能教学解决方案
  13. 电力系统决策支持系统
  14. python 拆分excel单元格_python 操作excel
  15. linux下获得root权限运行程序
  16. 低延时直播系统开发技术方案
  17. math.h里的数学计算公式
  18. 转载:80端口、443端口、8080端口、8000端口的区别
  19. 玩客云pc端_玩客云下载 玩客云电脑版下载
  20. 01-Redis核心数据结构和高性能原理

热门文章

  1. PLY的LALR语法详细解释
  2. 删除Word文档空白页的方法,日常必备!
  3. 【运筹学】对偶理论 : 互补松弛性 ( 定理内容 | 定理证明 )
  4. 7 进度指示器(LinearProgressIndicator、CircularProgressIndicator)
  5. android SurfaceView + Camera全屏自适应屏幕尺寸
  6. 计算机应用 胡丹,正高级
  7. 数据库建模工具Aquarius Orm Studio发布正式版本
  8. 如何安装Windows操作系统
  9. 无缘无故,Oralce使用normal模式登录用户失败
  10. DNS故障的几种常见原因及解决方法