[jboss-jira] [JBoss JIRA] (WFLY-12902) [GSS](7.1.z) Improper handling of application exceptions on asynchronous ejb invocations
Brad Maxwell (Jira)
issues at jboss.org
Wed Dec 18 12:29:19 EST 2019
Brad Maxwell created WFLY-12902:
-----------------------------------
Summary: [GSS](7.1.z) Improper handling of application exceptions on asynchronous ejb invocations
Key: WFLY-12902
URL: https://issues.redhat.com/browse/WFLY-12902
Project: WildFly
Issue Type: Bug
Components: EJB
Affects Versions: 11.0.0.Final
Reporter: Brad Maxwell
Fix For: 12.0.0.Beta1, 12.0.0.Final
If an asynchronous invocation of an ejb method throws an application exception (declared exception) then the returned future will always return false on isDone(). That means: the client will never know that the operation has finished (unscuccessfully) unless get() is called which would rethrow the original exception.
This behavior has changed from wildfly 10.1.0.Final to 11.0.0.Final.
I pretty sure that the problem is in org.jboss.as.ejb3.component.interceptors.AsyncInvocationTask.
The isDone Method is implemented like this:
{noformat}
@Override
public boolean isDone() {
return status == ST_DONE;
}
{noformat}
But status can be one of:
{noformat}
private static final int ST_RUNNING = 0;
private static final int ST_DONE = 1;
private static final int ST_CANCELLED = 2;
private static final int ST_FAILED = 3;
{noformat}
And and exception sets the status to
{noformat}
private synchronized void setFailed(final Exception e) {
this.failed = e;
status = ST_FAILED;
done();
}
{noformat}
So it's pretty obvious.
The javadoc on java.util.concurrent.Future states:
{quote}
Completion may be due to normal termination, an exception, or cancellation -- in all of these cases, this method will return true.
{quote}
So the isDone() method should look more like this:
{noformat}
@Override
public boolean isDone() {
return status == ST_DONE || status == ST_FAILED || status == ST_CANCELLED;
}
{noformat}
In wildfly 10, there was a single boolean variable "done" which was set to true in all three cases:
* cancel()
* setResult(...) and
* setFailed(...)
--
This message was sent by Atlassian Jira
(v7.13.8#713008)
More information about the jboss-jira
mailing list