[ 
https://issues.apache.org/jira/browse/JEXL-193?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15274354#comment-15274354
 ] 

Dmitri Blinov commented on JEXL-193:
------------------------------------

Future.cancel(true) will *attempt* to stop the task by invoking 
Thread.interrupt() for executing thread. Whether the executing thread will stop 
or not depends on how it is implemented. Jexl will check that thread is 
interrupted, break current script execution, but if in silent mode, will clear 
thread's interrupted state and return null. So the thread *will not* stop. If 
jexl is in non-silent mode, it will clear thread's interrupted state but throw 
Cancel exception. I can catch Cancel exception and re-throw 
InterruptedException instead and the thread eventually *will* stop. What I'm 
trying to propose is that jexl should throw Cancel exception regardless of its 
mode, silent or non-silent, to let me know it was interrupted during execution.

> InterruptedException is swallowed in function call in silent and non-strict 
> mode
> --------------------------------------------------------------------------------
>
>                 Key: JEXL-193
>                 URL: https://issues.apache.org/jira/browse/JEXL-193
>             Project: Commons JEXL
>          Issue Type: Bug
>    Affects Versions: 3.0
>            Reporter: Dmitri Blinov
>            Assignee: Henri Biestro
>             Fix For: 3.0.1
>
>
> The following test case fails with 
> {code}
> java.lang.AssertionError: Values should be different. Actual: 42
>       at org.junit.Assert.fail(Assert.java:88)
>       at org.junit.Assert.failEquals(Assert.java:185)
>       at org.junit.Assert.assertNotEquals(Assert.java:161)
> {code}
> {code}
>     public static class TestContext extends MapContext implements 
> JexlContext.NamespaceResolver {
>         public int interrupt() throws InterruptedException {
>             throw new InterruptedException();
>         }
>     }
>     @Test
>     public void testInterrupt() throws Exception {
>         JexlEngine jexl = new JexlBuilder().arithmetic(new 
> JexlArithmetic(false)).strict(false).silent(true).create();
>         JexlScript e = jexl.createScript("interrupt(); return 42");
>         Callable<Object> c = e.callable(new TestContext());
>         Object t = c.call();
>         Assert.assertNotEquals(42, t);
>     }
> {code}
> Expected behaviour is to cancel script execution



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to