封装ICE客户端

编程入门 行业动态 更新时间:2024-10-13 14:22:51

封装ICE<a href=https://www.elefans.com/category/jswz/34/1771403.html style=客户端"/>

封装ICE客户端

来自《ICE权威指南》一书中的Ice的一个工具类。

IceClientUtil.java:

package com.lucky.interf.util;
import Ice.Communicator;
import Ice.ObjectPrx;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.concurrent.TimeUnit;/*** @Author j.tommy* @Date 2016/7/3 0003 下午 9:50*/public class IceClientUtil {private static final Map<Class, ObjectPrx> cls2PrxMap = new HashMap<Class, ObjectPrx>();private static volatile Ice.Communicator ic = null;private static volatile long lastAccessTime = 0L;private static volatile MonitorThread monitorThread;private static int idleTimeoutSeconds = 300;private static final String locatorKey = "--Ice.Default.Locator";private static String iceLocator = null;//    private static final String clientConfigFile = "iceconfig/iceclient.conf";/*** 获取代理对象* @param clazz* @return*/public static ObjectPrx getServicePrx(Class clazz) {ObjectPrx prx = cls2PrxMap.get(clazz);if (prx != null) {lastAccessTime = System.currentTimeMillis();return prx;}prx = createServicePrx(getIceCommunicator(),clazz);cls2PrxMap.put(clazz,prx);lastAccessTime = System.currentTimeMillis();return prx;}// 创建守护线程,关闭长时间不使用的连接private static void createMonitorThread() {monitorThread = new MonitorThread();monitorThread.setDaemon(true);monitorThread.start();}private static Ice.Communicator getIceCommunicator() {if (ic == null) {synchronized (IceClientUtil.class) {if (ic == null) {if (iceLocator == null) {ResourceBundle rb = ResourceBundle.getBundle("iceclient", Locale.ENGLISH);iceLocator = rb.getString(locatorKey);idleTimeoutSeconds = Integer.parseInt(rb.getString("idleTimeoutSeconds"));String[] initParams = new String[]{locatorKey + "=" + iceLocator};ic = Ice.Util.initialize(initParams);createMonitorThread();}// 另外一种创建Ice.Communicator的方式/*Ice.InitializationData initData = new InitializationData();initData.properties = Ice.Util.createProperties();initData.properties.load(clientConfigFile);ic = Ice.Util.initialize(initData);*/}}}return ic;}/*** 使用反射方式创建ice代理对象* @param ic* @param clazz* @return*/private static ObjectPrx createServicePrx(Communicator ic, Class clazz) {ObjectPrx prx = null;String className = clazz.getName();String serviceName = clazz.getSimpleName();int pos = serviceName.lastIndexOf("Prx");if (pos <= 0) {throw new IllegalArgumentException("Invalid ObjectPrx class,class name must end with Prx.");}String realServiceName = serviceName.substring(0, pos);try {Ice.ObjectPrx base = ic.stringToProxy(realServiceName);prx = (ObjectPrx) Class.forName(className + "Helper").newInstance();Method method = prx.getClass().getDeclaredMethod("uncheckedCast",Ice.ObjectPrx.class);prx = (ObjectPrx) method.invoke(prx,base);} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}return prx;}static class MonitorThread extends Thread {public void run() {while (!monitorThread.isInterrupted()) {try {TimeUnit.SECONDS.sleep(5);if (lastAccessTime + idleTimeoutSeconds < System.currentTimeMillis()) {closeCommunicator(true);}} catch (InterruptedException e) {e.printStackTrace();}}}private void closeCommunicator(boolean removeServicesCache) {synchronized (IceClientUtil.class) {if (ic != null) {safeShutdown();monitorThread.interrupt();if (removeServicesCache && !cls2PrxMap.isEmpty()) {cls2PrxMap.clear();}}}}private void safeShutdown() {try {ic.shutdown();} catch (Exception e) {e.printStackTrace();} finally {ic.destroy();ic = null;}}
}

iceclient.properties文件:

--Ice.Default.Locator=DemoGrid/Locator:tcp -h 127.0.0.1 -p 4061:tcp -h 127.0.0.1 -p 4062
idleTimeoutSeconds = 300

调用:

import com.lucky.interf.generated.CalcServiceIcePrx;
import com.lucky.interf.generated.MessageServiceIcePrx;
import com.lucky.interf.util.IceClientUtil;
/*** @Author j.tommy* @Date 2016/7/2 0002 下午 12:34*/
public class Test {public static void main(String[] args) {MessageServiceIcePrx msip = (MessageServiceIcePrx) IceClientUtil.getServicePrx(MessageServiceIcePrx.class);String result = msip.sendMessage("IceBox msg");System.out.println("result->" + result);CalcServiceIcePrx csip = (CalcServiceIcePrx) IceClientUtil.getServicePrx(CalcServiceIcePrx.class);double sum = csip.calc(0.999, 0.001);System.out.println("sum->" + sum);}}

更多推荐

封装ICE客户端

本文发布于:2024-03-15 05:25:54,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1738191.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:客户端   ICE

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!