[weld-issues] [JBoss JIRA] Created: (WELD-862) Interceptors not threadsafe

Sebastian Schaffert (JIRA) jira-events at lists.jboss.org
Tue Mar 1 04:35:05 EST 2011

Interceptors not threadsafe

                 Key: WELD-862
                 URL: https://issues.jboss.org/browse/WELD-862
             Project: Weld
          Issue Type: Bug
          Components: Interceptors and Decorators
    Affects Versions: 1.1.0.Final
         Environment: Jetty, Weld Filter
            Reporter: Sebastian Schaffert

I am trying to implement an "@Asynchronous" interceptor that runs methods annotated with the @Asynchronous annotation in a separate thread. The implementation of the interceptor currently looks as follows:

    private static final ThreadGroup asyncMethods = new ThreadGroup("asynchronous method invocations");

    public Object manageAsynchronous(final InvocationContext ctx) throws Exception {

        final UUID threadID = UUID.randomUUID();

        Runnable r = new Runnable() {
            public void run() {
                try {
                    log.debug("asynchronous method invocation of {}.{} (Thread ID {})",new Object[] {ctx.getTarget().getClass().getName(),ctx.getMethod().getName(), threadID});
                    Object val = ctx.proceed();

                    if(val != null) {
                        log.debug("asynchronous method invocation of {}.{} (Thread ID {}) returned value {}",new Object[] {ctx.getClass().getName(),ctx.getMethod().getName(), threadID, val});
                } catch(Exception ex) {
                    log.error("exception during asynchronous method invocation",ex);

        Thread t = new Thread(asyncMethods,r);
        t.setName("asynchronous method invocation of "+ctx.getTarget().getClass().getName()+ctx.getMethod().getName() + " (Threaad ID " + threadID+")");

        return null;

Now the problem is that the interceptor is called infinitely often. The reason is that the annotated method forks a new thread and then returns instantly, setting the variable "currentPosition" in SimpleInterceptorChain back to the value 0 (in a "finally" block). So when the proceed() method is called inside the thread, the interceptor chain again points to the first interceptor in the chain and it all repeats infinitely.

This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

More information about the weld-issues mailing list