请告诉我,声明两个方法有什么不同
service MyService {
void test1();
oneway void test2();
}
手册说
oneway修饰符表示客户端只发出请求,根本不等待任何响应。单向方法必须为空。
但是任何 void 方法都表示客户端不期望任何结果。那为什么
oneway
?
或者区别是普通方法是同步执行的,方法在服务端测试完之后客户端才返回,oneway被拉了忘记了?因此,从单一角度来看,不可能有例外
你最后的假设是正确的!
“Oneway 函数与普通函数的不同之处在于调用普通函数,例如“void myFunc( 1: i16 val );”总是会导致来自服务器的响应消息。这在 void 函数的上下文中可能看起来很奇怪,但是,虽然 void 函数在应用程序级别不返回任何内容,但处理器确实将 RPC 响应发送回客户端代理。当此响应到达客户端代理从同步接口中用户代码进行的调用返回。这种同步的原因之一是任何普通函数都可能抛出异常,甚至是 void 函数。用户代码必须等待服务器响应才能知道该函数(即使是 void 函数)也已成功完成。
由于单向函数不会收到任何类型的响应,因此单向函数调用者不可能知道调用何时或是否完成。如果客户端需要通知服务器,而不考虑结果,oneway 是一个不错的选择。 Onway 函数可以像任何其他函数一样具有参数,但应声明为 void(IDL 编译器会警告非 void oneway 返回类型,并且不会向 oneway 调用的客户端返回任何内容)。”
但是任何 void 方法都表示客户端不期望任何结果。那为什么要单程呢?
因为那个特定的假设是错误的。
比较一下:
service Foo {
void bar() throws(1: SomeException ex)
}
这样:
service Foo {
oneway void bar()
}
你能发现其中的区别(除了 oneway 关键字之外)吗?
即使是
void
方法仍然可以返回一些东西:异常。
oneway
的情况并非如此:此处设计不允许出现异常,因为oneway
可以翻译为“即发即忘”。
单向方法不返回值,也不抛出异常。可以使用 SyncScope 策略配置单向方法:
SYNC_NONE、SYNC_WITH_TRANSPORT、SYNC_WITH_SERVER、SYNC_WITH_TARGET。
示例:`
CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
// 设置策略值。
Messaging::SyncScope sync_with_target = Messaging::SYNC_WITH_TARGET;
CORBA::Any sync_with_target_any;
sync_with_target_any <<= sync_with_target;
// Create the policy and add it to a CORBA::PolicyList.
CORBA::PolicyList policy_list;
policy_list.length(1);
policy_list[0] = orb->create_policy (Messaging::SYNC_SCOPE_POLICY_TYPE,
sync_with_target_any);
// Apply the policy at the ORB level.
CORBA::Object_var obj = orb->resolve_initial_references("ORBPolicyManager");
CORBA::PolicyManager_var policy_manager =
CORBA::PolicyManager::_narrow(obj.in());
policy_manager->set_policy_overrides (policy_list, CORBA::ADD_OVERRIDE);
// Destroy the Policy objects.
for (CORBA::ULong i = 0; i < policy_list.length(); ++i) {
policy_list[i]->destroy ();
}
policy_list.length(0);
`