java ejb3 @PostConstruct
Je suis expérimenter avec EJB3 sur JBoss, l'élaboration d'un stateless bean. Fondamentalement, une fois que le module a été déployé j'ai besoin d'effectuer certaines actions liées à charger les paramètres de l'application.
Pour ce faire, j'ai une méthode annotée @PostConstruct, qui autant que je sache, à partir de l'API charge le conteneur pour l'appeler une fois le haricot a été déployé et avant d'entrer en service. (correct?)
Maintenant, je suis confus, parce que, d'après le journal sur cette méthode ressemble n'est pas simplement appelé après a été déployé, mais avant chaque exposé de la méthode est appelée.
J'ai seulement besoin d'appeler cette méthode une fois, pas à chaque fois qu'il reçoit un appel. Quelle serait la meilleure approche?
Merci d'avance
Alessandro Ilardo
Vous ne savez pas si il va l'aider dans ce cas précis, mais si vous utilisez la version communautaire de JBoss (comme le 5.1 en tant QUE) assurez-vous de mettre à jour pour utiliser les dernières EJB3 code par l'installation de la dernière EJB3 plugin à partir de jboss.org/ejb3. Payé pour la version de JBoss a automatiquement mais pour la communauté, vous devez le mettre à jour manuellement.
OriginalL'auteur AleIla | 2009-07-10
Vous devez vous connecter pour publier un commentaire.
Un stateless bean devrait être rien de plus que des apatrides. Ce qui signifie que dans l'utilisation, vous ne devez pas être en mesure de dire ou de soins si la fève a été tiré à partir d'un pool ou construites à la demande de votre demande. Je suis dur-mis à imaginer comment un PostConstruct pourrait s'appliquer à un apatride, de l'environnement, depuis j'ai toujours utiliser cette fonction pour finir la construction d'un état de l'haricot.
Apparemment, JBoss est soit de renoncer à la mise en commun des apatrides, des haricots et de la construction de frais à chaque fois, ou, si elle est à l'aide de mise en commun, de les traiter comme ils ont été reconstruits à chaque fois (car ils ne devraient pas avoir à transporter des informations d'état). En fait, je suis un peu surpris que l'on appelle la PostConstruct à tous.
OriginalL'auteur Tim H
Tout d'abord PostConstruct est appelé avant la première méthode sera invoquée sur le haricot. Si aucune méthode sera invoquée n'est pas post construire jamais être appelé.
D'autre part, vous pouvez exécuter à l'inverse des actions dans PreDestory méthode pour supprimer les effets secondaires.
De toute façon le type d'action que vous avez à effectuer?
Golubyev: Ce que vous dites dans votre réponse ne s'applique qu'aux Stateless. Un Stateful Session Bean est instancié une fois que le client obtient une référence, que ce soit avec JNDI de recherche ou de l'Injection de Dépendance et à cette époque la PostConstruct méthode est appelée.
Dans Wildfly 8.1 mon @PostConstruct (dans un EJB stateless) est clairement demandé de démarrage de l'application, peu importe si une méthode est appelée ou non. De Plus, il est appelé avant l'exécution de tout service méthode (je ne sais pas encore comment faire pour l'empêcher de le faire).
OriginalL'auteur Mykola Golubyev
C'est à l'application serveur pour gérer le cycle de vie de l'Ejb. Il peut décider de construire, d'initialiser et d'abattre les haricots à chaque fois qu'il le juge approprié. Il se peut que chaque appel à votre stateless bean est sur une nouvelle instance de votre classe d'haricot, bien que cela semble comme une chose à faire.
Est le serveur d'application de l'appel de la @PostConstruct méthode plusieurs fois sur la même instance de l'objet, ou sur une instance différente à chaque fois? Essayez de rester connecter les instructions à l'intérieur, le constructeur et le @PostConstruct méthode.
OriginalL'auteur skaffman
Combien de SLSB avez-vous dans votre piscine? Selon le conteneur le
@PostConstruct
ne peut pas être appelé jusqu'à ce que le premier client accède à celle-ci (pas sûr de JBoss) donc c'est peut-être pourquoi on dirait qu'il est sur tous les accès. Il serait intéressant de voir si elle a cessé d'appeler votre post-méthode construct après l'appel de votre méthode le nombre de fois équivalent à la taille de votre piscine.Si vous effectuez certaines actions coûteuses dans votre post-construire méthode, puis peut-être le faire dans un SFSB au démarrage et à "injecter" SFSB dans votre SLSB dans le post-construction.
OriginalL'auteur Damo
PostConstruct est appelée avant que le client exécute une biz méthode. Cela signifie que si le bean n'est pas mis en commun le conteneur va instancier le haricot, faire l'injection, appelez le @PostConstruct méthode, puis laissez le biz méthode à exécuter.
Dans le cas d'une mise en commun est alors la @PostConstruct méthode sera exécutée chaque fois que le haricot est tiré de la piscine. Avec Stateless ce sera entre chaque appel de méthode. Avec les haricots Stateful ce sera après que le client recherche ou de l'injection.
Si vous avez besoin de faire quelque chose sur le déploiement de l'application de vos options dépend de la version de Java EE vous avez.
De Java EE 6, vous pouvez utiliser @Démarrage sur une @EJB Singleton qui contient un @PostConstruct méthode.
De Java EE 5 et la précédente vous aurez à utiliser un ServletContextListener dans une archive web. Vous pouvez avoir le ServletContextListener l'appel d'un EJB si vous le souhaitez.
Cependant ce qui pourrait être une question plus importante est l'endroit où vous souhaitez charger ces paramètres de l'application? Si vous avez affaire à un non-cluster unique de la JVM de configuration que vous allez vouloir charger dans un Singleton d'un certain type. Dans Java EE 5 - vous aurez à mettre en œuvre le modèle de conception singleton vous-même ou dans EE 6 utiliser le @EJB Singleton de type.
OriginalL'auteur Chase