- 浏览: 628284 次
- 性别:
- 来自: 北京
-
最新评论
-
fly雪域清风:
解决Ice.MessageSizeMax限制异常 -
zbw_ly:
000000
"XX cannot be resolved to a type "eclipse报错及解决说明 -
376174502:
您好,我的是java的 我按您的方法 “3,基于& ...
解决Ice.MessageSizeMax限制异常 -
ipenglei:
优先级的区别 :
puts true and false ...
ruby的逻辑运算符and与&& -
xyc717:
我弄出来了,但是有个问题想问问,为啥他拦截什么方法都要报错,比 ...
Spring3.1异常通知ThrowsAdvice说明
引言:
最近比较搓,忙得没空写写博客,回想一下又好像没忙什么事。得反省一下了,当然此是后话。
本文就Zeroc Ice方法返回复杂类的对象(return by-value, not by-reff),做以简单说明。之所以有这篇文章,只因笔者发现网上流传的中文文章中有这么个空白,英文的也没个直接的说明。
此文用BBCode编写。
内容:
一、ICE方法返回对象的实现
二、机制的简要说明
三、一个Exception的解决
四、资源信息
正文:
一、ICE方法返回对象的实现。
1,模型设计。
如上图“class_diagram.JPG”所示,Bond(债券)为JavaBean,MainOperator(主操作者)有一个方法“Bond getBean(String beanUID)”返回一个JavaBean。
2,具体实现。(各代码所在文件名,请参看首注释中的“file”注释)
A)slice定义
B)slice2java生成ice的java接口类集
C)编写服务方
(i)实现Bond。因为Bond是个抽象类,需要给定一个实现BondI。
(ii)加个dao层数据提供者(仅图好看)
(iii)实现操作者业务类
(ix)发布业务类,注册到服务
以上类中MainOperatorI主是个普通接口的实现方式,很简单。BondI是个类的实现方式,需要留意。
D)编写客户方
(i)编写请求者
(ii)为客户端写个手工测试类
OK,看样子写完了,可以跑了吧。试个……(提交一下,我去瞅个行号~。=)
念叨着,“先启服务run 'MainOperatorServer'……再启客户run 'StartAllClient'”……
哦~&*……*出错了!
Why? ?? !? 不是一直这么个写法嘛?!
——如果是这么个写法,我也就不花功夫写这篇文章了。
二、机制的简要说明
返回值有两种方式,一种是Ice最喜欢的(也是最推荐的)“引用”方式,另一种是“传值”方式。在ICE中的含意如下:
“引用”,即客户端不会拿到类型实体的副本,只拿到一个代理,可以抽象成一个远程指针(C系)或者一个对象引用(J系)。
“传值”,跟“引用”相对,即拿到类型实体的副本。
(此处略去二者特点,即使用范围,约一千字。)
因此引用的时候,就类似于“远程过程调用”的感觉,属于“行为”性。可抽象成一系列的接口,实现C-S间的规范协议。而传值时,有“序列反序列”的味道,属于“实体”性。需要传方有个打包成序列的模板,收方有个解包成对象的模板。回观上文报错,释然了。
三、一个Exception的解决
一个Exception指的是“NoObjectFactoryException”,无对象工厂异常。当客户方拿到一箱Bond的零件后,他找不到工厂给的对象装配图。傻眼了的意思。
人工建图。没有拿到模型,但是知道有个“Bond.java”抽象的不能使,那就直接实现一个最基础的吧。造个BondI当临时模板使着吧,先!
建好了,怎么告诉装配工呢。ICE的装配工,会看已有的图纸,也会手机上网去ObjectFactory试着查还没装到自己包里的图纸。那我们就把装配图传到ObjectFactory上去吧!
(i)创建一个ObjectFactory规范下的装配图
(ii)拿到这箱Bond前,把装配图传到ObjectFactory上去。
定位: 正文 | 一、ICE方法返回对象的实现 | 2,具体实现。| D)编写客户方
找到:“MainOperatorClient.java”第34~38行,把注释部分放出来。
注释掉的这两行代码,将装配图“BondI”放到ObjectFactory上去。以备装配工查看。
(iii)再次运行,通过。显示如下
四、资源信息
你可以在code google上下载到此demo的源代码,只需热身一下你的SVN。
补充:
有未说明清楚的问题,欢迎尾随追贴。~,=
最近比较搓,忙得没空写写博客,回想一下又好像没忙什么事。得反省一下了,当然此是后话。
本文就Zeroc Ice方法返回复杂类的对象(return by-value, not by-reff),做以简单说明。之所以有这篇文章,只因笔者发现网上流传的中文文章中有这么个空白,英文的也没个直接的说明。
此文用BBCode编写。
内容:
一、ICE方法返回对象的实现
二、机制的简要说明
三、一个Exception的解决
四、资源信息
正文:
一、ICE方法返回对象的实现。
1,模型设计。

如上图“class_diagram.JPG”所示,Bond(债券)为JavaBean,MainOperator(主操作者)有一个方法“Bond getBean(String beanUID)”返回一个JavaBean。
2,具体实现。(各代码所在文件名,请参看首注释中的“file”注释)
A)slice定义
/* * file: BondDef.ice * by: zhaoningbo * date: 2011-07-25 15:51 */ #ifndef BEAN_BOND_DEF #define BEAN_BOND_DEF module com{ module number{ module bean{ // 债券Bean class Bond{ // Files string bName; string bCode; // Methods string getbName(); void setbName(string bName); string getbCode(); void setbCode(string bCode); }; }; }; }; #endif
/* * file: MainOperatorDef.ice * by: zhaoningbo * date: 2011-07-25 16:02 */ #ifndef OPERATOR_MAINOPERATOR_DEF #define OPERATOR_MAINOPERATOR_DEF module com{ module number{ // 预定义 module bean{ class Bond; }; module operator{ // 总执行者 interface MainOperator{ // 获取Bond对象 idempotent com::number::bean::Bond getBean(string beanUID); }; }; }; }; #endif
B)slice2java生成ice的java接口类集
C)编写服务方
(i)实现Bond。因为Bond是个抽象类,需要给定一个实现BondI。
/* * file: BondI.java */ package com.number.bond; import java.io.Serializable; import Ice.Current; import com.number.bean.Bond; /** * 自定义债券Bean * 注:实现Bond时,直接实现Override即可,无需添加其他的类元素。 * @author zhnb * */ public class BondI extends Bond implements Serializable { private static final long serialVersionUID = 8758902536680272427L; @Override public String getbCode(Current current) { return this.bCode; } @Override public String getbName(Current current) { return this.bName; } @Override public void setbCode(String bCode, Current current) { this.bCode = bCode; } @Override public void setbName(String bName, Current current) { this.bName = bName; } }
(ii)加个dao层数据提供者(仅图好看)
/* * file: BondLCData.java */ package com.number.dao; import java.io.Serializable; import com.number.bond.BondI; /** * 数据提供类 * @author zhnb * */ public class BondLCData implements Serializable { private static final long serialVersionUID = -5413237344986060553L; // 单值 public static BondI BONDLC_DATA_SINGLE = null; static{ BondI bondI= new BondI(); bondI.setbCode("600006"); bondI.setbName("青岛啤酒"); BONDLC_DATA_SINGLE = bondI; } }
(iii)实现操作者业务类
/* * file: MainOperatorI.java */ package com.number.operator; import java.io.Serializable; import Ice.Current; import com.number.bean.Bond; import com.number.dao.BondLCData; /** * 主操作业务类 * @author zhnb * */ public class MainOperatorI extends _MainOperatorDisp implements Serializable { private static final long serialVersionUID = 1017768576442347413L; @Override public Bond getBean(String beanUID, Current current) { // 获取一个BondLC对象 Bond bond = BondLCData.BONDLC_DATA_SINGLE; return bond; } }
(ix)发布业务类,注册到服务
/* * file: MainOperatorServer.java */ package com.number.operator; import java.io.Serializable; import Ice.ObjectAdapter; /** * 主操作服务发布者 * @author zhnb * */ public class MainOperatorServer implements Serializable { private static final long serialVersionUID = -691557224337330222L; public static void main(String[] args) { // 0, 声明执行状态 int status = 0; Ice.Communicator ic = null; try { // 1, 初始化环境 // 加载属性文件 ic = Ice.Util.initialize(); // 2, 初始化Adapter String name = "MainOperatorServer"; String endpoints = "default -h 127.0.0.1 -p 9999"; ObjectAdapter objAdapter = ic.createObjectAdapterWithEndpoints( name, endpoints); // 3, 创建伺服者 Ice.Object servant = new MainOperatorI(); // 4, 添加伺服者至适配器 objAdapter.add(servant, Ice.Util.stringToIdentity("MainOperatorUID")); // 5, 激活 objAdapter.activate(); System.out.println("<<MainOperatorUID started>>"); // 6, 等待关闭 ic.waitForShutdown(); } catch (Exception e) { e.printStackTrace(); status = 1; } finally { if (ic != null) { ic.destroy(); } System.exit(status); } }
以上类中MainOperatorI主是个普通接口的实现方式,很简单。BondI是个类的实现方式,需要留意。
D)编写客户方
(i)编写请求者
/* * file: MainOperatorClient.java */ package com.number.operator; import java.io.Serializable; import Ice.ObjectPrx; import com.number.bean.Bond; import com.number.bond.ObjectFactory4Bond; import com.number.except.UGenericException; /** * 请求数据者(通用接口方式) * @author zhnb * */ public class MainOperatorClient implements Serializable { private static final long serialVersionUID = -3207025201067021445L; /** * 获取债券对象 * @param bondUID 债券标志 * @return */ public Bond getBean(String bondUID){ Bond bond = null; try { // 获取代理 MainOperatorPrx mainOperatorPrx = this.getOwnPrx(); /* // 添加自定义类 Ice.ObjectFactory factory = new ObjectFactory4Bond(); this.ic.addObjectFactory(factory, com.number.bond.BondI.ice_staticId()); */ bond = mainOperatorPrx.getBean("anyThingAsArg"); } catch (UGenericException e) { e.printStackTrace(); } return bond; } // =========以<下>为私有方法,提供ICE支撑。========= // 获取服务端提供的代理 private MainOperatorPrx mainOperatorPrx = null; // Ice通讯员(为回收资源时,方便自动回收) private Ice.Communicator ic = null; // GC回收时,自动销毁Ice.Communicator。 @Override protected void finalize() throws Throwable { if (this.ic != null) { ic.destroy(); } super.finalize(); } /** * 获取代理 * * @return 本类的代理 */ private MainOperatorPrx getOwnPrx() throws UGenericException { // 代理为空时,自动获取代理。 if (this.mainOperatorPrx == null) { // 环境为空时,初始化环境 if (this.ic == null) { // 1, 初始化环境 ic = Ice.Util.initialize(); } // 2, 创建代理基类对象 String str = "MainOperatorUID:default -h 127.0.0.1 -p 9999"; ObjectPrx objPrx = this.ic.stringToProxy(str); // 3, 获取代理 this.mainOperatorPrx = MainOperatorPrxHelper.checkedCast(objPrx); // 4, 测试是否可用,不可用时抛出异常。 if (this.mainOperatorPrx == null) { throw new UGenericException(str + ", request proxy faild."); } } return this.mainOperatorPrx; } // =========以<上>为私有方法,提供ICE支撑。========= }
(ii)为客户端写个手工测试类
/* * file: StartAllClient.java */ package com.number.start; import java.io.Serializable; import com.number.bean.Bond; import com.number.operator.MainOperatorClient; /** * 启动使用者 * @author zhnb * */ public class StartAllClient implements Serializable { private static final long serialVersionUID = -6282697303788648813L; public static void main(String[] args) { MainOperatorClient moc = new MainOperatorClient(); Bond bond = moc.getBean("something"); StringBuffer info = new StringBuffer(); if (bond == null) { info.append("null"); } else { info.append("Bond@" + bond.hashCode() + ":"); info.append("bName=" + bond.bName); info.append(",bCode=" + bond.bCode); info.append(":"); info.append("bName=" + bond.getbName()); info.append(",bCode=" + bond.getbCode()); } System.out.println(info.toString()); System.exit(0); } }
OK,看样子写完了,可以跑了吧。试个……(提交一下,我去瞅个行号~。=)
念叨着,“先启服务run 'MainOperatorServer'……再启客户run 'StartAllClient'”……
哦~&*……*出错了!
Exception in thread "main" Ice.NoObjectFactoryException reason = "" type = "::com::number::bean::Bond" at IceInternal.BasicStream.readObject(BasicStream.java:1444)
Why? ?? !? 不是一直这么个写法嘛?!
——如果是这么个写法,我也就不花功夫写这篇文章了。
二、机制的简要说明
返回值有两种方式,一种是Ice最喜欢的(也是最推荐的)“引用”方式,另一种是“传值”方式。在ICE中的含意如下:
“引用”,即客户端不会拿到类型实体的副本,只拿到一个代理,可以抽象成一个远程指针(C系)或者一个对象引用(J系)。
“传值”,跟“引用”相对,即拿到类型实体的副本。
(此处略去二者特点,即使用范围,约一千字。)
因此引用的时候,就类似于“远程过程调用”的感觉,属于“行为”性。可抽象成一系列的接口,实现C-S间的规范协议。而传值时,有“序列反序列”的味道,属于“实体”性。需要传方有个打包成序列的模板,收方有个解包成对象的模板。回观上文报错,释然了。
三、一个Exception的解决
一个Exception指的是“NoObjectFactoryException”,无对象工厂异常。当客户方拿到一箱Bond的零件后,他找不到工厂给的对象装配图。傻眼了的意思。
人工建图。没有拿到模型,但是知道有个“Bond.java”抽象的不能使,那就直接实现一个最基础的吧。造个BondI当临时模板使着吧,先!
/* * file: BondI.java */ package com.number.bond; import java.io.Serializable; import Ice.Current; import com.number.bean.Bond; /** * 自定义债券Bean(LC, 本地类) * @author zhnb * */ public class BondI extends Bond implements Serializable { private static final long serialVersionUID = 8758902536680272427L; // Methods @Override public String getbCode(Current current) { return this.bCode; } @Override public String getbName(Current current) { return this.bName; } @Override public void setbCode(String bCode, Current current) { this.bCode = bCode; } @Override public void setbName(String bName, Current current) { this.bName = bName; } }
建好了,怎么告诉装配工呢。ICE的装配工,会看已有的图纸,也会手机上网去ObjectFactory试着查还没装到自己包里的图纸。那我们就把装配图传到ObjectFactory上去吧!
(i)创建一个ObjectFactory规范下的装配图
/* * file: ObjectFactory4Bond.java */ package com.number.bond; import Ice.Object; import Ice.ObjectFactory; /** * 传值方式,必须实现一个自定义类工厂。 * @author zhnb * */ public class ObjectFactory4Bond implements ObjectFactory { @Override public Object create(String type) { System.out.println("!!>type=" + type); if (type.equals(com.number.bond.BondI.ice_staticId())) { return new BondI(); } return null; } @Override public void destroy() { // TODO Auto-generated method stub } }
(ii)拿到这箱Bond前,把装配图传到ObjectFactory上去。
定位: 正文 | 一、ICE方法返回对象的实现 | 2,具体实现。| D)编写客户方
找到:“MainOperatorClient.java”第34~38行,把注释部分放出来。
注释掉的这两行代码,将装配图“BondI”放到ObjectFactory上去。以备装配工查看。
(iii)再次运行,通过。显示如下
!!>type=::com::number::bean::Bond Bond@12830537:bName=青岛啤酒,bCode=600006:bName=青岛啤酒,bCode=600006
四、资源信息
你可以在code google上下载到此demo的源代码,只需热身一下你的SVN。
svn checkout http://number-icedemo-base.googlecode.com/svn/trunk/ number-icedemo-base-read-only
补充:
有未说明清楚的问题,欢迎尾随追贴。~,=
发表评论
-
经典软件资料打包分享啦
2012-08-14 16:08 1756引言: 最近要挪地方了,发现一年来又收藏不少宝贝。给群友一 ... -
myeclipse添加的struts2在搜索namespace时并不逐级查找
2011-11-28 19:35 2232引言: 今天用myeclipse想写个demo给网友自己 ... -
java web project的web.xml配置之——错误页(errorpage)
2011-11-28 11:06 14438引言: 在java web ... -
Ice服务端使用slf4j-log4j日志文件权限问题的解决
2011-09-29 16:48 9494引言: 公司内部小系统原始后台使用java-log4j来 ... -
Ice交流占楼篇
2011-09-29 15:47 1501引言: 经过这一个月的民工作业,ICE基本坦途了,公 ... -
Ice安装_rhel5
2011-09-16 09:22 2599引言: 上回提到ice ... -
Ice使用_运行demoj_gridbox
2011-09-08 09:45 5588引言: 本篇以图文方式演示如何跑通官方安装包自带的Gri ... -
Ice安装_WinXP
2011-09-08 09:07 3082引言: 本篇只讲述在WinXP系统下的安装,linux将选 ... -
Ice实战系列总目录
2011-09-08 09:00 3604引言: 调整项目忙了半个月,又啃了一段时间ICE基本 ... -
解决Ice.MessageSizeMax限制异常
2011-08-31 14:14 8844引言: 今天同事老姜在使用ICE的时候,遇到个异常,报告 ... -
[引]单点登录
2011-08-30 11:29 1422引言: 做二期的时候,遭遇“一次登陆拿到两个应用许可 ... -
zeroc Ice方法参数均为“值传递”
2011-08-18 13:35 2430引言: 在使用Zeroc Ice做java侧开发的时 ... -
12种常见的负载均衡算法
2011-08-09 17:31 1894引言: 负载均衡,企业级应用比较时尚的一个词。笔者收 ... -
slice2java元语metadata泛型ArrayList应用
2011-08-03 12:37 2357引言: Zeroc Ice支持元语的句法, ... -
Zeroc ICE中间件slice2java的ant脚本(v1u0_0)
2011-07-29 11:08 3257引言: 很高兴百度、google上搜到"s ... -
消息推送是什么
2011-07-14 15:13 2070引言: 常听架构师们在面对大量用户请求同一 ... -
google code 免费svn服务器使用说明
2011-07-12 10:15 36006引言: 写代 ... -
当webservice axis2遭遇log4j.xml悲剧发生了
2011-07-05 09:42 6216引言: 以axis2发布webservic ... -
Zeroc Ice 官方培训资料
2011-06-30 19:22 2322今天在研究ZeroC Ice的Client侧,对 ... -
NAT网络映射设置:允许局域网用户访问VMWare内linux的SSH
2011-06-28 14:35 16811引言: VMWare ...
相关推荐
内容概要:本文详细介绍了基于MATLAB GUI界面和卷积神经网络(CNN)的模糊车牌识别系统。该系统旨在解决现实中车牌因模糊不清导致识别困难的问题。文中阐述了整个流程的关键步骤,包括图像的模糊还原、灰度化、阈值化、边缘检测、孔洞填充、形态学操作、滤波操作、车牌定位、字符分割以及最终的字符识别。通过使用维纳滤波或最小二乘法约束滤波进行模糊还原,再利用CNN的强大特征提取能力完成字符分类。此外,还特别强调了MATLAB GUI界面的设计,使得用户能直观便捷地操作整个系统。 适合人群:对图像处理和深度学习感兴趣的科研人员、高校学生及从事相关领域的工程师。 使用场景及目标:适用于交通管理、智能停车场等领域,用于提升车牌识别的准确性和效率,特别是在面对模糊车牌时的表现。 其他说明:文中提供了部分关键代码片段作为参考,并对实验结果进行了详细的分析,展示了系统在不同环境下的表现情况及其潜在的应用前景。
嵌入式八股文面试题库资料知识宝典-计算机专业试题.zip
嵌入式八股文面试题库资料知识宝典-C and C++ normal interview_3.zip
内容概要:本文深入探讨了一款额定功率为4kW的开关磁阻电机,详细介绍了其性能参数如额定功率、转速、效率、输出转矩和脉动率等。同时,文章还展示了利用RMxprt、Maxwell 2D和3D模型对该电机进行仿真的方法和技术,通过外电路分析进一步研究其电气性能和动态响应特性。最后,文章提供了基于RMxprt模型的MATLAB仿真代码示例,帮助读者理解电机的工作原理及其性能特点。 适合人群:从事电机设计、工业自动化领域的工程师和技术人员,尤其是对开关磁阻电机感兴趣的科研工作者。 使用场景及目标:适用于希望深入了解开关磁阻电机特性和建模技术的研究人员,在新产品开发或现有产品改进时作为参考资料。 其他说明:文中提供的代码示例仅用于演示目的,实际操作时需根据所用软件的具体情况进行适当修改。
少儿编程scratch项目源代码文件案例素材-剑客冲刺.zip
少儿编程scratch项目源代码文件案例素材-几何冲刺 转瞬即逝.zip
内容概要:本文详细介绍了基于PID控制器的四象限直流电机速度驱动控制系统仿真模型及其永磁直流电机(PMDC)转速控制模型。首先阐述了PID控制器的工作原理,即通过对系统误差的比例、积分和微分运算来调整电机的驱动信号,从而实现转速的精确控制。接着讨论了如何利用PID控制器使有刷PMDC电机在四个象限中精确跟踪参考速度,并展示了仿真模型在应对快速负载扰动时的有效性和稳定性。最后,提供了Simulink仿真模型和详细的Word模型说明文档,帮助读者理解和调整PID控制器参数,以达到最佳控制效果。 适合人群:从事电力电子与电机控制领域的研究人员和技术人员,尤其是对四象限直流电机速度驱动控制系统感兴趣的读者。 使用场景及目标:适用于需要深入了解和掌握四象限直流电机速度驱动控制系统设计与实现的研究人员和技术人员。目标是在实际项目中能够运用PID控制器实现电机转速的精确控制,并提高系统的稳定性和抗干扰能力。 其他说明:文中引用了多篇相关领域的权威文献,确保了理论依据的可靠性和实用性。此外,提供的Simulink模型和Word文档有助于读者更好地理解和实践所介绍的内容。
嵌入式八股文面试题库资料知识宝典-2013年海康威视校园招聘嵌入式开发笔试题.zip
少儿编程scratch项目源代码文件案例素材-驾驶通关.zip
小区开放对周边道路通行能力影响的研究.pdf
内容概要:本文探讨了冷链物流车辆路径优化问题,特别是如何通过NSGA-2遗传算法和软硬时间窗策略来实现高效、环保和高客户满意度的路径规划。文中介绍了冷链物流的特点及其重要性,提出了软时间窗概念,允许一定的配送时间弹性,同时考虑碳排放成本,以达到绿色物流的目的。此外,还讨论了如何将客户满意度作为路径优化的重要评价标准之一。最后,通过一段简化的Python代码展示了遗传算法的应用。 适合人群:从事物流管理、冷链物流运营的专业人士,以及对遗传算法和路径优化感兴趣的科研人员和技术开发者。 使用场景及目标:适用于冷链物流企业,旨在优化配送路线,降低运营成本,减少碳排放,提升客户满意度。目标是帮助企业实现绿色、高效的物流配送系统。 其他说明:文中提供的代码仅为示意,实际应用需根据具体情况调整参数设置和模型构建。
少儿编程scratch项目源代码文件案例素材-恐怖矿井.zip
内容概要:本文详细介绍了基于STM32F030的无刷电机控制方案,重点在于高压FOC(磁场定向控制)技术和滑膜无感FOC的应用。该方案实现了过载、过欠压、堵转等多种保护机制,并提供了完整的源码、原理图和PCB设计。文中展示了关键代码片段,如滑膜观测器和电流环处理,以及保护机制的具体实现方法。此外,还提到了方案的移植要点和实际测试效果,确保系统的稳定性和高效性。 适合人群:嵌入式系统开发者、电机控制系统工程师、硬件工程师。 使用场景及目标:适用于需要高性能无刷电机控制的应用场景,如工业自动化设备、无人机、电动工具等。目标是提供一种成熟的、经过验证的无刷电机控制方案,帮助开发者快速实现并优化电机控制性能。 其他说明:提供的资料包括详细的原理图、PCB设计文件、源码及测试视频,方便开发者进行学习和应用。
基于有限体积法Godunov格式的管道泄漏检测模型研究.pdf
嵌入式八股文面试题库资料知识宝典-CC++笔试题-深圳有为(2019.2.28)1.zip
少儿编程scratch项目源代码文件案例素材-几何冲刺 V1.5.zip
Android系统开发_Linux内核配置_USB-HID设备模拟_通过root权限将Android设备转换为全功能USB键盘的项目实现_该项目需要内核支持configFS文件系统
C# WPF - LiveCharts Project
少儿编程scratch项目源代码文件案例素材-恐怖叉子 动画.zip
嵌入式八股文面试题库资料知识宝典-嵌⼊式⼯程师⾯试⾼频问题.zip