[
https://issues.jboss.org/browse/WELD-862?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Marius Bogoevici updated WELD-862:
----------------------------------
Fix Version/s: TBC
Moving to a future release, as this is an enhancement which needs further
discussion.
Not a Weld issue per se, as InvocationContexts are not intended to escape the
original invocation thread.
See explanation above for clarifications.
> Interceptors not threadsafe
> ---------------------------
>
> Key: WELD-862
> URL: https://issues.jboss.org/browse/WELD-862
> Project: Weld
> Issue Type: Enhancement
> Components: Interceptors and Decorators
> Affects Versions: 1.1.0.Final
> Environment: Jetty, Weld Filter
> Reporter: Sebastian Schaffert
> Assignee: Marius Bogoevici
> Fix For: TBC
>
>
> 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");
> @AroundInvoke
> public Object manageAsynchronous(final InvocationContext ctx) throws
> Exception {
> final UUID threadID = UUID.randomUUID();
> Runnable r = new Runnable() {
> @Override
> 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+")");
> t.start();
> 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.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://issues.jboss.org/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira
_______________________________________________
weld-issues mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/weld-issues