Git Product home page Git Product logo

ice-demo's Introduction

Ice

尊重作者研究,转载请注明出处。

========

创建时间 2015-12-28
创建人 邓燎燕
版本号 1.0
修改时间 修改人 修改内容
2017-04-13 邓燎燕 添加Centos安装Ice的PHP.md
2017-03-09 邓燎燕 添加keystore-explorer地址
2016-01-18 邓燎燕 修复IceApp脚本bug,修改了Ice分布式服务配置说明,添加了IceGrid和IcePatch2的集成,也可以参考http://blog.csdn.net/pj81102/article/details/5910545
2016-01-11 邓燎燕 添加bcprov-jdk15on-153,修改了安装脚本
2016-01-11 邓燎燕 添加Ice分布式服务配置说明
2016-01-06 邓燎燕 添加文件和安装脚本
说明

========

编译安装

c++的编译安装请参考ice/cpp/BuildInstructionsLinux.md

依赖的第三方库有expat 2.0、OpenSSL 0.9.8 or later、bzip 1.0、Berkeley DB 5.3、mcpp 2.7.2 (with patches),建议能收到编译安装的就收到编译安装,尽量不要使用yum这类工具,免得有奇葩的错误。这个我在CentOS和Mac OS X都安装了。

Java的编译安装请参考ice/java/BuildInstructions.md

在CentOS上安装,我是没有成功过,但是在Mac OS X上成功了,所有我就直接将Mac OS X上编译好的jar包都上传到CentOS上了。

Objective-C的编译安装请参考ice/objective-c/BuildInstructions.md

JS库

Ice的js库可以到该连接下载http://cdnjs.com/libraries/ice

========

案例

IceGrid+IceBox+Spring

我参考了《ZeroC Ice权威指南》中的第6章在线订票系统写了例子。

IceGrid+Glacier2使用SSL和WSS通讯

我参考了ice-demo编写了客户端的代码。但是在使用SSL和WSS通讯时要生成相关证书,证书的生成请参考mymakecert.sh。

结构图

请求说明

客户端(Android和iOS)通过SSL和WSS向Glacier2发送请求,Glacier2在通过TCP向IceGrid获取相关结果后返回给客户端。

到目前为止,经测试纯Java客户端、Android、iOS使用加密或非加密都成功,而提供的网页前端使用WS成功,使用WSS没能成功,希望有人能完善或提供网页前端使用WSS的说明。

部署

  • 路径/home/Ice
  • 创建Ice_gridregistry、Ice_gridnode、registry、node、node/data、Ice_glacier2、grid、logs、Ice_glacier2/sslstore
  • 将生成的证书放在Ice_glacier2/sslstore下
  • 将IceGrid配置写入Ice_gridregistry/icegridregistry.cfg
  • 将IceNode配置写入Ice_gridnode/icegridnode1.cfg
  • 将Glacier2配置写入Ice_glacier2/iceglacier2.cfg
  • 将iceTicketProject应用的服务端放在/home/Ice下
  • 运行IceApp.sh脚本
  • 在运行IceAdmin.sh加载应用的ticketgrid.xml配置文件,启动服务

========

附件

mymakecert.sh

#!/bin/bash
#
# 作者:邓燎燕
# 2015-12-25
# 
# 要配置好iceca的ICE_CA_HOME环境变量
# 我的ca、server和client密码都是123456

echo "------------ iceca init --------------"
iceca init

echo "------------ iceca create server and client --------------"
iceca create --ip=192.168.0.112 --dns=192.168.0.112 server

iceca create client

echo "------------ iceca export cert --------------"
iceca export --password 123456 --alias ca ./ca/ca.cer
iceca export --password 123456 --alias client ./ca/client.cer
iceca export --password 123456 --alias server ./ca/server.cer

echo "------------ iceca export jks --------------"
iceca export --password 123456 --alias ca ./ca/ca.jks
iceca export --password 123456 --alias client ./ca/client.jks
iceca export --password 123456 --alias server ./ca/server.jks

echo "------------ iceca export bks --------------"
iceca export --password 123456 --alias ca ./ca/ca.bks
iceca export --password 123456 --alias client ./ca/client.bks
iceca export --password 123456 --alias server ./ca/server.bks

echo "------------ iceca export p12 --------------"
iceca export --password 123456 --alias ca ./ca/ca.p12
iceca export --password 123456 --alias client ./ca/client.p12
iceca export --password 123456 --alias server ./ca/server.p12

echo "------------ keytool -import --------------"
keytool -import -v -trustcacerts -alias ca -file ./ca/ca.cer -storepass 123456 -keystore ./ca/server.jks
keytool -import -v -trustcacerts -alias ca -file ./ca/ca.cer -storepass 123456 -keystore ./ca/client.jks

keytool -import -v -trustcacerts -alias ca -file ./ca/ca.cer -storepass 123456 -keystore ./ca/server.bks -storetype bks -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath /path/bcprov-jdk15on-153.jar
keytool -import -v -trustcacerts -alias ca -file ./ca/ca.cer -storepass 123456 -keystore ./ca/client.bks -storetype bks -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath /path/bcprov-jdk15on-153.jar

echo "--------------------------"
keytool -list -keystore ./ca/ca.p12 -storetype pkcs12 -v -storepass 123456
echo "--------------------------"
keytool -list -keystore ./ca/ca.jks -storepass 123456 -v
echo "--------------------------"
keytool -list -keystore ./ca/ca.bks -storetype bks -storepass 123456 -v -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath /path/bcprov-jdk15on-153.jar
echo "--------------------------"
keytool -list -keystore ./ca/server.p12 -storetype pkcs12 -v -storepass 123456
echo "--------------------------"
keytool -list -keystore ./ca/server.jks -storepass 123456 -v
echo "--------------------------"
keytool -list -keystore ./ca/server.bks -storetype bks -storepass 123456 -v -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath /path/bcprov-jdk15on-153.jar
echo "--------------------------"
keytool -list -keystore ./ca/client.p12 -storetype pkcs12 -v -storepass 123456
echo "--------------------------"
keytool -list -keystore ./ca/client.jks -storepass 123456 -v
echo "--------------------------"
keytool -list -keystore ./ca/client.bks -storepass 123456 -v -storetype bks -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath /path/bcprov-jdk15on-153.jar

echo ""
echo ""
echo "--------------------------"
echo "配置说明"
echo "Glacier2的配置IceSSL.CAs=ca.pem,IceSSL.CertFile=server.p12"
echo "纯Java客户端使用client.jks"
echo "Android客户端使用client.bks"
echo "iOS客户端使用ca.cer和client.p12,配置IceSSL.CAs=ca.cer,IceSSL.CertFile=client.p12"
echo ""

Glacier2配置

#
# Set the instance name
#
Glacier2.InstanceName=DemoGlacier2

#
# The client-visible endpoint of Glacier2. This should be an endpoint
# visible from the public Internet, and it should be secure.
#
Glacier2.Client.Endpoints=wss -p 4064:ssl -p 4063

# IceGrid+Glacier2的关键
Ice.Default.Locator=IceGrid/Locator:tcp -h localhost -p 4061	
Glacier2.Server.Endpoints=tcp -h localhost
Glacier2.PermissionsVerifier=DemoGlacier2/NullPermissionsVerifier
Glacier2.SessionTimeout=30
Glacier2.Client.ForwardContext=1
Glacier2.Server.ForwardContext=1
Glacier2.Client.SleepTime=500
Glacier2.Server.SleepTime=500
Glacier2.Client.Trace.Request=1
Glacier2.Server.Trace.Request=1
Glacier2.Client.Trace.Override=1
Glacier2.Server.Trace.Override=1
Glacier2.Client.Trace.Reject=1
Glacier2.Trace.Session=1
Glacier2.Trace.RoutingTable=1
Ice.Warn.Connections=1
Ice.Trace.Network=1
Ice.Trace.Protocol=1
IceSSL.Trace.Security=1

#
# SSL Configuration
#
Ice.Plugin.IceSSL=IceSSL:createIceSSL
IceSSL.Protocols=SSL3, TLS1_0, TLS1_1, TLS1_2
IceSSL.DefaultDir=/home/Ice/Ice_glacier2/sslstore
IceSSL.CAs=ca.pem
IceSSL.CertFile=server.p12
IceSSL.Password=123456
IceSSL.Keychain=glacier2.keychain
IceSSL.KeychainPassword=123456

IceGrid配置

IceGrid.Registry.Client.Endpoints=tcp -p 4061:ws -p 4062
IceGrid.Registry.Server.Endpoints=tcp
IceGrid.Registry.Internal.Endpoints=tcp
IceGrid.Registry.AdminPermissionsVerifier=IceGrid/NullPermissionsVerifier
IceGrid.Registry.Data=./registry
IceGrid.Registry.DynamicRegistration=1
Ice.Admin.InstanceName=AdminInstance
Ice.Admin.ServerId=Admin

IceNode配置

#ice node config for ticketnode1
#指定主注册节点的位置
Ice.Default.Locator=IceGrid/Locator:tcp -h 127.0.0.1 -p 4061:ws -h 127.0.0.1 -p 4062
#设置节点1相关数据的存储目录
IceGrid.Node.Data=/home/Ice/node/data
#指定节点1用于监听客户端连接的端口
IceGrid.Node.Endpoints=tcp -p 5062
#指定节点1的名称
IceGrid.Node.Name=node1
#指定错误日志文件
Ice.StdErr=/home/Ice/node/node.stderr.log
Ice.StdOut=/home/Ice/node/node.stdout.log

应用的服务端配置

<?xml version="1.0" encoding="UTF-8"?>
<icegrid>
    <application name="MyTicketBookSystem">
        <properties id="MultiThreaded">
            <property name="Ice.PrintStackTraces" value="1" />
            <property name="Ice.ThreadPool.Client.Size" value="2" />
            <property name="Ice.ThreadPool.Client.SizeMax" value="50" />
            <property name="Ice.ThreadPool.Server.Size" value="10" />
            <property name="Ice.ThreadPool.Server.SizeMax" value="100" />
            <property name="IceBox.InheritProperties" value="1" />
            <property name="Ice.Override.ConnectTimeout" value="5000" />
            <property name="Ice.Override.Timeout" value="10000" />
            <property name="IceBox.Trace.ServiceObserver" value="1" />
            <property name="Ice.Default.LocatorCacheTimeout" value="300" />
            <property name="Ice.BackgroundLocatorCacheUpdates" value="1" />

            <property name="Ice.Trace.Retry" value="2" />
            <property name="Ice.Trace.Network" value="1" />
            <property name="Ice.Trace.ThreadPool" value="1" />
            <property name="Ice.Trace.Locator" value="1" />
            <property name="Ice.StdErr" value="/home/Ice/grid/stderr.log" />
            <property name="Ice.StdOut" value="/home/Ice/grid/stdout.log" />
        </properties>
        <server-template id="TicketOrderServerTemplate"><!-- 定义服务器模板 -->
            <parameter name="id" />
            <icebox id="TicketOrderServer${id}" exe="java" activation="on-demand">
                <properties>
                    <properties refid="MultiThreaded" />
                </properties>
                <option>-Xmx512M</option>
                <option>-DAppHome=/home/Ice</option>
                <option>-DAppId=TicketOrderServer${id}</option>
                <!-- 指定启动类,使用Sl4jIceBoxServer替代IceBox.Server作为IceBox的启动类 -->
                <option>com.zzwtec.iceTicketProject.ice.Sl4jIceBoxServer</option>
                <env>CLASSPATH=.:/opt/Ice-3.6.1/lib/*:/home/libs/*:/home/Ice/iceTicketProject</env>
                <service name="TicketService" entry="com.zzwtec.iceTicketProject.ice.service.MyTicketService">
                    <adapter name="TicketService" id="TicketService${id}" endpoints="tcp:ws" replica-group="TicketServiceRep"></adapter>
                </service>
            </icebox>
        </server-template>
        <replica-group id="TicketServiceRep"><!-- 定义适配器复制组 -->
            <load-balancing type="round-robin" n-replicas="0" />
            <object identity="TicketService" type="::ticket::TicketService" /><!-- identity将在客户 -->
        </replica-group>
        <node name="node1">
            <server-instance template="TicketOrderServerTemplate" id="1" />
            <server-instance template="TicketOrderServerTemplate" id="2" />
        </node>
    </application>
</icegrid>

纯Java客户端配置

Ice.Default.Router=DemoGlacier2/router:ssl -p 4063 -h 192.168.0.112 -t 10000:wss -p 4064 -h 192.168.0.112 -t 10000
Ice.RetryIntervals=-1
Ice.Trace.Network=0
Ice.Plugin.IceSSL=IceSSL.PluginFactory
IceSSL.DefaultDir=/certs/path
IceSSL.VerifyPeer=0
IceSSL.Trace.Security=1
IceSSL.KeystoreType=JKS
IceSSL.Keystore=client.jks
IceSSL.Password=123456

Android客户端配置

Ice.Default.Router=DemoGlacier2/router:ssl -p 4063 -h 192.168.0.112 -t 10000:wss -p 4064 -h 192.168.0.112 -t 10000
Ice.RetryIntervals=-1
Ice.Trace.Network=0
Ice.Plugin.IceSSL=IceSSL.PluginFactory
Ice.InitPlugins=0
IceSSL.VerifyPeer=0
IceSSL.Trace.Security=1
IceSSL.KeystoreType=BKS
IceSSL.Password=123456
IceSSL.UsePlatformCAs=0

iOS客户端配置

Ice.Default.Router=DemoGlacier2/router:ssl -p 4063 -h 192.168.0.112 -t 10000:wss -p 4064 -h 192.168.0.112 -t 10000
Ice.Trace.Locator=1
Ice.ACM.Client.Timeout=0
Ice.RetryIntervals=-1
Ice.Plugin.IceSSL=IceSSL:createIceSSL
IceSSL.DefaultDir=./
IceSSL.CAs=ca.cer
IceSSL.CertFile=client.p12
IceSSL.Password=123456
#IceSSL.Keychain=client.keychain
#IceSSL.KeychainPassword=123456

ice-demo's People

Contributors

dengly avatar sk163 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ice-demo's Issues

xcode下的ice开发问题

  1. 首先确保你已经根据官方文档安装好了ice
  2. 确保你已经根据官方文档安装好了ice touch
  3. 确保你的xcode安装好了ice builder
  4. 修改工程与ice相关的配置:
  5. 在Build Settings的Additional SDKs设置Ice Touch的安装目录
  6. 设置Ice Builder - General Options的Ice Home值是Ice的路径
    注意,如果没有看到这些配置选项,可以通过添加一个ice文件后就有显示
  7. 如果应用的头文件报错,而ice相关的配置又配好了且没有配置错误的话,那么可以试试将使用绝对路径,如果使用绝对路径依然有问题,那很有可能是ice的安装有问题,建议安装官方的方式安装。

centos 编译Ice 3.6.2的bug

编译时报以下bug
Client.o:/root/downloads/ice/ice-3.6.2/cpp/test/Ice/stringConverter/../../../include/IceUtil/IconvStringConverter.h:220: more undefined references to libiconv' follow
collect2: ld returned 1 exit status
make[3]: *** [client] Error 1
make[3]: Leaving directory /root/downloads/ice/ice-3.6.2/cpp/test/Ice/stringConverter' make[2]: *** [stringConverter] Error 2 make[2]: Leaving directory /root/downloads/ice/ice-3.6.2/cpp/test/Ice'
make[1]: *** [Ice] Error 2
make[1]: Leaving directory /root/downloads/ice/ice-3.6.2/cpp/test' make: *** [all] Error 1

g++ -rdynamic -m64 -fvisibility=hidden -Wall -Werror -pthread -fPIC -g -L../../lib64 -Wl,--disable-new-dtags -Wl,-rpath,\$ORIGIN/../lib64 -o ../../bin/transformdb TransformAnalyzer.o TransformVisitor.o Transformer.o transformdb.o AssignVisitor.o Data.o Error.o Exception.o Functions.o Parser.o Print.o Scanner.o Util.o Grammar.o -lSlice -lIceXML -lFreeze -lIce -lIceUtil -ldb_cxx ../../lib64/libIce.so: undefined reference to libiconv_open'
../../lib64/libIce.so: undefined reference to libiconv_close' ../../lib64/libIce.so: undefined reference to libiconv'
collect2: ld returned 1 exit status
make[2]: *** [../../bin/transformdb] Error 1
make[2]: Leaving directory /root/downloads/ice/ice-3.6.2/cpp/src/FreezeScript' make[1]: *** [FreezeScript] Error 2 make[1]: Leaving directory /root/downloads/ice/ice-3.6.2/cpp/src'
make: *** [all] Error 1`

该问题主要是libiconv库没有安装或是找不到。可以通过下载libiconv源码库编译安装,并重新加载系统动态库。可以参考http://linux.it.net.cn/CentOS/course/2014/0504/1046.html

如果已经安装了libiconv并且配置了路径还是还不到的话,可以参考https://my.oschina.net/sumiaowen/blog/161071,修改vim config/Make.rules.Linux文件的BASELIBS,添加-liconv

Linux下php的Ice_initialize方法报InvalidArgumentException异常

根据官方例子开发了客户端,在Windows下一切运行正常,但是部署到Centos6系统后就悲剧了。在执行

$communicator = Ice_initialize($data);

时就报出InvalidArgumentException异常,

An uncaught Exception was encountered
Type: InvalidArgumentException
Message:unexpected argument type object

通过查看源码Communicator.cpp发现,应该是程序判断Ice.php的Ice_InitializationData类不是::Ice::InitializationData,于是修改了源码Communicator.cpp877行的判断

else if(Z_TYPE_PP(args[0]) == IS_OBJECT && Z_OBJCE_PP(args[0]) == initClass)

改为

else if(Z_TYPE_PP(args[0]) == IS_OBJECT)

重新编译安装后就正常了

glacier2router: warning: connection exception:

在使用glacier2+grid,当客户端连接glacier2时报以下异常。通过度娘搜索,都是千篇一律的结果,如http://www.php230.com/ice-common-compile-and-run-error.html。但是这里提供的解决方法有待考究,因为也没有详细说明如何解决。

-! 04/25/17 09:11:07.120 glacier2router: warning: connection exception:
   StreamSocket.cpp:202: Ice::ConnectionLostException:
   connection lost: recv() returned zero
   local address = ::ffff:120.26.78.171:6063
   remote address = ::ffff:120.1.245.22:22480

-! 04/25/17 09:21:21.270 glacier2router: warning: connection exception:
   StreamSocket.cpp:218: Ice::ConnectionLostException:
   connection lost: recv() returned zero
   local address = ::ffff:118.178.229.243:6063
   remote address = ::ffff:120.1.245.22:22778

-! 04/25/17 09:21:27.468 glacier2router: warning: connection exception:
   OpenSSLTransceiverI.cpp:525: Ice::ConnectionLostException:
   connection lost: recv() returned zero
   local address = ::ffff:120.26.78.171:6064
   remote address = ::ffff:117.136.103.82:13771

Xcode更新后导致Ice Builder插件无效

问题如题

具体解决办法:
1.打开终端 ,读出 DVTPlugInCompatibilityUUID:

defaults read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID

2.找到xcode安装插件的路径, 目前xcode7的路径 :

/Users/你的用户名/Library/Application Support/Developer/Shared/Xcode/Plug-ins

3.在IceBuilder.xcplugin中显示包类容, Info.plist文件中, 有个DVTPlugInCompatibilityUUids字段,将终端读出来的 DVTPlugInCompatibilityUUids加进去

iceca编译安装

可以通过以下指令编译安装
easy_install zeroc-icecertutils

eclipse下项目提示The container 'Ice Library' references non existing library '/opt/Ice-3.6.1/lib/ice-null.jar'

但Add Ice Builder时还提示以下信息

Errors occurred during the build.
Errors running builder 'Ice Builder' on project 'CommunityIceApp'.
java.lang.RuntimeException: dyld: Library not loaded: /usr/local/lib/libmcpp.0.dylib
  Referenced from: /usr/local/Ice-3.6.1/lib/libSlice.36.dylib
  Reason: image not found

java.lang.RuntimeException: dyld: Library not loaded: /usr/local/lib/libmcpp.0.dylib
  Referenced from: /usr/local/Ice-3.6.1/lib/libSlice.36.dylib
  Reason: image not found

原因是找不到/usr/local/lib/libmcpp.0.dylib,建议重现安装mcps,可以通过

brew install mcps

安装

Android的SSL访问问题

将ice的服务部署到阿里云上,iOS和纯java客户端通过ssl访问正常,但是通过android的ssl访问,服务端端glacier2route进程就会死掉,目前找不到原因,日志输出也没看到任何错误信息

重现编译Ice后正常

Ice编译问题

系统:Centos 6.5 64位
JDK:1.7
Ice版本:3.6.1
在编译Java库时运到以下错误
:test:compileSlice FAILED

FAILURE: Build failed with an exception.

  • What went wrong:
    Execution failed for task ':test:compileSlice'.

    /usr/local/Ice-3.6.1/bin/slice2java command failed: 1

  • Try:
    Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

暂时还未找到解决方法,但是通过测试已编译出来的jar包是可以使用的,库只是缺少了test.jar和IceTestPlugins.jar,还有就是IceGrid Admin客户端没有编译。

查看BuildInstructions.md文件,里面提到“This source distribution cannot be compiled successfully without the Berkeley DB run time for Java (db.jar). ”,意思是没有Berkeley DB的Java(db.jar)运行时,这个发布源不能编译成功。这可能是我的Berkeley DB没有弄好。

经测试可以直接./gradlew install安装相应的jar 包到指定的路径。

通过mymakecert.sh生成证书的问题

提示以下信息,通过百度谷歌搜索,其实是版本比较旧但不会影响使用。
/usr/lib/python2.6/site-packages/cryptography-1.1.2-py2.6-linux-x86_64.egg/cryptography/init.py:25: DeprecationWarning: Python 2.6 is no longer supported by the Python core team, please upgrade your Python.
DeprecationWarning

ice多网卡问题

部署ice的服务器有两个网卡,其中一个是用于访问外网的,调用ice时有时会走访问外网的网卡,这时就会超时,请教有什么解决方法吗?

这个是什么问题

image
-! 05/17/17 23:48:45.048 icegridnode: warning: Proxy contains unknown endpoints: `ssl -h 127.0.0.1 -p 4063'
java.lang.UnsupportedClassVersionError: com/zzwtec/iceTicketProject/ice/Sl4jIceBoxServer : Unsupported major.minor version 51.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(Unknown Source)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$000(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: com.zzwtec.iceTicketProject.ice.Sl4jIceBoxServer. Program will exit.
Exception in thread "main"

能帮忙看什么问题?
我指定的 CLASSPATH=D:\Program Files (x86)\ZeroC\Ice-3.6.1\lib*;E:\workspace\iceTicketProject\target\lib*;E:\workspace\iceTicketProject\target\classes

Ice 3.6.1的自定义异常处理,报Ice.UnknownUserException

slice定义如下:

[["java:package:com.my"]]
module demo{
        exception GenericError {
            string reason;
        };
        interface MyService{
            idempotent string hellow() throws GenericError; 
        };
};

在运行时报了以下错误:

Ice.UnknownUserException
    unknown = "demo::GenericError"
        at IceInternal.BasicStream$EncapsDecoder11.skipSlice(BasicStream.java:3798)
        at IceInternal.BasicStream$EncapsDecoder11.throwException(BasicStream.java:3599)
        at IceInternal.BasicStream.throwException(BasicStream.java:2285)
        at IceInternal.OutgoingAsync.throwUserException(OutgoingAsync.java:399)
        at com.my.demo.MyServicePrxHelper.end_hellow(MyServicePrxHelper.java:156)
        at com.my.demo.MyServicePrxHelper.hellow(MyServicePrxHelper.java:43)
        at com.my.demo.MyServicePrxHelper.hellow(MyServicePrxHelper.java:30)
        at com.my.demoImpl.MyClient.main(MyClient.java:18)

这个Ice的Bug,解决办法是修改slice生成的GenericError.java类,修改ice_name和__writeImpl方法,修改如下:

    public String ice_name() {
            return "com::my::demo::GenericError";
    }
    protected void  __writeImpl(IceInternal.BasicStream __os) {
            __os.startWriteSlice("::com::my::demo::GenericError", -1, true);
            __os.writeString(reason);
            __os.endWriteSlice();
    }

你会发现Ice在生成自定义异常文件时这个异常的ice_name和id缺少了包名,如果没有定义java的package是没有错误的,能够正常抛出你所期待的异常信息。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.