ICE 的回调
使用分布式计算中间件ICE到现在已经有一年多了,在这一年里里面对ICE的理解、应用比较熟悉。
使用ICE写分布式软件,确实是很方便:ICE比较稳定、可靠,调用返回速度低延迟,使用简单,学习曲线不是很陡。
总之利用ICE开发分布式软件,是一个可行的选择。
在实际的过程中,ICE客户端跟服务端的数据流动是单项的,也就是客户端获取服务端的一个代理,从而与服务端进行数据交互,如果服务端要主动给客户端数据的时候,则需要我们给服务端传去一个客户端的代理。这时客户端也是一个服务器。在ICE中客户端、服务端没有严格的限制。
在ICE中有三种提供回调的方法,以下将具体介绍这三种方法:
1:适合服务器、客户端在如下的环境。客户和服务器程序或者运行在同一个主机上,或者运行在没有网络限制的多个主机上。这样的环境下,提供回调是最简单的。
以下是简单的例子,首先先写slice文件:
// **********************************************************************
//
// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
//
// This copy of Ice is licensed to you under the terms described in the
// ICE_LICENSE file included in this distribution.
//
// **********************************************************************
#ifndef CALLBACK_ICE
#define CALLBACK_ICE
module Demo
{
interface CallbackReceiver
{
void callback();
};
interface CallbackSender
{
void initiateCallback(CallbackReceiver* proxy);
void shutdown();
};
};
#endif
这个例子直接从ICE提供的demo中获得的。
然后利用ICE提供的slice2cpp程序,生成骨架代码,具体就不说了。
接着客服端实现利用如下的方式,提供回调代理:
CallbackSenderPrx senderPrx =
CallbackSenderPrx::checkedCast( communicator()->propertyToProxy("Callback.CallbackServer"))
"Callback.CallbackServer"是通过配置文件配置的,该代码是利用继承Ice::Application,重载它的main成员函数。communicator是ICE提供的通信器。
以下,是客户端提供回调的形式化代码:
Ice::ObjectAdapterPtr adapter = communicator()->createObjectAdapter("Callback.Client");
adapter->add(new CallbackReceiverI, communicator()->stringToIdentity("callbackReceiver"));
adapter->activate();
CallbackReceiverPrx twowayR = CallbackReceiverPrx::uncheckedCast(
adapter->createProxy(communicator()->stringToIdentity("callbackReceiver")));
然后调用:
senderPrx ->initiateCallback(twowayR);
这样就把客户端的一个回调代理传给服务端。
不过这样的传回调在比较负责的网络环境下,回调是会失败的。在实际的开发过程中,我就遇到这样的问题。然后去文档中寻求,解决方法。
我遇到的问题,在文档中Glacier有介绍,客户端和服务端的网络环境如图:
在这样的情况下,ICE回调给客户端是失败的,原因是ICE通过那个回调对象,不能找到客户端的路由信息。
因此有两种可选的方式,一种是利用Glacier,另外一种Bidirectional Connections(可能是要ICE3.2.0及其以后的版本才支持)。
我在实际的过程中,是利用Bidirectional Connections解决了上面的那个问题,是通过了实际的测试。Glacier方法,我没实际测试过。
因此,具体介绍Bidirectional Connections方法。在ICE文档3.2.1中提到,如何使用这个方法,大家有兴趣可以去看看。
下面提供一些形式化的代码,并说明注意事项。
还是先把slice文件(来自ICE DEMO)提供出来,以下是slice文件:
// **********************************************************************
//
// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
//
// This copy of Ice is licensed to you under the terms described in the
// ICE_LICENSE file included in this distribution.
//
// **********************************************************************
#ifndef CALLBACK_ICE
#define CALLBACK_ICE
#include <Ice/Identity.ice>
module Demo
{
interface CallbackReceiver
{
void callback(int num);
};
interface CallbackSender
{
void addClient(Ice::Identity ident);
};
};
#endif
客户端的形式化代码:
CallbackSenderPrx server =
CallbackSenderPrx::checkedCast(communicator()->propertyToProxy
("Callback.Client.CallbackServer"));
Ice::ObjectAdapterPtr adapter = communicator()->createObjectAdapter("");
Ice::Identity ident;
ident.name = IceUtil::generateUUID();
ident.category = "";
adapter->add(new CallbackReceiverI, ident);
adapter->activate();
server->ice_getConnection()->setAdapter(adapter);
server->addClient(ident);
服务端的形式化代码:
CallbackReceiverPrx client = CallbackReceiverPrx::uncheckedCast(current.con->createProxy(ident));
使用这个方式的一个注意事项:
1:在配置文件
#
# ACM must be disabled for bidirectional connections
#
Ice.ACM.Client=0
要将Ice.ACM.Client属性禁用掉。如果回调对象被关闭的话,只能重新
if(server->ice_getConnection()->getAdapter() == NULL)
server->ice_getConnection()->setAdapter(adapter);
server->addClient(ident);
因为ICE有一个机制如果在一定的时间内,没有发生数据交互,连接会被关闭
其实也可以利用一个hook线程对回调代理进行ice_ping()。
2:利用Bidirectional Connections,这样的代理是在原来的连接基础上建立起来的。因此不能修改回调代理的安全、超时等属性。
ICE 的回调的更多相关文章
- ZeroC Ice 暂记
摘自: http://weibo.com/p/1001603869896789339575 原文地址: http://www.oschina.net/question/865233_242146 吴治 ...
- CXF 入门:创建一个基于WS-Security标准的安全验证(CXF回调函数使用,)
http://jyao.iteye.com/blog/1346547 注意:以下客户端调用代码中获取服务端ws实例,都是通过CXF 入门: 远程接口调用方式实现 直入正题! 以下是服务端配置 ==== ...
- ICE系列之2——ICE的服务与好处
ice服务: IcePack 我们在第 12 页提到过, IcePack 是 Ice 的定位服务,用于在使用间接绑定时把符号性的 (symbolic)适配器名解析为协议-地址对. 除了 ...
- ICE中间件说明文档
ICE中间件说明文档 1 ICE中间件简介 2 平台核心功能 2.1 接口描述语言(Slice) 2.2 ICE运行时 2.2.1 ...
- ICE学习——异步1
ICE的AMI和AMD: AMI:指的是客户端的调用.一般有一个代理类,一个回调类. 从服务端返回的数据在回调类中的ice_response函数中. AMD:指的是服务端对客户端的调用分派.一般进行业 ...
- 中文翻译:pjsip文档(四)之ICE Session的使用方法
1:pjsip教程(一)之PJNATH简介 2:pjsip教程(二)之ICE穿越打洞:Interactive Connectivity Establishment简介 3:pjsip教程(三)之ICE ...
- 中文翻译:pjsip教程(三)之ICE stream transport的使用
1:pjsip教程(一)之PJNATH简介 2:pjsip教程(二)之ICE穿越打洞:Interactive Connectivity Establishment简介 3:pjsip教程(三)之ICE ...
- ICE 介绍及实现
.ICE是什么? ICE是ZEROC的开源通信协议产品,它的全称是:The Internet Communications Engine,翻译为中文是互联网通信引擎,是一个面向对象的中间件,使我们能够 ...
- Ice笔记-利用Ice::Application类简化Ice应用
Ice笔记-利用Ice::Application类简化Ice应用 作者:ydogg,转载请申明. 在编写Ice相关应用时,无论是Client还是Server端,都必须进行一些必要的动作,如:Ice通信 ...
随机推荐
- 剑指offer 面试51题
面试51题: 题目:数组中的逆序对 题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007 ...
- 基于 普通及Lambda方式实现策略模式
什么是策略模式 策略模式代表了解决一类算法的通用解决方案,你可以在运行时选择使用哪种方案.比如如何使用不同的条件(比如苹果的重量,或者颜色 )来筛选库存中的苹果.你可以将这一模式应用到更广泛的领域 , ...
- c# 执行批处理文件
ProcessStartInfo proc = new ProcessStartInfo(); proc.UseShellExecute = false; proc.CreateNoWindow = ...
- python基础深入(元组、字符串、列表、字典)
python基础深入(元组.字符串.列表.字典) 一.列表 1.追加 >>>list = [1,2,3,4] #用于在列表末尾添加新的对象,只能单个添加,该方法无返回值,但是会修改原 ...
- (转)【腾讯 TMQ】 接口测试用例设计
导语 这是我在其他的开源社区看到的一篇分享帖子.这篇文章的目的只是为大家提供一个思路,但是实现成本太高了,因为一个接口设计的接口测试用例很多,一般公司的接口数量几百到上千不等,每一个接口都设计这么多测 ...
- SOA宣言和微服务特点
如果从概念层来看,我更喜欢把SOA归为企业架构的范畴,从企业架构出发把业务分解为不同业务域的服务,关注系统间的服务互联互通的规范,并不关心如何实现.也就是说在企业架构上使用SOA支撑业务,而在方案架构 ...
- samtools+bcftools 进行SNP calling
两个软件的作用:1.samtools mpileup 主要是用于收集BAM文件中的信息,这个位点上有多少条read匹配,匹配read的碱基是什么,并将这些信息存储在BCF文件中.2.bcftools ...
- setfacl设置特定目录的权限
现有一目录是虚拟机和linux共享的,但是每次程序调用新建的文件都发现没有权限. 于是指定特定目录及其子目录下新建的文件或目录对于用户qhfz都有读写执行的权限 -R表示递归 -m表示设置文件acl规 ...
- ios 发布相关材料记录
1 app icon Spotlight iOS 5,6 base: 29pt, 需要 @1x, @2x, @3x,得出:29 x 29, 58 x 58, 87 x 87 iOS 7,8 base: ...
- DataX的安装
DataX的安装 1. 可下载tar包 https://github.com/alibaba/DataX/blob/master/userGuid.md 2. 下载源码自己编译 git clone h ...