单向服务方法

时间:2018-01-16 15:21:32

标签: thrift

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

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

手册说

  

单向修饰符表示客户端仅发出请求,而不是等待任何响应。单向方法必须无效。

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

或者区别在于普通方法是同步执行的,只有在服务器上测试了方法之后客户端才会返回,并且单向被拉掉并忘记了?因此,从一开始就不能成为例外

2 个答案:

答案 0 :(得分:3)

你最后的假设是准确的!

引用The Programmer's Guide to Apache Thrift

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

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

答案 1 :(得分:2)

  

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

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

比较一下:

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

用这个:

  service Foo {
     oneway void bar() 
  }

你能发现差异(除了oneway关键字)吗?

即使void方法仍然可以返回一些内容:例外。

oneway不是这种情况:设计中不允许例外,因为oneway可以翻译为“火上浇油”。

相关问题