单程服务方式

Oneway service methods

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

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

手册说

The oneway modifier indicates that the client only makes a request and does not wait for any response at all. Oneway methods MUST be void.

但是任何无效的方法都表示客户端不期望任何结果。那为什么oneway?

或者区别是普通方法同步执行,客户端returns只有方法在服务端测试过,oneway被pull忘记了?结果,单向不能出现异常

你最后的假设是准确的!

引用 The Programmer's Guide to Apache Thrift:

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

因为单向函数不接收任何类型的响应,所以单向函数调用者不可能知道调用何时或是否完成。在客户端需要通知服务器而不考虑结果的情况下,oneway 是一个不错的选择。 Onway 函数可以像任何其他函数一样具有参数,但应声明为 void(IDL 编译器警告非 void oneway return 类型并且永远不会 return 向 oneway 调用的客户端发送任何内容)。” =11=]

But any void method says that the client does not expect any results. Then why oneway?

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

比较这个:

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

有了这个:

  service Foo {
     oneway void bar() 
  }

你能找出区别吗(除了 oneway 关键字)?

即使是 void 方法仍然可以 return 一些东西:异常。

oneway 不是这种情况:这里的例外是设计不允许的,因为 oneway 可以翻译为 "fire and forget"。