单程服务方式

问题描述 投票:0回答:3

请告诉我,声明两个方法有什么不同

service MyService {
  void test1();
  oneway void test2();
}

手册说

oneway修饰符表示客户端只发出请求,根本不等待任何响应。单向方法必须为空。

但是任何 void 方法都表示客户端不期望任何结果。那为什么

oneway

或者区别是普通方法是同步执行的,方法在服务端测试完之后客户端才返回,oneway被拉了忘记了?因此,从单一角度来看,不可能有例外

thrift
3个回答
5
投票

你最后的假设是正确的!

引用Apache Thrift 程序员指南

“Oneway 函数与普通函数的不同之处在于调用普通函数,例如“void myFunc( 1: i16 val );”总是会导致来自服务器的响应消息。这在 void 函数的上下文中可能看起来很奇怪,但是,虽然 void 函数在应用程序级别不返回任何内容,但处理器确实将 RPC 响应发送回客户端代理。当此响应到达客户端代理从同步接口中用户代码进行的调用返回。这种同步的原因之一是任何普通函数都可能抛出异常,甚至是 void 函数。用户代码必须等待服务器响应才能知道该函数(即使是 void 函数)也已成功完成。

由于单向函数不会收到任何类型的响应,因此单向函数调用者不可能知道调用何时或是否完成。如果客户端需要通知服务器,而不考虑结果,oneway 是一个不错的选择。 Onway 函数可以像任何其他函数一样具有参数,但应声明为 void(IDL 编译器会警告非 void oneway 返回类型,并且不会向 oneway 调用的客户端返回任何内容)。”


4
投票

但是任何 void 方法都表示客户端不期望任何结果。那为什么要单程呢?

因为那个特定的假设是错误的。

比较一下:

  service Foo {
     void bar() throws(1: SomeException ex)
  }

这样:

  service Foo {
     oneway void bar() 
  }

你能发现其中的区别(除了 oneway 关键字之外)吗?

即使是

void
方法仍然可以返回一些东西:异常。

oneway
的情况并非如此:此处设计不允许出现异常,因为
oneway
可以翻译为“即发即忘”。


0
投票

单向方法不返回值,也不抛出异常。可以使用 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);

`

© www.soinside.com 2019 - 2024. All rights reserved.