2009-08-11 7 views
2

Application Server: JBOSS 4.2AroundInvoke Interceptor sur une méthode annotés @Timeout ne fonctionne pas

J'ai une méthode que je veux intercept.Its une méthode annotées @Timeout et invoqué par exemple javax.ejb.TimerService.

La signature de la méthode:

@Stateless 
class A 
     @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) 
    @Timeout 
     @Interceptors(AnInterceptor.class) 
    public void doSomething(Timer timer)... 

Maintenant, j'ai la classe Interceptor:

public class AnInterceptor { 
     @AroundInvoke 
     public Object intercept(InvocationContext ic) throws Exception{... 
     System.out.prin(...) 

Il fonctionne sur d'autres méthodes de méthode (qui ne sont pas annotés avec @Timeout)

de Merci , Rod

Répondre

1

Par la spécification, AroundInvoke n'est pas pris en charge pour les méthodes de timeout (interface métier, interface de composant et point de terminaison webservice uniquement). Recherche Google, AroundTimeout semble venir dans EJB 3.1 (pages 12 et 22):

http://www.ow2.org/xwiki/bin/download/Events2009AnnualConference/Program/JavaEE6-EasyBeans-F-Benoit.pdf

En attendant, vous pouvez contourner le problème en injectant une référence au même haricot en lui-même. En d'autres termes, injectez (ou recherchez) un autre "A" à l'intérieur de "A", puis créez et invoquez une nouvelle méthode "doTimeout" à partir de votre méthode "doSomething".

1

Au lieu d'utiliser @AroundInvoke, essayez d'utiliser @AroundTimeout

« Interceptor pour les méthodes de délai d'attente de service du minuteur EJB peuvent être définies en utilisant l'annotation @AroundTimeout sur les méthodes de la classe cible ou dans une classe d'intercepteur. Une seule méthode @AroundTimeout par classe est autorisée. "

Ici vous pouvez voir comment l'utiliser, dans la section « Délai d'attente des événements Intercepter » http://docs.oracle.com/javaee/6/tutorial/doc/gkedm.html#gkedu

Questions connexes