Skip to main content

Notice: this Wiki will be going read only early in 2024 and edits will no longer be possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.

Jump to: navigation, search

Difference between revisions of "EclipseLink/DesignDocs/316513"

m (DI 2: Enabling JMX MBeans)
m (JBoss Proof of Concept Registration 1)
Line 242: Line 242:
 
11:37:53,836 INFO  [STDOUT] [EL Info]: 2010-06-24 11:37:53.836--ServerSession(16405579)--Thread(Thread[http-127.0.0.1-8080-1,5,jboss])--Identity Map [org.eclipse.persistence.example.jpa.server.business.CellAttribute] class = class org.eclipse.persistence.internal.identitymaps.SoftCacheWeakIdentityMap
 
11:37:53,836 INFO  [STDOUT] [EL Info]: 2010-06-24 11:37:53.836--ServerSession(16405579)--Thread(Thread[http-127.0.0.1-8080-1,5,jboss])--Identity Map [org.eclipse.persistence.example.jpa.server.business.CellAttribute] class = class org.eclipse.persistence.internal.identitymaps.SoftCacheWeakIdentityMap
 
</pre>
 
</pre>
 +
 +
====WebSphere 7 JMX View of Services MBean after EM creation via EAR application run====
 +
 +
====Glassfish 2.1 JMX View of Services MBean after EM creation via EAR application run====
 +
====Glassfish 3.0.1 JMX View of Services MBean after EM creation via EAR application run====
  
 
===Testing Data Model===
 
===Testing Data Model===

Revision as of 13:33, 6 July 2010

Contents

Design Specification: Extend WebLogic 10.3 JMX MBean support to JBoss 5.1.0, WebSphere 7 and GlassFish V3 as generic API

Work in Queue

Completed Work

JPA EAR, EJB, WAR and SE (DDL Generation) WebLogic 10.3 J2EE application Eclipse projects in SVN - use to perform JMX MBean registration

Document History

Date Author Version Description & Notes
2010-06-10 Michael O'Brien 0.1 Starting Draft for Generic JMX MBean support to extend WebLogic 10.3 support to JBoss 5.1.0 EAP and WebSphere 7 for ER 316513
2010-06-22 Michael O'Brien 0.2 Develop/Document JBoss 5.1.0 EAP JMX registration code ER 316511 as work has been approved for the next release. We will concentrate on a POC for both servers before examining a rearchitecture as we move from WebLogic to include JBoss and WebSphere possibly using a new JMXPolicy interface instead of refactoring up into ServerPlatformBase
2010-07-05 Michael O'Brien 0.3 JBoss 5.0.1 EAP, Glassfish V2 2.1.0, Glassfish V3 3.0.1 all register functional EclipseLink MBeans now.

Project overview

QuickStart for Implementors

  • 1) Enable MBeans via System property

All Platforms Configuration

WebLogic Specific Configuration

JBoss Specific Configuration

WebSphere Specific Configuration

GlassFish Specific Configuration

Analysis

DI 1: Architecture for new JMX Platform Implementors

  • This design issue discusses how we will rearchitect the JMX support in EclipseLink. Currently only the WebLogic_10 platform supports JMX MBeans - we are extending this to JBoss 5 and WebSphere 7. There are a couple ways of implementing this change that involves consolidating duplicated functionality and extending only those platforms that support JMX in EclipseLink at this point - while at the same time providing a policy framework for further expansion of JMX support.
  • The big issue is how do we handle multiple inheritance with a combination of new Abstract or Interface classes without changing the entire ServerPlatform hierarchy.

Option 1: Move everything generic up to ServerPlatformBase

  • This issue with this is that we will only have 3 of the 6 platforms JMX enabled - by moving JMX code too high up in the class hierarchy we introduce functionality that OC4J, SAP and SUNAS support but not within the current EclipseLink version.

Option 2: Create a new JMXServer Policy or Interface

  • Although an interface is not required, it would be usefull in specifying which functions the actual platform where we register MBeans must implement.

Option 3: Create a new abstract JMXServerPlatform below ServerPlatformBase

Option 4: Create both a new abstract JMXServerPlatform abstract class and a JMXEnabledPlatform interface

  • Verify constructor does not leak unitialized variables during super() call

Option 5: Use the Decorator pattern: refactor the Platform package to use composition instead of inheritance

  • Each platform subclass no longer subclasses - it has a final private field of the superclass
  • Each method call on the private class is wrapped/forwarded to the wrapper class.
  • Benefits is that a superclass change does not affect the subclass
  • See Item 14 in Effective Java

Decision DI 1:

  • Currently option 4 - new JMX Interface and a new abstract JMXServerPlatformBase below ServerPlatformBase

DI 2: Enabling JMX MBeans

WebLogic

rem dev bean is deprecated and slated for removal
rem set JAVA_OPTIONS=%JAVA_OPTIONS% -Declipselink.register.dev.mbean=true
set JAVA_OPTIONS=%JAVA_OPTIONS% -Declipselink.register.run.mbean=true

JBoss

  • jboss-eap-5.0/jboss/as/bin/run.bat:83
// after
set JAVA_OPTS=%JAVA_OPTS% "-Djava.library.path=%JBOSS_NATIVE_HOME%;%PATH%;%SYSTEMROOT%"
// add
set JAVA_OPTS=%JAVA_OPTS% -Declipselink.register.run.mbean=true

WebSphere

GlassFish

DI 3: MBean Registration and Deregistration

  • These steps are mostly the same for all servers
    • 1) Get JNDI context to lookup an 'MBeanServer
    • 2) Create a new ObjectName for the MBean
    • 3) Create a server specific MBean via 1a) JNDI lookup or 1b) Direct API factory
    • 4) call registerMBean using the MBean and ObjectName
    • 5) discard the ObjectInstance return of registerMBean but cache the MBean*RuntimeServices MBean

JBoss MBean Registration

Option 1: JNDI Lookup
Option 2: Direct factory reference via JMX API
  • Get the first server in the list - usually the only one unless we are running on Oracle JRockit.
mBeanServerRuntime = (MBeanServer) MBeanServerFactory.findMBeanServer(null).get(0);
  • Note: This registration functionality works for all 3 servers WebLogic, WebSphere and JBoss so far.
  • The key here is that we use the same generic lookup for all platforms without using server specific JNDI.
  • Here is the refactored WebLogic_10_Platform using this non-JNDI lookup and registration - via the JRockit MC JConsole viewer.

Jrockit jconsole mbeans via non jndi generic spec lookup.JPG

Option 3: Direct factory reference via JBoss API
org.jboss.system.ServiceMBeanSupport

WebSphere MBean Registration

Option 1: JNDI Lookup

WebLogic MBean Registration

Option 1: JNDI Lookup

GlassFish MBean Registration

DI 4: 20100624: Verify correct MBeanServer available when running JBoss on JRockit

Design

WebLogic JMX Integration

JBoss JMX Integration

  • 20100622: This section details the JMX registration code for EclipseLink MBeans on JBoss 5.1.0 EAP
  • See jar signing and JMX prepending issues solved in bug# 305331 specific to the JBoss EAP edition that need to be covered off.

Modules

NEW: core:services.mbean.jboss.MBeanJBossRuntimeServices.java
NEW: core:services.mbean.jboss.MBeanJBossRuntimeServicesMBean.java
NEW: core:services.mbean.jboss.JBossRuntimeServices.java
MOD: core:services.mbean.weblogic.ClassSummaryDetail.java moved up to parent package
MOD: core:platform.server.jboss.JBossPlatform.java
MOD: core:services.mbean.weblogic.WebLogic_10_platform.java
  • Move the now generic system properties up to ServerPlatformBase
    /** This System property "eclipselink.register.dev.mbean" when set to true will enable registration/unregistration of the DevelopmentServices MBean */
    public static final String JMX_REGISTER_DEV_MBEAN_PROPERTY = "eclipselink.register.dev.mbean";
    /** This System property "eclipselink.register.run.mbean" when set to true will enable registration/unregistration of the RuntimeServices MBean */    
    public static final String JMX_REGISTER_RUN_MBEAN_PROPERTY = "eclipselink.register.run.mbean";

WebSphere JMX Integration

GlassFish JMX Integration

  • No work scheduled at this point of 20100622

Design Issue NN:

Analysis NN:

Solution NN:

Implementation

Testing

JBoss Specific EAR Configuration

  • The following scenario specifies @Remote on the remote interface and @Stateless on the stateless session bean.
    • This results in the following JNDI name emitted by the server on EAR deploy
@Stateless(name="ApplicationService", mappedName="ApplicationService")
@Remote(ApplicationServiceRemote.class)
public class ApplicationService implements ApplicationServiceRemote  {
	@PersistenceContext(unitName="example", type=PersistenceContextType.TRANSACTION)	
	private EntityManager entityManager;
...
}
 
public class FrontController extends HttpServlet implements Servlet {
    public static final String APPLICATION_SERVICE_JNDI_NAME 
      = "org.eclipse.persistence.example.jpa.server.jboss.EnterpriseEAR/ApplicationService/remote-org.eclipse.persistence.example.jpa.server.business.ApplicationServiceRemote";    
 
    /**
     * Get the SSB ApplicationService bean - using a JNDI context lookup (no EJB injection was used on this servlet)
     * @param viaJNDILookup
     * @return
     */
    public ApplicationServiceRemote getApplicationService(boolean viaJNDILookup) {
        if(null == applicationService && viaJNDILookup) {
            try {
                Hashtable<String, String> env = new Hashtable<String, String>();      
                env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");     
                env.put(Context.PROVIDER_URL, "localhost");      
                env.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces" );     
                InitialContext ctx = new InitialContext(env);
                System.out.println("FrontController.getApplicationService() JNDI lookup of " + APPLICATION_SERVICE_JNDI_NAME);
                return (ApplicationServiceRemote) ctx.lookup(APPLICATION_SERVICE_JNDI_NAME);            
            } catch (Exception e) {
                e.printStackTrace();
                throw new RuntimeException("Exception looking up session bean: ", e);
            }
        } else {
            return applicationService;
        }
    }
...
}

JBoss Proof of Concept Registration 1

  • First POC results positive using a non-JNDI JMX spec findMBeanServer() first server returned lookup (fine only for non-JRockit JVMs)

JBoss JMX View of Services MBean after EM creation via EAR application run

Jboss501eap toplink services mbean view POC cap.JPG

mBeanServerRuntime = (MBeanServer) MBeanServerFactory.findMBeanServer(null).get(0);
  • we register via
runtimeInstance = mBeanServerRuntime.registerMBean(runtimeServices, anObjectName);
  • to
server	MBeanServerImpl  (id=400)	
	classLoaderRepository	UnifiedLoaderRepository3  (id=409)	
	listeners	MBeanServerListenerRegistry  (id=417)	
	outer	MBeanServerImpl  (id=400)	
		classLoaderRepository	UnifiedLoaderRepository3  (id=409)	
		listeners	MBeanServerListenerRegistry  (id=417)	
		outer	MBeanServerImpl  (id=400)	
		registry	BasicMBeanRegistry  (id=419)	
			defaultDomain	"jboss" (id=426)	
			delegate	MBeanServerDelegate  (id=427)	
			domainMap	ConcurrentReaderHashMap  (id=432)	
			fMbInfosToStore	null	
			loaderRepository	UnifiedLoaderRepository3  (id=409)	
			mbeanInfoService	ObjectName  (id=436)	
			registrationNotificationSequence	SynchronizedLong  (id=439)	
			server	MBeanServerImpl  (id=400)	
			unregistrationNotificationSequence	SynchronizedLong  (id=444)	
	registry	BasicMBeanRegistry  (id=419)	
  • giving us
16:56:54,376 INFO  [STDOUT] [EL Finest]: 2010-06-22 16:56:54.376--Thread(Thread[http-127.0.0.1-8080-2,5,jboss])--Registered MBean: org.eclipse.persistence.services.jboss.MBeanJBossRuntimeServices[TopLink:Name=Session(vfszip_/C_/opt/jboss-eap-5.0b/jboss-as/server/default/deploy/org.eclipse.persistence.example.jpa.server.jboss.EnterpriseEAR.ear/org.eclipse.persistence.example.jpa.server.jboss.EnterpriseEJB.jar/_example)]

runtimeInstance	ServerObjectInstance  (id=519)	
	agentID	"xps435_1277239942304" (id=436)	
	className	"org.eclipse.persistence.services.jboss.MBeanJBossRuntimeServices" (id=521)	
	name	ObjectName  (id=501)	
		_ca_array	ObjectName$Property[1]  (id=523)	
		_canonicalName	"TopLink:Name=Session(vfszip_/C_/opt/jboss-eap-5.0b/jboss-as/server/default/deploy/org.eclipse.persistence.example.jpa.server.jboss.EnterpriseEAR.ear/org.eclipse.persistence.example.jpa.server.jboss.EnterpriseEJB.jar/_example)" (id=524)

Example JMX MBean call - printAllIdentityMapTypes

11:37:53,836 INFO  [STDOUT] [EL Info]: 2010-06-24 11:37:53.836--ServerSession(16405579)--Thread(Thread[http-127.0.0.1-8080-1,5,jboss])--Identity Map [org.eclipse.persistence.example.jpa.server.business.Cell] class = class org.eclipse.persistence.internal.identitymaps.SoftCacheWeakIdentityMap
11:37:53,836 INFO  [STDOUT] [EL Info]: 2010-06-24 11:37:53.836--ServerSession(16405579)--Thread(Thread[http-127.0.0.1-8080-1,5,jboss])--Identity Map [org.eclipse.persistence.example.jpa.server.business.CellAttribute] class = class org.eclipse.persistence.internal.identitymaps.SoftCacheWeakIdentityMap

WebSphere 7 JMX View of Services MBean after EM creation via EAR application run

Glassfish 2.1 JMX View of Services MBean after EM creation via EAR application run

Glassfish 3.0.1 JMX View of Services MBean after EM creation via EAR application run

Testing Data Model

Viewing EclipseLink MBeans by Application Server

WebLogic on JRockit JVM

WebLogic on SUN JVM

JBoss on SUN JVM

WebSphere on IBM J9 JVM

WebSphere on SUN JVM

  • Has issues - not tested

GlassFish on SUN JVM

  • Launch JConsole
    • Select remote process
    • JMXService url for GlassFish V3 is a really odd non-JMX spec
      • service:jmx:rmi://xps435:8686/jndi/rmi://xps435:8686/jmxrmi
      • instead of an expected
      • service:jmx:rmi://xps435:8686/jndi/jmxrmi

Regression Testing

  • change server names, IPs and HD paths to your environment
  • 1) Download my 20100629:0000 patch and rebuild your eclipselink.jar with these changes that are not yet in SVN.
    • Note: comments and error handling are not finished yet
  • 2) Note: currently Services MBean enablement is hardcoded to true for testing - it will be reverted to customer selectable before checkin
  • 3) Note: on non-WebLogic platforms the getModuleName/getApplicationName reflection code is not enabled yet
  • 4) The 20100630:1018 jar currently contains support for WebLogic 10.3, WebSphere 7 and JBoss (5 or 6)
  • 5) Run any EAR application that deploys an EntityManager such as the ones in the examples folder off of trunk,
    • Or use the EAR attached to bug# 316511 for JBoss
    • You should see the JBoss JMX screen capture above after you invoke http://127.0.0.1:8080/enterprise/FrontController?action=demo
    • The EAR demo will run out of the box with the DefaultDS HQSL datasource provided you have copied eclipselink.jar to the \common\lib directory
      • <jta-data-source>java:/DefaultDS</jta-data-source>
  • 6) Run a JMX viewer like one of the following to view and exercise TopLink MBeans
    • JBoss: http://127.0.0.1:8080/jmx-console/
    • WebLogic: JRockit MC (C:\opt\wls10330\jrockit_160_17_R28.0.0-679\bin\jrmc.exe)
    • WebSphere: TBD (J9 JConsole is having issues)
    • GlassFish: JConsole
      • Remote process: service:jmx:rmi://xps435:8686/jndi/rmi://xps435:8686/jmxrmi

Open Issues

References

Back to the top