commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Henri Biestro (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (JEXL-205) testCancelForever() is not terminated properly
Date Wed, 13 Jul 2016 13:16:20 GMT

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

Henri Biestro commented on JEXL-205:
------------------------------------

Right, the latch will protect from cancelling too early but won't make cancelling work; for
an interrupted exception to be raised, we must be in a wait/sleep/etc call. We must thus check
the thread interruption status to know if a cancellation occurred. Committed fix.

> testCancelForever() is not terminated properly
> ----------------------------------------------
>
>                 Key: JEXL-205
>                 URL: https://issues.apache.org/jira/browse/JEXL-205
>             Project: Commons JEXL
>          Issue Type: Task
>    Affects Versions: 3.0
>            Reporter: Dmitri Blinov
>
> After runnning Jexl tests I have noticed that the thread from testCancelForever() test
is still executing, and its stack trace is as follows:
> {code}
> org.apache.commons.jexl3.ScriptCallableTest$TestContext.runForever(ScriptCallableTest.java:159)
> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> java.lang.reflect.Method.invoke(Method.java:606)
> org.apache.commons.jexl3.internal.introspection.MethodExecutor.invoke(MethodExecutor.java:93)
> org.apache.commons.jexl3.internal.Interpreter.call(Interpreter.java:1816)
> org.apache.commons.jexl3.internal.Interpreter.visit(Interpreter.java:1535)
> org.apache.commons.jexl3.parser.ASTFunctionNode.jjtAccept(ASTFunctionNode.java:18)
> org.apache.commons.jexl3.internal.Interpreter.visit(Interpreter.java:1119)
> org.apache.commons.jexl3.parser.ASTJexlScript.jjtAccept(ASTJexlScript.java:55)
> org.apache.commons.jexl3.internal.Interpreter.interpret(Interpreter.java:210)
> org.apache.commons.jexl3.internal.Script$Callable.interpret(Script.java:364)
> org.apache.commons.jexl3.internal.Script$Callable.call(Script.java:372)
>    - locked org.apache.commons.jexl3.internal.Script$Callable@35595365
> java.util.concurrent.FutureTask.run(FutureTask.java:262)
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
> java.lang.Thread.run(Thread.java:745)
> {code}
> may be its worth rewriting the test to something like this
> {code}
>     public static class TestContext extends MapContext implements JexlContext.NamespaceResolver
{
>         protected volatile boolean x = false;
>         public int runForever() {
>             while (true) {
>                 if (x) {
>                     break;
>                 }
>             }
>             return 1;
>         }
> ...
>     @Test
>     public void testCancelForever() throws Exception {
>         JexlScript e = JEXL.createScript("runForever()");
>         TestContext tctx = new TestContext();
>         Callable<Object> c = e.callable(tctx);
>         ExecutorService executor = Executors.newFixedThreadPool(1);
>         Future<?> future = executor.submit(c);
>         Object t = 42;
>         try {
>             t = future.get(100, TimeUnit.MILLISECONDS);
>             Assert.fail("should have timed out");
>         } catch (TimeoutException xtimeout) {
>             // ok, ignore
>             future.cancel(true);
>             tctx.x = true;
>         } finally {
>             executor.shutdown();
>         }
> {code}



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

Mime
View raw message