2010-09-28 7 views
2

J'ai une méthode asynchrone dans mon singleton EJB qui est appelée à partir d'une autre méthode dans la même classe. Je sais déjà que je ne peux pas appeler la méthode asynchrone directement, je dois obtenir un proxy EJB. Le problème est, je ne veux pas que la méthode asynchrone soit visible en dehors de la classe; mais quand je le rends privé, il n'est pas exécuté de manière asynchrone. (J'utilise Glassfish v3.)@ Méthode privée asynchrone dans EJB

The javadocs ne dites rien sur le niveau d'accès requis. Donc, cela devrait-il être considéré comme un bug dans Glassfish?

Répondre

8

L'annotation de méthode ne peut pas être utilisée dans des méthodes privées. Lorsque Glassfish compilera votre EJB, il convertira votre annotation en un morceau de code qui entourera votre code dans un proxy. Si votre méthode est privée, elle contournera le proxy Glassfish créé ... Donc, dans votre cas, je suggère de créer un nouvel EJB avec votre méthode asynchrone pour l'injecter dans votre EJB actuel

+0

OK, mais pourquoi? Vous dites que l'objet proxy n'aura que des proxies pour les méthodes publiques. Cela est-il réellement requis par la spécification Java EE, ou s'agit-il simplement d'un détail d'implémentation de Glassfish? –

+2

C'est seulement une implémentation Glassfish, mais regardez waht Javadoc dit " Utilisé pour marquer une méthode comme une méthode asynchrone ou pour désigner toutes les méthodes commerciales d'une classe ou d'une interface asynchrone." Les méthodes commerciales sont des méthodes qui peuvent être utilisées par d'autres. les méthodes privées ne sont pas disponibles. –

+2

La spécification EE exige que seules les méthodes publiques puissent être utilisées. Il n'y aurait autrement aucun moyen pour un conteneur de créer un proxy pour une méthode privée, sauf si AOP/Weaving. Le fait que vous essayiez d'appeler une méthode privée signifie que vous n'appelez pas correctement les méthodes métier, vous appelez simplement des méthodes locales. –

1

Ceci est un commentaire très intéressant. Je peux voir la valeur de ce que vous essayez de faire. Essayez de marquer votre haricot comme @LocalBean et d'annoter votre méthode @Asynchronous en tant que protected.

Comme @LocalBean support est essentiellement fait par l'intermédiaire d'une sous-classe de la classe de haricot (dynamique ou statique), il est pas vraiment possible pour le conteneur à remplacer la méthode private. Mais je peux certainement voir votre cas d'utilisation. Si l'approche de méthode protected ne fonctionne pas, nous pouvons probablement ajouter ceci comme une amélioration à EJB.next.

Donnerait toujours accès à d'autres beans dans le même paquet, mais c'est au moins moins public. J'ai souvent souhaité que Java ait une portée de 'seulement des sous-classes'. Je n'ai presque jamais utilisé protected et je me suis dit: "Super, maintenant tout le monde dans mon paquet peut y accéder aussi."

+0

Marquage protégé ne sera pas vraiment accomplir ce que je veux, mais merci pour la suggestion. Cela pourrait être un bon ajout pour la prochaine version d'EJB; à défaut, ce serait bien si la documentation expliquait simplement que ce genre de chose ne marcherait pas. Et je suis d'accord avec l'idée de "portée de sous-classe uniquement". –

Questions connexes