[ 
https://issues.apache.org/jira/browse/WW-5414?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Yukio Suzuki updated WW-5414:
-----------------------------
    Description: 
In my project, we are using Struts2.5.x and recently started using the 
ExecuteAndWaitInterceptor. We have extended BackgroundProcess and overridden 
the beforeInvocation and afterInvocation methods to perform certain actions 
before and after the invocation of an action. However, we are facing a problem 
where afterInvocation is not called when an exception occurs. Here is the 
relevant code:

 
{code:java}
final Thread t = new Thread(new Runnable() {
  public void run() {
    try {
      beforeInvocation();
      result = invocation.invokeActionOnly();
      afterInvocation();
    } catch (Exception e) {
      exception = e;
    }
    
    done = true;
  }
});
{code}
In the existing code, the beforeInvocation and afterInvocation methods set and 
clear the context, but it seems unintentional that the context is not cleared 
when an exception occurs.
{code:java}
protected void beforeInvocation() throws Exception {
    ActionContext.setContext(invocation.getInvocationContext());
}
protected void afterInvocation() throws Exception {
    ActionContext.setContext(null);
}{code}
One possible improvement is to modify the code as follows, ensuring that 
afterInvocation is called even when an exception occurs:
{code:java}
beforeInvocation();
try {
  result = invocation.invokeActionOnly();
} finally {
  afterInvocation();
}{code}
Alternatively, if compatibility is a concern, you can add an 
afterInvocation(Throwable t) method and modify the code as follows:
{code:java}
beforeInvocation();
try {
  result = invocation.invokeActionOnly();
} catch (Throwable t) {
  afterInvocation(t);
  throw t;
}
afterInvocation();{code}
Please consider these modifications to ensure that afterInvocation is called 
even when an exception occurs.

  was:
In my project, we are using Struts2.5.x and recently started using the 
ExecuteAndWaitInterceptor. We have extended BackgroundProcess and overridden 
the beforeInvocation and afterInvocation methods to perform certain actions 
before and after the invocation of an action. However, we are facing a problem 
where afterInvocation is not called when an exception occurs. Here is the 
relevant code:

 
{code:java}
final Thread t = new Thread(new Runnable() {
  public void run() {
    try {
      beforeInvocation();
      result = invocation.invokeActionOnly();
      afterInvocation();
    } catch (Exception e) {
      exception = e;
    }
    
    done = true;
  }
});
{code}
In the existing code, the beforeInvocation and afterInvocation methods set and 
clear the context, but it seems unintentional that the context is not cleared 
when an exception occurs.
{code:java}
protected void beforeInvocation() throws Exception {
    ActionContext.setContext(invocation.getInvocationContext());
}
protected void afterInvocation() throws Exception {
    ActionContext.setContext(null);
}{code}
One possible improvement is to modify the code as follows, ensuring that 
afterInvocation is called even when an exception occurs:
{code:java}
beforeInvocation();
try {
  result = invocation.invokeActionOnly();
} finally {
  afterInvocation();
}{code}
Alternatively, if compatibility is a concern, you can add an 
afterInvocation(Throwable t) method and modify the code as follows:
{code:java}
beforeInvocation();
try {
  result = invocation.invokeActionOnly();
} catch (Throwable t) {
  afterInvocation(t);
  throw t;
}
beforeInvocation();{code}
Please consider these modifications to ensure that afterInvocation is called 
even when an exception occurs.


> AfterInvocation of BackgroundProcess is not called when an exception occurs 
> when using ExecuteAndWaitInterceptor
> ----------------------------------------------------------------------------------------------------------------
>
>                 Key: WW-5414
>                 URL: https://issues.apache.org/jira/browse/WW-5414
>             Project: Struts 2
>          Issue Type: Bug
>          Components: Core Interceptors
>    Affects Versions: 2.5.30, 6.3.0
>            Reporter: Yukio Suzuki
>            Priority: Major
>
> In my project, we are using Struts2.5.x and recently started using the 
> ExecuteAndWaitInterceptor. We have extended BackgroundProcess and overridden 
> the beforeInvocation and afterInvocation methods to perform certain actions 
> before and after the invocation of an action. However, we are facing a 
> problem where afterInvocation is not called when an exception occurs. Here is 
> the relevant code:
>  
> {code:java}
> final Thread t = new Thread(new Runnable() {
>   public void run() {
>     try {
>       beforeInvocation();
>       result = invocation.invokeActionOnly();
>       afterInvocation();
>     } catch (Exception e) {
>       exception = e;
>     }
>     
>     done = true;
>   }
> });
> {code}
> In the existing code, the beforeInvocation and afterInvocation methods set 
> and clear the context, but it seems unintentional that the context is not 
> cleared when an exception occurs.
> {code:java}
> protected void beforeInvocation() throws Exception {
>     ActionContext.setContext(invocation.getInvocationContext());
> }
> protected void afterInvocation() throws Exception {
>     ActionContext.setContext(null);
> }{code}
> One possible improvement is to modify the code as follows, ensuring that 
> afterInvocation is called even when an exception occurs:
> {code:java}
> beforeInvocation();
> try {
>   result = invocation.invokeActionOnly();
> } finally {
>   afterInvocation();
> }{code}
> Alternatively, if compatibility is a concern, you can add an 
> afterInvocation(Throwable t) method and modify the code as follows:
> {code:java}
> beforeInvocation();
> try {
>   result = invocation.invokeActionOnly();
> } catch (Throwable t) {
>   afterInvocation(t);
>   throw t;
> }
> afterInvocation();{code}
> Please consider these modifications to ensure that afterInvocation is called 
> even when an exception occurs.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to