Example: Using the Java Management Extensions API to create a JDBC driver and data source for a CMP bean
This code sample demonstrates how to configure a JDBC provider and data source, designate the data source for use with CMP beans, set an authorization alias for the data source, and reload the Mbean to make configuration changes.
// // "This program may be used, executed, copied, modified and distributed // without royalty for the purpose of developing, using, marketing, or // distributing." // // Product 5630-A36, (C) COPYRIGHT International Business Machines // Corp., 2008 // All Rights Reserved * Licensed Materials - Property of IBM // import java.util.*; import javax.sql.*; import javax.transaction.*; import javax.management.*; import com.ibm.websphere.management.*; import com.ibm.websphere.management.configservice.*; import com.ibm.ws.exception.WsException; /** * Creates a node scoped resource.xml entry for a DB2 XA data source. * The data source created is for CMP use. * * Set the following for the program to run: * set classpath=%classpath%;install_root\runtime\com.ibm.ws.admin.client_6.1.0.jar * install_root/lib/bootstrap.jar;install_root/lib/j2ee.jar; * install_root/plugins/com.ibm.ws.bootstrap_6.1.0.jar;install_root/plugins/com.ibm.ws.emf_2.1.0.jar; * install_root/plugins/com.ibm.ws.runtime_6.1.0.jar;install_root/plugins/org.eclipse.emf.common_2.2.1.v200609210005.jar; * install_root/plugins/org.eclipse.emf.ecore_2.2.1.v200609210005.jar; */ public class CreateDataSourceCMP { String dsName = "markSection"; // the display name for the data source, // the JNDI name, and the connection factory name String dbName = "SECTION"; // the database name String authDataAlias = "db2admin"; // an authentication data alias String uid = "db2admin"; // user ID String pw = "db2admin"; // password String dbclasspath = "D:/SQLLIB/java/db2java.zip"; // path to the database driver /** * Main method. */ public static void main(String[] args) { CreateDataSourceCMP cds = new CreateDataSourceCMP(); try { cds.run(args); } catch (com.ibm.ws.exception.WsException ex) { System.out.println("Caught this " + ex ); ex.printStackTrace(); //ex.getCause().printStackTrace(); } catch (Exception ex) { System.out.println("Caught this " + ex ); ex.printStackTrace(); }/** * This method creates the data source using JMX. * The data source created here is only written into resources.xml. * It is not bound into namespace until the server is restarted or * an application is started */ public void run(String[] args) throws Exception { try { // Initialize the AdminClient. // Specify the SOAP_CONNECTOR_ADDRESS port of the server configuration. Properties adminProps = new Properties(); adminProps.setProperty(AdminClient.CONNECTOR_TYPE, + AdminClient.CONNECTOR_TYPE_SOAP); adminProps.setProperty(AdminClient.CONNECTOR_HOST, "localhost"); adminProps.setProperty(AdminClient.CONNECTOR_PORT, "8880"); AdminClient adminClient = + AdminClientFactory.createAdminClient(adminProps); // Get the ConfigService implementation. com.ibm.websphere.management.configservice.ConfigServiceProxy configService = new com.ibm.websphere.management.configservice.ConfigServiceProxy(adminClient); Session session = new Session(); // Use this group to add to the node scoped resource.xml. ObjectName node1 = ConfigServiceHelper.createObjectName(null,"Node", null); ObjectName[] matches = configService.queryConfigObjects(session, null, node1, null); node1 = matches[0]; // use the first node found // Use this group to add to the server1 scoped resource.xml. ObjectName server1 = ConfigServiceHelper.createObjectName(null, "Server", "server1"); matches = configService.queryConfigObjects(session, null, server1, null); server1 = matches[0]; // use the first server found // Create the JDBCProvider String providerName = "DB2 JDBC Provider (XA)"; System.out.println("Creating JDBCProvider " + providerName ); // Prepare the attribute list AttributeList provAttrs = new AttributeList(); provAttrs.add(new Attribute("name", providerName)); provAttrs.add(new Attribute("implementationClassName", "com.ibm.db2.jdbc.DB2XADataSource")); provAttrs.add(new Attribute("description","DB2 JDBC2-compliant + XA Driver")); //create the provider ObjectName jdbcProv = configService.createConfigData(session,node1, "JDBCProvider", "JDBCProvider",provAttrs); // now plug in the classpath configService.addElement(session,jdbcProv,"classpath",dbclasspath,-1); // Search for RRA so we can link it to the data source ObjectName rra = null; ObjectName j2cra = ConfigServiceHelper.createObjectName(null, "J2CResourceAdapter", null); matches = configService.queryConfigObjects(session, node1, j2cra, null); for (int i = 0; i < matches.length; i++) { if ( matches[i].getKeyProperty("_Websphere_Config_Data_Display_Name").equals("WebSphere Relational Resource Adapter") ) { rra = matches[i]; break; } } // Prepare the attribute list AttributeList dsAttrs = new AttributeList(); dsAttrs.add(new Attribute("name", dsName)); dsAttrs.add(new Attribute("jndiName", "jdbc/" + dsName)); dsAttrs.add(new Attribute("datasourceHelperClassname", "com.ibm.websphere.rsadapter.DB2DataStoreHelper")); dsAttrs.add(new Attribute("statementCacheSize", new Integer(10))); dsAttrs.add(new Attribute("relationalResourceAdapter", rra)); // this is where we make the link to "builtin_rra" dsAttrs.add(new Attribute("description", "JDBC data source for + mark section CMP 2.0 test")); dsAttrs.add(new Attribute("authDataAlias",authDataAlias)); // Create the data source System.out.println(" ** Creating data source"); ObjectName dataSource = configService.createConfigData(session,jdbcProv,"DataSource", "DataSource",dsAttrs); // Add a propertySet. AttributeList propSetAttrs = new AttributeList(); ObjectName resourcePropertySet = configService.createConfigData(session,dataSource,"propertySet", "",propSetAttrs); // Add resourceProperty databaseName AttributeList propAttrs1 = new AttributeList(); propAttrs1.add(new Attribute("name", "databaseName")); propAttrs1.add(new Attribute("type", "java.lang.String")); propAttrs1.add(new Attribute("value", dbName)); configService.addElement(session,resourcePropertySet, "resourceProperties",propAttrs1,-1); // Create the corresponding J2CResourceAdapter Connection Factory object. ObjectName jra = ConfigServiceHelper.createObjectName(null, "J2CResourceAdapter",null); // Get all the J2CResourceAdapter, and add the data source System.out.println(" ** Get all J2CResourceAdapters"); ObjectName[] jras = configService.queryConfigObjects(session, node1, jra, null); int i=0; for (;i< jras.length;i++) { System.out.println(ConfigServiceHelper.getConfigDataType(jras[i]) + " " + i + " = " + jras[i].getKeyProperty(SystemAttributes. + _WEBSPHERE_CONFIG_DATA_DISPLAY_NAME) + "\nFrom scope =" + jras[i].getKeyProperty(SystemAttributes. + _WEBSPHERE_CONFIG_DATA_ID)); // quit on the first builtin_rra if (jras[i].getKeyProperty(SystemAttributes. + _WEBSPHERE_CONFIG_DATA_DISPLAY_NAME) .equals("WebSphere Relational Resource Adapter")) { break; } } if (i >= jras.length) { System.out.println("Did not find builtin_rra; the J2CResourceAdapter object is + creating connection factory anyway" ); break; } else { System.out.println("Found builtin_rra J2CResourceAdapter object at index + " + i + " creating connection factory" ); } // Prepare the attribute list AttributeList cfAttrs = new AttributeList(); cfAttrs.add(new Attribute("name", dsName + "_CF")); cfAttrs.add(new Attribute("authMechanismPreference","BASIC_PASSWORD")); cfAttrs.add(new Attribute("authDataAlias",authDataAlias)); cfAttrs.add(new Attribute("cmpDatasource", dataSource )); // Make the link to data source's xmi:id ObjectName cf = configService.createConfigData(session,jras[i], "CMPConnectorFactory", "CMPConnectorFactory",cfAttrs); // ===== start Security section System.out.println("Creating an authorization data alias " + authDataAlias); // Find the parent security object ObjectName security = ConfigServiceHelper.createObjectName(null, "Security", null); ObjectName[] securityName = configService.queryConfigObjects(session, null, security, null); security=securityName[0]; // Prepare the attribute list AttributeList authDataAttrs = new AttributeList(); authDataAttrs.add(new Attribute("alias", authDataAlias)); authDataAttrs.add(new Attribute("userId", uid)); authDataAttrs.add(new Attribute("password", pw)); authDataAttrs.add(new Attribute("description","Auto created alias for data source")); //create it ObjectName authDataEntry = configService.createConfigData(session,security,"authDataEntries", "JAASAuthData",authDataAttrs); // ===== end Security section // Save the session System.out.println("Saving session" ); configService.save(session, false); // reload resources.xml reload(adminClient,true); } catch (Exception ex) { ex.printStackTrace(System.out); throw ex; }
/** * Get the DataSourceConfigHelperMbean and call reload() on it * * @param adminClient * @param verbose true - print messages to stdout */ public void reload(AdminClient adminClient,boolean verbose) { if (verbose) { System.out.println("Finding the Mbean to call reload()"); } // First get the Mbean ObjectName handle = null; try { ObjectName queryName = new ObjectName("WebSphere:type=DataSourceCfgHelper,*"); Set s = adminClient.queryNames(queryName, null); Iterator iter = s.iterator(); if (iter.hasNext()) handle = (ObjectName)iter.next(); } catch (MalformedObjectNameException mone) { System.out.println("Check the program variable queryName" + mone); } catch (com.ibm.websphere.management.exception.ConnectorException ce) { System.out.println("Cannot connect to the appserver" + ce); } if (verbose) { System.out.println("Calling reload()"); } Object result = null; try { result = adminClient.invoke(handle, "reload", new Object[] {}, new String[] {}); } catch (MBeanException mbe) { if (verbose) { System.out.println("\tMbean Exception calling reload" + mbe); } } catch (InstanceNotFoundException infe) { System.out.println("Cannot find reload "); } catch (Exception ex) { System.out.println("Exception occurred calling reload()" + ex); } if (result==null && verbose) { System.out.println("OK reload()"); }
}
Related concepts
Relational resource adapters and JCA
JDBC providers
Data sources