[ https://issues.apache.org/jira/browse/THRIFT-5519?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17498307#comment-17498307 ]
Jens Geyer edited comment on THRIFT-5519 at 2/25/22, 8:56 PM: -------------------------------------------------------------- Just to be clear: A *oneway* does not return anything, by design. Including exceptions. There is no return. None. was (Author: jensg): Just to be clear: A *oneway* does not return anything. Including exceptions. There is no return. None. > Java async client loses exceptions in void methods > -------------------------------------------------- > > Key: THRIFT-5519 > URL: https://issues.apache.org/jira/browse/THRIFT-5519 > Project: Thrift > Issue Type: Bug > Components: Java - Compiler > Affects Versions: 0.11.0, 0.15.0, 0.16.0 > Reporter: Alex Kormukhin > Priority: Major > Attachments: 2022-02-18_190339.png, > bug-async-void-meths-lost-exception.zip > > Time Spent: 20m > Remaining Estimate: 0h > > Exceptions thrown in void methods are lost on the client side when using an > asynchronous Java client. > > For non-void methods, generated getResult() looks like this: > > {code:java} > public java.lang.String getResult() throws TExampleException, > org.apache.thrift.TException { > if (getState() != > org.apache.thrift.async.TAsyncMethodCall.State.RESPONSE_READ) { > throw new java.lang.IllegalStateException("Method call not finished!"); > } > org.apache.thrift.transport.TMemoryInputTransport memoryTransport = new > org.apache.thrift.transport.TMemoryInputTransport(getFrameBuffer().array()); > org.apache.thrift.protocol.TProtocol prot = > client.getProtocolFactory().getProtocol(memoryTransport); > return (new Client(prot)).recv_returnString(); > } > {code} > > For void methods like: > {code:java} > public Void getResult() throws TExampleException, > org.apache.thrift.TException { > if (getState() != > org.apache.thrift.async.TAsyncMethodCall.State.RESPONSE_READ) { > throw new java.lang.IllegalStateException("Method call not finished!"); > } > org.apache.thrift.transport.TMemoryInputTransport memoryTransport = new > org.apache.thrift.transport.TMemoryInputTransport(getFrameBuffer().array()); > org.apache.thrift.protocol.TProtocol prot = > client.getProtocolFactory().getProtocol(memoryTransport); > return null; > } {code} > There are no call to (new Client(prot)).recv_returnVoidThrows() here. > But in recv_returnVoidThrows(): > {code:java} > public void recv_returnVoidThrows() throws TExampleException, > org.apache.thrift.TException > { > returnVoidThrows_result result = new returnVoidThrows_result(); > receiveBase(result, "returnVoidThrows"); > if (result.error != null) { > throw result.error; > } > return; > } {code} > the received response is read and the received exceptions are thrown. > > The correct getResult() for void methods should look like this: > {code:java} > public Void getResult() throws TExampleException, > org.apache.thrift.TException { > if (getState() != > org.apache.thrift.async.TAsyncMethodCall.State.RESPONSE_READ) { > throw new java.lang.IllegalStateException("Method call not finished!"); > } > org.apache.thrift.transport.TMemoryInputTransport memoryTransport = new > org.apache.thrift.transport.TMemoryInputTransport(getFrameBuffer().array()); > org.apache.thrift.protocol.TProtocol prot = > client.getProtocolFactory().getProtocol(memoryTransport); > (new Client(prot)).recv_returnVoidThrows(); > return null; > } {code} > > Attached test (bug-async-void-meths-lost-exception.zip) demonstrates this > issue. > !2022-02-18_190339.png|width=838,height=452! > -- This message was sent by Atlassian Jira (v8.20.1#820001)