La recherche JNDI pour le JTA un usertransaction n'est pas disponible pour MBean threads dans Websphere Application Server 7

Je suis en train d'invoquer une logique d'entreprise via JMX (à l'aide de "standard" MBeans) dans une application web dans Websphere Application Server 7 avec JTA allumé et voudrais savoir pourquoi cette logique ne pouvez pas voir le JTA un usertransaction lorsqu'il est appelé à partir d'un MBean (car il peut quand il est invoqué via l'application web de l'INTERFACE utilisateur).

Quand hibernate tente de les rechercher via un usertransaction "java:comp/un usertransaction', l'exception suivante est générée:

org.hibernate.TransactionException: Could not find UserTransaction in JNDI [java:comp/UserTransaction]
    at org.hibernate.transaction.JTATransactionFactory.getUserTransaction(JTATransactionFactory.java:173)
    at org.hibernate.transaction.JTATransactionFactory.createTransaction(JTATransactionFactory.java:149)

    ...

    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:48)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
    at java.lang.reflect.Method.invoke(Method.java:600)
    at com.sun.jmx.mbeanserver.StandardMBeanIntrospector.invokeM2(StandardMBeanIntrospector.java:105)
    at com.sun.jmx.mbeanserver.StandardMBeanIntrospector.invokeM2(StandardMBeanIntrospector.java:39)
    at com.sun.jmx.mbeanserver.MBeanIntrospector.invokeM(MBeanIntrospector.java:220)
    at com.sun.jmx.mbeanserver.PerInterface.getAttribute(PerInterface.java:77)
    at com.sun.jmx.mbeanserver.MBeanSupport.getAttribute(MBeanSupport.java:228)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getAttribute(DefaultMBeanServerInterceptor.java:678)
    at com.sun.jmx.mbeanserver.JmxMBeanServer.getAttribute(JmxMBeanServer.java:650)
    at com.ibm.ws.management.AdminServiceImpl.getAttribute(AdminServiceImpl.java:853)
    at com.ibm.ws.management.remote.AdminServiceForwarder.getAttribute(AdminServiceForwarder.java:270)
    at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1415)
    at javax.management.remote.rmi.RMIConnectionImpl.access$200(RMIConnectionImpl.java:84)
    at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1276)
    at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1371)
    at javax.management.remote.rmi.RMIConnectionImpl.getAttribute(RMIConnectionImpl.java:612)
    at javax.management.remote.rmi._RMIConnectionImpl_Tie.getAttribute(_RMIConnectionImpl_Tie.java:578)
    at javax.management.remote.rmi._RMIConnectionImpl_Tie._invoke(_RMIConnectionImpl_Tie.java:98)
    at com.ibm.CORBA.iiop.ServerDelegate.dispatchInvokeHandler(ServerDelegate.java:622)
    at com.ibm.CORBA.iiop.ServerDelegate.dispatch(ServerDelegate.java:475)
    at com.ibm.rmi.iiop.ORB.process(ORB.java:513)
    at com.ibm.CORBA.iiop.ORB.process(ORB.java:1574)
    at com.ibm.rmi.iiop.Connection.respondTo(Connection.java:2841)
    at com.ibm.rmi.iiop.Connection.doWork(Connection.java:2714)
    at com.ibm.rmi.iiop.WorkUnitImpl.doWork(WorkUnitImpl.java:63)
    at com.ibm.ejs.oa.pool.PooledThread.run(ThreadPool.java:118)
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1563)
Caused by: javax.naming.ConfigurationException: A JNDI operation on a "java:" name cannot be completed because the server runtime is not able to associate the operation's thread with any J2EE application component.  This condition can occur when the JNDI client using the "java:" name is not executed on the thread of a server application request.  Make sure that a J2EE application does not execute JNDI operations on "java:" names within static code blocks or in threads created by that J2EE application.  Such code does not necessarily run on the thread of a server application request and therefore is not supported by JNDI operations on "java:" names. [Root exception is javax.naming.NameNotFoundException: Name "comp/UserTransaction" not found in context "java:".]
    at com.ibm.ws.naming.java.javaURLContextImpl.throwConfigurationExceptionWithDefaultJavaNS(javaURLContextImpl.java:428)
    at com.ibm.ws.naming.java.javaURLContextImpl.lookup(javaURLContextImpl.java:399)
    at com.ibm.ws.naming.java.javaURLContextRoot.lookup(javaURLContextRoot.java:214)
    at com.ibm.ws.naming.java.javaURLContextRoot.lookup(javaURLContextRoot.java:154)
    at javax.naming.InitialContext.lookup(InitialContext.java:455)
    at org.hibernate.transaction.JTATransactionFactory.getUserTransaction(JTATransactionFactory.java:163)
    ... 53 more
Caused by: javax.naming.NameNotFoundException: Name "comp/UserTransaction" not found in context "java:".
    at com.ibm.ws.naming.ipbase.NameSpace.lookupInternal(NameSpace.java:1178)
    at com.ibm.ws.naming.ipbase.NameSpace.lookup(NameSpace.java:1095)
    at com.ibm.ws.naming.urlbase.UrlContextImpl.lookup(UrlContextImpl.java:1233)
    at com.ibm.ws.naming.java.javaURLContextImpl.lookup(javaURLContextImpl.java:395)
    ... 57 more

Ce problème semble qu'il est plus que juste un problème de configuration d'hibernate - hibernate est à la recherche pour l'un usertransaction à ce qu'IBM dire, c'est le bon un usertransaction JNDI emplacement ("java:comp/un usertransaction') - voir ce document infocenter.

De plus, je peux reproduire le problème en une simple application web qui a un MBean qui ne le recherche:

public class JTALookup extends NotificationBroadcasterSupport implements JTALookupMBean {
  Log log = LogFactory.getLog(JTALookup.class);

  /**
   * {@inheritDoc}
   * @see JTALookupMBean#lookupUserTransaction()
   */
  @Override
  public void lookupUserTransaction() {
    try {
      log.info("Attempting 'java:comp/UserTransaction' lookup");
      Object usrTxn = new InitialContext().lookup("java:comp/UserTransaction");
      log.info("Successfully looked up 'java:comp/UserTransaction' [" + usrTxn + "]." );
    } catch (NamingException e) {
      log.info("'java:comp/UserTransaction' lookup failed");
      throw new RuntimeException("Failed to lookup JTA user transaction", e);
    }
  }

et un contexte auditeur qui appelle la recherche de cours de démarrage, puis enregistre le MBean:

public void contextInitialized(ServletContextEvent sce) {

    log.info("Initialising context");

    JTALookup jtaLookup = new JTALookup();
    jtaLookup.lookupUserTransaction(); //This succeeds
    log.info("Looked up JTA transaction");

    MBeanServer mbServer = AdminServiceFactory.getMBeanFactory().getMBeanServer();
    log.info("Got MBeanServer");

    try {
      mbServer.registerMBean(jtaLookup, new ObjectName("webJTALookupStub:type=JTALookup"));
      log.info("Registered dummy MBean");
    } catch (Exception e) {
      log.info("Failed to register dummy MBean");
      throw new RuntimeException("Failed to register dummy MBean", e);
    }
}

La recherche sur "java:comp/un usertransaction' réussit au cours de contexte d'initialisation, mais échoue (avec une autre trace de la pile pour que ci-dessus) lorsqu'il est appelé via jmx, comme suit:

public static void main(String[] args) {

    JMXServiceURL url = new JMXServiceURL(
        "service:jmx:rmi://" + "your.server.name.co.uk" + ":" + "2809" + "/jndi/JMXConnector"
    );

    Hashtable<String, Object> env = new Hashtable<String, Object>();
    env.put(Context.PROVIDER_URL, "corbaloc:iiop:gbbldd66.sys.chp.co.uk:2809/WsnAdminNameService");
    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory");

    //Establish the JMX connection.
    JMXConnector jmxc = JMXConnectorFactory.connect(url, env);

    //Get the MBean server connection instance.
    MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();

    ObjectName mbeanName = new ObjectName("webJTALookupStub:type=JTALookup");

    JTALookupMBean mBean = JMX.newMBeanProxy(mbsc, mbeanName, JTALookupMBean.class, true);

    mBean.lookupUserTransaction(); //This fails

La 'L'extension de l'administration WebSphere Application Server sur mesure MBeans document dans d'IBM infocenter suggère que les MBeans standard qui ont été testés dans des applications à l'extérieur a ÉTÉ devrait fonctionner.

IBM que l'un usertransaction de recherche n'est pas disponible à:

  • CMT haricots d'Entreprise`http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=/com.ibm.websphere.base.doc/info/aes/ae/cjta_glotran.html

  • Async Haricots créé par les Ejb`http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/topic/com.ibm.websphere.javadoc.doc/web/apidocs/com/ibm/websphere/asynchbeans/package-summary.html?resultof=%22%61%73%79%6e%63%68%62%65%61%6e%22%20%22%75%73%65%72%74%72%61%6e%73%61%63%74%69%6f%6e%22%20%22%75%73%65%72%74%72%61%6e%73%61%63%74%22%20

Excuses pour la non-fonctionnelle des liens, je suis un nouvel utilisateur et ne peuvent donc poster deux liens de travail.

Faire un bon vieux MBeans tomber dans une de ces catégories d'IBM et de point de vue?

Fait intéressant, l'un usertransaction semble être disponible sur la recherche JNDI 'jta/un usertransaction' et en les utilisant comme option de repli semble fonctionner - mais:

  • ÉTAIT de 7 est compatibles Java EE 5 et de J2EE 1.3 "java:comp/un usertransaction' est spécifié JNDI emplacement pour l'un usertransaction - voir le J2EE 1.3 spec `http://java.sun.com/j2ee/j2ee-1_3-fr-spec.pdf

  • À l'aide d'une recherche à partir d'une version antérieure de l'EE spécification semble comme une source potentielle d'autres bugs, et peut seulement être en train de traiter une partie de mon problème - le fait que A pense que mon MBean du fil n'est pas associé à une application pourrait provoquer d'autres problèmes.

Un autre point à noter est que l'un usertransaction est également caché de threads de travail soumis par le MBean à l'application manager (un IBM gestionnaire de travail) - qui pourrait être parce que c'est le traitement qui fonctionnent comme c'est un async bean soumis par un EJB?

Explications possibles qui ont eu lieu pour moi sont:

  • Il peut y problèmes avec la façon dont IBM configurer MBean fils en A 7, et de les associer ensuite avec les applications qui enregistrent les MBeans.

  • Il pourrait y avoir quelques options de configuration supplémentaires pour le MBean d'enregistrement, ce qui devrait laisser A savoir qu'il doit associer le MBean avec l'application qui l'a enregistré. J'ai essayé plusieurs solutions de rechange, mais vu la même exception à chaque fois:

    • De l'inscription de l'MBeans avec UserCollaborators et xml descripteurs

    • En les enregistrant avec ModelMBeanInfo

    • De les enregistrer avec le AdminService plutôt que de le MBeanServer

    • L'amélioration de l'ObjectName pour le MBean avec des propriétés supplémentaires (Application, J2EEApplication) à l'inscription

  • Il pourrait y avoir quelques options de configuration supplémentaires pour le client jmx demande, ce qui devrait laisser A savoir qu'il doit associer le MBean invokation avec l'application appropriée. Ce post sur le forum l'indique, il est possible de configurer une application client pour avoir accès au contexte initial: `http://www.ibm.com/developerworks/forums/thread.jspa?messageID=14021995

  • Je peut tout simplement pas être censé essayez d'utiliser les beans gérés de cette façon - en dépit d'IBM déclarations que je devrais être en mesure de. Il a été suggéré que les Ejb sont la solution la plus appropriée pour ce genre d'exigence.

Toute la lumière qui peut être versé sur ce problème serait grandement apprécié.