[
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)