Die JNDI -Suche nach JTA UserTransaction ist MBEAN -Threads in WebSphere Application Server 7 nicht verfügbar

StackOverflow https://stackoverflow.com/questions/8343533

  •  27-10-2019
  •  | 
  •  

Frage

Ich versuche, Business Logic über JMX (mit 'Standard' MBeans) in einer Webanwendung in WebSphere Application Server 7 mit JTA einzubeziehen und möchte wissen, warum diese Geschäftslogik die JTA -UserTransaction nicht sehen kann, wenn sie von einem aufgerufen werden kann MBEAN (weil es kann, wenn es über die Benutzeroberfläche der Web -App aufgerufen wird).

Wenn Hibernate versucht, die UserTransaction über 'Java: comp/userTransaction' nachzuschlagen, wird die folgende Ausnahme ausgelöst:

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

Dieses Problem sieht so aus Dieses Infocenter -Dokument.

Darüber hinaus kann ich das Problem in einer einfachen Web -App mit einer MBEAN reproduzieren, die die Suche durchführt:

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);
    }
  }

und ein Kontext -Hörer, der die Suche während des Starts aufruft und dann die MBEAN registriert:

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);
    }
}

Die Suche nach 'Java: comp/userTransaction' ist während der Kontextinitialisierung erfolgreich, fällt jedoch (mit einer ähnlichen Stapelspur wie oben) bei, wenn sie über JMX aufgerufen werden, wie SO:

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

Das "Erweitern Sie das Verwaltungssystem für WebSphere Application Server mit benutzerdefiniertem MBeans" Dokument " In IBMs Infocenter schlägt vor, dass Standard -MBeans, die in Anwendungen außerhalb getestet wurden, nur funktionieren sollten.

IBM geben an, dass die userTransaction -Suche nicht verfügbar ist:

  • CMT Enterprise Bean

  • Async Beans erstellt von EJBS `http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/topic/com.ibm.webphere.javadoc.doc/web/apidocs/com/ibm/webphere/asynchbeans/package- summary.html? resultof =%22%61%73%79%6e%63%68%62%65%61%6e%22%20%22%75%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%63%74%22%20

Entschuldigung für die nicht funktionierenden Links - ich bin ein neuer Benutzer und kann daher nur zwei Arbeitsverbindungen veröffentlichen.

Fallen einfache alte MBeans aus IBMs Sicht in eine dieser Kategorien?

Interessanterweise scheint die UserTransaction für JNDI -Lookup 'JTA/UserTransaction' verfügbar zu sein und diese als Fallback -Option zu verwenden scheint zu funktionieren - aber:

  • War 7 ist java ee 5 konform und wie von J2EE 1.3 'Java: comp/userTransaction' ist der angegebene JNDI-Standort für die UserTransaction- Siehe J2EE 1.3 Spec `http://java.sun.com/j2ee/j2ee-1_3-3- fr-spec.pdf

  • Die Verwendung einer Suche aus einer früheren Version der EE -Spezifikation scheint eine potenzielle Quelle anderer Fehler zu sein, und es wird möglicherweise nur einen Teil meines Problems angesprochen - die Tatsache, dass der Tatsache meiner Meinung nach nicht mit einer Anwendung verbunden ist, könnte andere Probleme verursachen.

Ein weiterer Punkt ist zu beachten, dass die UserTransaction auch den von der MBEAN über eingereichten Arbeiten für Arbeiten im Arbeitsmanager der Anwendung (ein IBM Work Manager) versteckt ist.

Mögliche Erklärungen, die mir aufgenommen wurden, sind:

  • Es kann Probleme haben, wie IBM MBEAN -Threads in 7 Jahre einrichten und dann mit den Anwendungen, die die MBeans registrieren, assoziieren.

  • Es kann einige zusätzliche Konfigurationsoptionen für die MBEAN -Registrierung geben, die wissen würde, dass sie die MBEAN mit der Anwendung, die sie registriert hat, in Verbindung bringen sollte. Ich habe mehrere alternative Ansätze ausprobiert, aber jedes Mal die gleiche Ausnahme gesehen:

    • Registrieren Sie die MBeans bei UserCollaboratoren und XML -Deskriptoren

    • Registrieren Sie sie bei ModelMbeanInfo

    • Registrieren Sie sie eher beim AdminService als beim MbeanServer

    • Verbesserung des Objektnamens für die MBEAN mit zusätzlichen Eigenschaften (Anwendung, J2EApplication) bei der Registrierung

  • Für die JMX -Client -Anfrage könnten einige zusätzliche Konfigurationsoptionen vorhanden sein, die wissen, dass sie die MBEAN -Invokation mit der entsprechenden Anwendung in Verbindung bringen sollte. In diesem Forum -Beitrag wird vorgeschlagen, eine Clientanwendung so zu konfigurieren, dass er auf den ersten Kontext zugreifen kann: `http://www.ibm.com/developerworks/forums/thread.jspa?messageId=14021995

  • Ich könnte vielleicht nicht versuchen, MBEANS auf diese Weise zu verwenden - trotz der Aussagen von IBM, die ich in der Lage sein sollte. Es wurde vermutet, dass EJBs die geeignete Lösung für diese Art von Anforderung sind.

Jedes Licht, das dieses Problem verschüttet werden kann, wäre sehr geschätzt.

War es hilfreich?

Lösung

MBEANS wird auf einem separaten Thread als Ihre Anwendung ausgeführt, sodass sie keinen Zugriff auf den Kontext der Anwendungsnamen in JNDI haben und daher keinen Zugriff auf Ihre Benutzertransaktion haben.

Ich denke, Ihre endgültige potenzielle Erklärung ist wahrscheinlich am genauesten:

Ich könnte vielleicht nicht versuchen, MBEANS auf diese Weise zu verwenden - trotz der Aussagen von IBM, die ich in der Lage sein sollte. Es wurde vermutet, dass EJBs die geeignete Lösung für diese Art von Anforderung sind.

MBEANS ist möglicherweise nicht für diese Art von Arbeit geeignet. Vielmehr kann die Verwendung von EJBs oder einem Webdienst angemessener sein.

Andere Tipps

Sie müssen setzen TransactionManagementType.BEAN Bei Transaktionsmanagement wie so:

@TransactionManagement(TransactionManagementType.BEAN) 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top