Pages

Friday, December 30, 2011

Email Listener customization for SSL enabled email servers like gmail

Maximo out of box does not work with email server with SSL enable like gmail. We had the same situation at one of client where the client uses gmail as their official mail server.

To enable email listener for SSL a java customization is needed in  psdi.common.emailstner.EmailListnerTask.
Following code snippet needs to be added to readMessagesFromMailServer method


 if ("pop.gmail.com".equals(prop.getProperty("mail.pop3.host"))) {
        System.out.println("Inside custom prop set");
        prop.put("mail.store.protocol", "pop3");

        prop.put("mail.pop3.auth", "true");
        prop.put("mail.pop3.starttls.enable", "true");
        prop.put("mail.pop3.port.ssl.enable", "true");
        prop.put("mail.pop3.ssl.trust", "*");
        prop.put("mail.pop3.starttls.required", "true");
        prop.put("mail.pop3.auth.plain.disable", "true");

        prop.put("mail.pop3.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        prop.put("mail.pop3.socketFactory.fallback", "false");
        prop.put("mail.pop3.socketFactory.port", "995");
      }

Along with this custimization SSL certificate needs to be downloaded to App Servers trust store from Email server host and port.


Rebuild and redeploy the ear and do the necessary configuration in email listener application with required account credentials and server details. Make to give security to which object the email listener update the details.

Note : This customization will not be supportable and upgradable as this is a change to oob maximo class.

Setting up Maximo doclinks/global directory in Unix based Clustered instance running on WAS

In a clustered Maximo instances, both doclinks and global directory should be accessible from all the servers.
Golbal directory should be accessible from all servers so that users can administer in the integration from any app servers else the error message can be viewed if you logged on that particular server where the message is read either using cron task or mdb (message driven bean).
Following are steps that needs to be followed in doing the setup ready:
1. Identify the system where you want to store attachment and integration related files(global dir). Normally it is advised to put this in SAN storage or place where there enough space available as these file system will keep on increasing with product usage.
2. Once the file system/directory is identified export the file system to make it available over network.
      i) Add an entry to /etc/exports file with file system name and access details for which system u want the access to be given( eg /DOCLINKS -access=192.168.89.16:192.168.89.17)
      ii) Use exportfs -a command to export the file system to be available over the network.
      iii) Start nfsd services by running (startsrc -s nfsd and startsrc -s mountd) command
3. mount these file systems in all the systems where ui appserver are running
      mount nfs $servername:/DOCLINKS /d1 (file system name be used as per customer preferance)
4. Now these mounted file system can be used as if it is file system on the same server
5. Edit the httd.conf point the DocumentRoot to the newly mounted file system.
6. Edit the doclink properties from system properties applications as per guide line given in system administration guide.
7. Once complete doclink set up is done to avoid doclinks to be accessible as directory using http server, copy the content under the /HTTPServer/htdocs/en_US to all sub directories or doclinks directory.


/usr/sbin/mknfsexp -d '/doclinks' -t rw -B -r "172.17.13.136"
exportfs -a
/usr/sbin/mknfsmnt -f '/DOCLINKS' -d '/doclinks' -h "172.17.13.133" '-n' '-B' '-A' -t 'rw' -w 'bg' '-Y' '-Z' '-X' '-H' '-j' '-q' '-g'



Monday, December 19, 2011

Good SQL Statements

Sql statement to update classification description with last description in the hierarchy

update CLASSIFICATION set DESCRIPTION = (select SUBSTR( description , LOCATE_IN_STRING( description , '\' , -1 ) + 1) from CLASSSTRUCTURE where CLASSSTRUCTURE.CLASSIFICATIONID=CLASSIFICATION.CLASSIFICATIONID) where DESCRIPTION is null

Saturday, December 17, 2011

Maximo Middleware start/stop in Unix based instances

If the instance is having LDAP enabed DB2 needs to be started first as tds will be using db2. Follow following steps
1. Login to the system as root
2. start ctginst1 instance:
              su - db2inst2 -c "db2start" -- > for maximo database
              su - db2inst1 -c "db2start"  --> for ldap database
If the database is on HADR then then after the restart of the database server hadr should also be started
              db2 start hadr on database as primary by force
3. start IBM Tivoli Directory Server Admin Daemon
            /opt/ibm/ldap/V6.2/sbin/idsdiradm -I <instancename>
 start IBM Tivoli Directory Server daemon
            /opt/ibm/ldap/V6.2/sbin/idsslapd -I <instancename>
To find out the tds instance use the command
           /opt/ibm/ldap/V6.2/sbin/idsilist

Important: The instance of IBM Tivoli Directory Server must remain as a manual startup type. It must be started manually to synchronize correctly with the database in the context of Maximo.
4. Start WebSphere dmgr node using
/usr/WebSphere/AppServer/profiles/ctgDmgr01/bin/startManager.sh

/usr/WebSphere/AppServer/profiles/ctgAppSrv01/bin/startNode.sh
/usr/IBM/HTTPServer/bin/apachectl start
/usr/WebSphere/AppServer/profiles/ctgAppSrv01/bin/startServer.sh MXServer
      

Changing Maximo login from pop up to FORM based

When maximo is installed with tds ldap, normally login screen comes up in a pop up. To change the login page from BASIC to FORM base following steps needs to be performed.

1. Open the web.xml file located in \IBM\SMP\maximo\applications\maximo\ maximouiweb\webmodule\WEB-INF\.
2. Take a back up of existing web.xml
3. Uncomment the login-config entry and make sure that the BASIC based login-config section is commented out.
The example code below shows which lines must be commented out.
<login-config>
     <auth-method>FORM</auth-method>
      <realm-name>MAXIMO Web Application Realm</realm-name>
      <form-login-config>
          <form-login-page>/webclient/login/ login.jsp?appservauth=true</form-login-page>
        <form-error-page>/webclient/login/loginerror.jsp</formerror- page>
    </form-login-config>
</login-config>

<!--
<login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>MAXIMO Web Application Realm</realm-name>
</login-config>
-->
4.    Save the file and then rebuild and redeploy the maximo.ear file.

Friday, December 16, 2011

Setting up both a Cluster and Integration Framework for Maximo 7.1 on WebSphere 6.1



This document applies only to the following language version(s):

English

Question

What are the steps required to set up a clustered Maximo application along with a stand-alone Maximo Integration Framework application for best performance?

Answer

When using the Maximo Integration Framework (IF) in a clustered environment the following should be considered.
· For best performance with minimal impact to users, the IF can be configured to run on a single instance of Maximo while users log in and work with User Interface (UI) Instances of Maximo. In this case, you will need separate application servers (IF and UI instances).


· To share these resources, all resources will need to be defined at the cell level within the WebSphere console. The reason for this is although the IF instance will do all of the processing of inbound transactions, outbound transaction events will still occur from the UI instances upon saving Maximo records. This means that the UI instances need to have access to the JMS resources such as connection factories in order to be able to send outbound messages.


· The IF instance which will be responsible for processing inbound IF transactions from the continuous queue will need to have the Message Driven Bean (MDB) deployed along with the Maximo application to it's own application server and therefore will need a maximo.ear build that is slightly different than the UI instances which will not need the Message Driven Bean running within them.


Below you will find instructions for setting up a cluster environment for UI instances of Maximo and a stand-alone application server for Maximo IF transaction processing.


In the example configuration below, we will use the following names:
MXSERVER is the application server for the Maximo UI from initial installation.
MXMIF is the application server for the Maximo Enterprise Adapter instance
MXCLUSTER is the cluster
MXUI1 is a clustered server for the UI
MXUI2 is a clustered server for the UI
Create a second application server: Name this second server MXMIF
1. Open the WebSphere Administrative Console.
2. Click Servers > Application servers, in the Application servers pane, click New.
3. In the Create New Application Server screen, enter MXMIF in the Server name field and click Next.
4. In the Select a server template screen, leave the selected “default” and click Next.
5. In the Specify server specific properties screen, check “Generate Unique Ports” checkbox, click Next.
6. Click Finish, and then click Save.
7. Heap size: Click on the new MXMIF server > Java and Process Management > Process Definition > Java Virtual Machine and fill in both the Initial and Maximum Heap sizes. Click Apply and then click Save
NOTE: When setting the maximum heap size for the MXMIF application server JVM, the admin guide says to set this to 1024MB, however, since this application server will not be used by users directly, the memory size can be increased to 2048MB so that it can handle large volumes of messages
Creating a cluster and cluster members
1. Click Servers > Clusters, in the Server clusters screen, click New.
2. In Step 1: Enter basic cluster information, enter MXCLUSTER in the Server name field, check Prefer local checkbox, click Next.
3. In Step 2: Create first Clustered Servers member, enter the following:
a. Enter MXUI1 in the Member name field.
b. Accept the defaults in the Select Node and Weight fields.
c. Check the Generate Unique Http Ports checkbox.
d. Select the “Create the member using existing application server as a template” radio button and choose MXSERVER (this is the application server name created initially for Maximo) from the drop down list and click Next.
4. In Step 3: Create additional cluster members, enter MXUI2 in the Member name field, click Add Member and then click Next.
5. Click Finish to create the cluster and clustered servers, then click Save
Update Virtual Hosts
This procedure describes how to verify port numbers used by the clustered servers. It also explains how to update the virtual host with the port number information. A virtual host enables a single host machine to resemble multiple host machines. Each virtual host has a logical name and a list of one or more DNS aliases by which it is known.
1. To verify port numbers of the clustered application servers, perform the following actions:
a. Servers > Application Servers, click MXUI1.
b. Under the Communications, click Ports.
c. Make a note of the WC_defaulthost port number for use below (9082, 9083).
2. Repeat Step 1 for MXUI2.
3. Environment > Virtual Hosts, click New.
4. Enter MXCLUSTER_host is the Name field, click Apply.
5. Click Host Aliases under Additional Properties.
6. Click New in the Host Alias panel to add 3 Host name and port number values to the host aliases list:
a. Host Name: *, Port: 80 (IBM HTTP Server port), click OK.
b. Host Name: *, Port: 9082 (same as port number for MXUI1), click OK.
c. Host Name: *, Port: 9083 (same as port number for MXUI2), click OK.
7. Click Save.
Creating data source providers for JMS stores
Set two data sources in the WebSphere console for use by the JMS resources


Note that each data source will require a unique schema, one will be used by the IF instance, and the other by the cluster. This is a WebSphere requirement that two message engines require unique schema names. As you add bus members, each member added will cause a unique message engine to be created. In this configuration there are two members, the IF instance and the cluster.


Since two schemas will be required for this configuration, and the first schema name will be the maximo schema, work with your DBA to create a second schema in the same database specifically for use by the second data source before proceeding with the steps below.


Important: The user that owns the second schema must be able to create tables.
Creating the data source provider
1. Resources > JDBC > JDBC Providers
2. Select a valid scope from the dropdown that represents the top level (cell), such as Cell=ctgCell01.
3. Click the "New" button.
4. In Step 1: Create new JDBC provider, select the following:
a. Select your database type.
b. Select the provider type (i.e. oracle and oracle driver).
c. In the implementation type dropdown select "XA data source".
d. In the name field, enter oraclexa, click “Next”.
5. In Step 2: Enter database class path information, enter the local path to your oraclethin.jar in the Directory location box, example: C:\ibm\SMP\maximo\applications\maximo\lib\ and click Next.
6. Click “finish” and then click the oraclexa again
7. Edit the Class path box with the correct path to the oracethin.jar as follows:
C:\ibm\SMP\maximo\applications\maximo\lib\oraclethin.jar
8. Click Apply and then click Save.
Creating the first data source
1. Navigate back to your JDBC providers and click oraclexa.
2. Click “Data sources" and then click New.
3. In Step 1: Enter basic data source information, in the Data source name field enter: oraclexads
4. In the JNDI name field, enter: jdbc/oraclexads, click “next”.
5. In Step 2: Enter database specific properties for the data source, enter the JDBC URL for your database (this can be found in your maximo.properties if you are not sure)


jdbc:oracle:thin:@server:1521:maximo


9. Select the Data store helper class name dropdown and select your database version, click Next.
10. Click “Finish” and then click Save
11. Repeat the above steps 1-8 to create a second Data source called oraclexads2.
Creating your first JAAS-J2C authentication data
1. Navigate back to your JDBC provider called oraclexa, click Data sources, click your data source called oraclexads
2. Under Related Items, click the link for "JAAS-J2C authentication data", click New
a. In the alias field, enter a value you would like to use: i.e. maximo
b. Enter the username and password used to connect to the database.
c. Enter a description that identifies this entry
3. Click apply.
4. Navigate back to your data source called oraclexads.
5. In the dropdown field for "Component managed authentication alias", select your data alias (i.e. maximo)
6. Click Apply and then Save.
7. Navigate to your data source again and click the test button at the top of the screen to test your data source.
8. Repeat steps 1-7 above to create a second JAAS-J2C authentication data named maximo2 for the oraclexads2 datasource.
Creating JMS resources for use in a clustered environment
Creating the JMS buses:
1. Service Integration/Buses, click New.
2. In Step 1: Create a new bus, enter in the name field "mifjmsbus"
3. Deselect the "Bus Security" checkbox and click “Next”, then click “Finish”.
4. Navigate to the bus you just created and select it
5. Change the "High message threshold" to 500,000 messages
6. Click "Apply" and then Save.
7. Repeat the above steps 1-7 to create a second bus called “uijmsbus”.
Adding members to the buses:
1. Service Integration/Buses
2. Select mifjmsbus, select "bus members", click Add.
3. In Step1: Select server, cluster…, select the “server” radio button, select MXMIF server from the drop down, click “next”
4. In Step 2: Select the “Data store” radio button, click Next.
5. In Step 3: Provide the message store properties,
a. select the “Use existing data source” radio button.
b. In the data source JNDI name field, enter: jdbc/oraclexads
c. Enter the schema name for the authentication alias used by this data source (i.e. maximo).
d. Select the alias you created for this data source from the dropdown.
e. Make sure the “create tables” checkbox is checked, click Next.
6. Click “finish” and then click Save.
7. Repeat steps 1-6 above for the uijmsbus, except using maximo2 and jdbc/oraclexads2
Setting the message store authentication alias
1. Service Integration/Buses and select mifjmsbus, select “Messaging engines”
2. Select the message engine from the list, there should be only one for the IF server
3. Under “Additional Properties” select “Message store”
4. In the authentication alias dropdown, select the maximo alias, click Apply and then click Save.
5. Repeat the above 4 steps to for the uijmsbus and maximo2 alias.
Creating bus destinations
cqin
1. Service Integration/Buses, select mifjmsbus
2. Click "Destinations", click New
3. Under Select destination type, select "Queue" and click “Next”
4. In Step 1: Set queue attributes, the Identifier field, enter "cqinbd" and click “Next”
5. In Step 2: Assign the queue to a bus member, under Bus member select Node=ctgNode01:server=MXMIF and click “Next”, then click “Finish”.
6. Navigate back to this destination, and set the exception destination radio button to “Specify” and set the value in the textbox to cqinbderr
7. Click “Apply” and click Save.
8. Repeat steps 1-7 for the cqinbderr queue.
sqin
1. Service Integration/Buses, select mifjmsbus
2. Click "Destinations", click New
3. Under Select destination type, select "Queue" and click “Next”
4. In Step 1: Set queue attributes, the Identifier field, enter "sqinbd" and click “Next”
5. In Step 2: Assign the queue to a bus member, under Bus member select Node=ctgNode01:server=MXMIF and click “Next”, then click “Finish”.
6. Navigate back to this destination, and set the exception destination radio button to “None”.
7. Click “Apply” and click Save.
sqout
1. Service Integration/Buses, select uijmsbus
2. Click "Destinations", click New
3. Under Select destination type, select "Queue" and click “Next”
4. In Step 1: Set queue attributes, the identifier field, enter "sqoutbd".
5. In Step 2: Assign the queue to a bus member, under Bus member select Node=ctgNode01:server=MXCLUSTER and click “Next”, then click “Finish”.
8. Navigate back to this destination, and set the exception destination radio button to “None”.
9. Click “Apply” and click Save.
Creating the IF connection factories
1. Resources/JMS providers
2. Select “Default Messaging Provider”, Cell=ctgCell01 scope
3. Select "Queue connection factories", click New and fill in the following:
a. In the name field, enter "mifconfact"
b. In the JNDI name field, enter: jms/maximo/int/cf/intcfmif
c. Select the bus mifjmsbus from the dropdown, click "apply".
4. Go back to "Queue connection factories", click New and fill in the following:
a. In the name field, enter "uiconfact".
b. In the JNDI name field, enter: jms/maximo/int/cf/intcfui
c. Select the bus uijmsbus from the dropdown.
d. Click "apply" and then click Save.
Create Continuous inbound error queue:
1. Resources/JMS providers
2. Select “Default Messaging Provider”, Cell=ctgCell01 scope
3. Click “Queues”, then click "New".
4. Enter the name as "CQINERR"
5. In the JNDI name field, enter "jms/maximo/int/queues/cqinerr”
6. Select the mifjmsbus as the bus for this queue from the bus name drop down
7. Select the cqinbderr queue from the queue name drop down
8. Click "Apply".
Modify JMS queues
Continuous inbound queue:
1. Select "CQIN"
2. Select the mifjmsbus as the bus for this queue from the bus name drop down
3. Select the cqinbd queue from the queue name drop down
4. Click "Apply".
Sequential inbound queue:
1. Select "SQIN"
2. Select the mifjmsbus as the bus for this queue from the bus name drop down
3. Select the sqinbd queue from the queue name drop down
4. Click "Apply".
Sequential outbound queue:
1. Select "SQOUT"
2. Select the uijmsbus as the bus for this queue from the bus name drop down
3. In Select the sqoutbd queue from the queue name drop down
4. Click "Apply" and then click Save.
Creating the JMS Activation Specifications
1. Resources/JMS/Activation specifications.
2. If it already exists, select and delete the current Activation specification “intjmsact”
3. Resources/JMS/JMS providers
4. Select “Default Messaging Provider”, Cell=ctgCell01 scope
5. Click “Activation specifications”, then click "New".
a. In both the Name field and the JNDI name field, enter "intjmsact"
b. In the "Destination JNDI name" field, enter "jms/maximo/int/queues/cqin"
c. Select the bus "mifjmsbus" from the bus name drop down
d. Set Maximum batch size to 10, set Maximum concurrent end points to 5
6. Click Apply
7. Repeat the steps above for a second activation specification called “intjmsacterr”
a. both the Name field and the JNDI name field, enter "intjmsacterr"
b. In the “Destination JNDI name” field, enter “jms/maximo/int/queues/cqinerr”
c. Select the bus "mifjmsbus" from the bus name drop down
d. Set Maximum batch size to 1, set Maximum end points to 10
8. Click “apply” and then click Save.
Changes required in Maximo
1. Launch the Maximo application and log in:
http://host:port/maximo
2. Navigate to the Integration/External Systems application
3. Select any external system and then from the Select action menu, select add/modify queues
4. Modify the connection factory names for your queues to match the names created above and the Maximum try count value as below:


Continuous inbound queue:
Queue JNDI name: jms/maximo/int/queues/cqin
Queue Connection Factory: jms/maximo/int/cf/intcfmif
Maximum Try count: 3


Queue JNDI name: jms/maximo/int/queues/cqinerr
Queue Connection Factory: jms/maximo/int/cf/intcfmif
Maximum Try count: 0


Sequential inbound queue:
Queue JNDI name: jms/maximo/int/queues/sqin
Queue Connection Factory: jms/maximo/int/cf/intcfmif
Maximum Try count: 0


Sequential outbound queue:
Queue JNDI name: jms/maximo/int/queues/sqout
Queue Connection Factory: jms/maximo/int/cf/intcfui
Maximum Try count: 0


5. Save your changes.


6. Configure you JMS crontasks (see the Systems Administrator guide for details).
Build and deploy multiple EAR files from the same Maximo directory.
You will need to build multiple ear file builds of Maximo where some of the files to be included in each ear file will be different from the next, you do not need multiple instances of the Maximo installation folder.
For example, the User Interface application server requires one ear file that disables the IF Inbound crontasks and the Integration Framework application server requires an ear file that disables the Outbound crontasks.


For each file that will be modified making it different for one ear from the next, make a copy of that file and name it appropriately. An example of the files that would be unique to each ear file for the above scenario might look like this:


maximo.properties
maximo.propertiesUI
maximo.propertiesIF


ejb-jar.xml
ejb-jarUI.xml
ejb-jarIF.xml


ibm-ejb-jar-bnd.xmi
ibm-ejb-jar-bndUI.xmi
ibm-ejb-jar-bndIF.xmi


Where there are 3 copies of each file, one with the default name, the next named for the User Interface ear, and one named for the Integration Framework ear.


In this scenario, for two ears you would make two copies of the file buildmaximoear.cmd and give them names such as the following:


buildmaximoear-UI.cmd
buildmaximoear-IF.cmd


These would be the files you use to build your individual ear files.


These are the steps to change the new cmd files to build your unique ear files:


1. Edit the buildmaximoear-UI.cmd file, and at the top, enter the following shell commands:


copy /Y \ibm\SMP\maximo\applications\maximo\properties\maximo.propertiesUI \ibm\SMP\maximo\applications\maximo\properties\maximo.properties
copy /Y \ibm\SMP\maximo\applications\maximo\mboejb\ejbmodule\meta-inf\ejb-jarUI.xml \ibm\SMP\maximo\applications\maximo\mboejb\ejbmodule\meta-inf\ejb-jar.xml
copy /Y \ibm\SMP\maximo\applications\maximo\mboejb\ejbmodule\meta-inf\ibm-ejb-jar-bndUI.xmi \ibm\SMP\maximo\applications\maximo\mboejb\ejbmodule\meta-inf\ibm-ejb-jar-bnd.xmi


2. Change the EAR_FILENAME variable to reflect the unique ear file name for the UI and IF, for example:


set EAR_FILENAME=maximoUI.ear


3. You can then run this build scripts to build the ear files. In this case, the resulting ear file will be named maximoUI.ear.


4. Repeat the above steps to create the maximoIF.ear as well, changing references from UI to IF.
Prepare the UI application




1. Edit the maximo.propertiesUI file and add the donotrun option as below:
a. mxe.crontask.donotrun=JMSQSEQCONSUMER.SEQQIN, BBCron.BBCRON1, ESCALATION. ESCESCBLTNEXP, REPORTLOCKRELEASE, REPORTLOCKRELEASE1, REPORTUSAGECLEANUP, REPORTUSAGECLEANUP1


Since we want almost all of the crontasks to run in the IF instance, all crontasks will be listed here except for the JMSQSEQCONSUMER.SEQQOUT - this crontask will need to run in the UI instance.


Note: Use of the above donotrun option is recommended over the target-enabled option because the donotrun option is Cluster-aware. Therefore, if the crontask is running in one application server, and that application server is shut down, another application server can take over running the crontasks.


Be sure to go through your list of crontasks and note each instance in the correct case and add it to the mxe.crontask.donotrun parameter in the maximo.propertiesUI, each separated by a comma


2. Build the maximoUI.ear file.

Prepare the IF application


For the MXMIF application instance, edit the following files and uncomment the message driven beans for the continuous queues:


1. Locate the file under \ibm\SMP\maximo\applications\maximo\mboejb\ejbmodule\meta-inf\ejb-jarIF.xml and edit the file and make sure the following four sections are uncommented to look like below:


<!-- MEA MDB -->
<message-driven id="MessageDriven_JMSContQueueProcessor_1">
<ejb-name>JMSContQueueProcessor-1</ejb-name>
<ejb-class>psdi.iface.jms.JMSContQueueProcessor</ejb-class>
<transaction-type>Container</transaction-type>
<message-destination-type>javax.jms.Queue</message-destination-type>
<env-entry>
<env-entry-name>MESSAGEPROCESSOR</env-entry-name>
<env-entry-type>java.lang.String </env-entry-type>
<env-entry-value>psdi.iface.jms.QueueToMaximoProcessor</env-entry-value>
</env-entry>
</message-driven>




<!-- MEA MDB for error queue -->
<message-driven id="MessageDriven_JMSContQueueProcessor_2">
<ejb-name>JMSContQueueProcessor-2</ejb-name>
<ejb-class>psdi.iface.jms.JMSContQueueProcessor</ejb-class>
<transaction-type>Container</transaction-type>
<message-destination-type>javax.jms.Queue</message-destination-type>
<env-entry>
<env-entry-name>MESSAGEPROCESSOR</env-entry-name>
<env-entry-type>java.lang.String </env-entry-type>
<env-entry-value>psdi.iface.jms.QueueToMaximoProcessor</env-entry-value>
</env-entry>
<env-entry>
<env-entry-name>MDBDELAY</env-entry-name>
<env-entry-type>java.lang.Long </env-entry-type>
<env-entry-value>30000</env-entry-value>
</env-entry>
</message-driven>




<!-- MEA MDB -->
<container-transaction>
<method>
<ejb-name>JMSContQueueProcessor-1</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>


<!-- MEA MDB for error queue -->
<container-transaction>
<method>
<ejb-name>JMSContQueueProcessor-2</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>




2. Locate the file under \ibm\SMP\maximo\applications\maximo\mboejb\ejbmodule\meta-inf\ibm-ejb-jar-bndIF.xmi and edit the file using a text editor and make sure the following 2 sections are uncommented to look like below:


<!-- MEA MDB -->
<ejbBindings xmi:type="ejbbnd:MessageDrivenBeanBinding" xmi:id="MessageDrivenBeanBinding_1" activationSpecJndiName="intjmsact">
<enterpriseBean xmi:type="ejb:MessageDriven" href="META-INF/ejb-jar.xml#MessageDriven_JMSContQueueProcessor_1"/>
</ejbBindings>


<!-- MEA MDB for error queue -->
<ejbBindings xmi:type="ejbbnd:MessageDrivenBeanBinding" xmi:id="MessageDrivenBeanBinding_1" activationSpecJndiName="intjmsacterr">
<enterpriseBean xmi:type="ejb:MessageDriven" href="META-INF/ejb-jar.xml#MessageDriven_JMSContQueueProcessor_2"/>
</ejbBindings>




3. Edit the maximo.properties file and add the donotrun option as below:
a. mxe.name=MXMIF
b. mxe.crontask.donotrun=JMSQSEQCONSUMER.SEQQOUT


Note: SEQQOUT will be the only crontask entry because this is the only crontask that we do not want to run.


4. Rename the current maximo.ear (for keeping) and then build the maximo.ear. When the new ear has been built, rename the new ear to ”mxmif.ear”.
Deploy both the UI and IF applications


1. Deploy both ear files:
a. The maximoUI.ear will be deployed to the MXCLUSTER, when mapping modules to servers make sure you select both the MXCLUSTER as well as the webserver1 and when mapping virtual hosts to web modules use the virtual host you created above: MXCLUSTER_host
b. The maximoIF.ear will be deployed to the MXMIF application, for the application name change from "MAXIMO" to MXMIF. When mapping modules to servers make sure you select both the MXMIF as well as the webserver1 and when mapping virtual hosts to web modules use the virtual host you created above: maximo_host


2. Start the MXCLUSTER Cluster and the MXMIF application server.




The Integration Global Directory:


When you deploy a web service, a folder called Axis2 is updated with the service you have just deployed. This file will be written under to root folder of the Integration Global Directory. If WebSphere application servers will be distributed in a multi-node environment, the integration global directory must exist in a shared location that all application servers can access.


This directory is used for error file extract and wsdl files for web services.
This shared location can be either a mapped drive or UNC share (Windows), or a mount point (Unix). The user specified to run the WebSphere services must have access to read and write to this share or mount point. This includes the node agent. In Windows, do not use a local system account to start Windows services but rather a domain account as local system accounts to not have access to mapped drives or UNC shares.


You set the integration global directory path in the System Properties application, the property is called mxe.int.globaldir.
Deploying web services


When deploying web services, you will need to set up the web service administration URL and port to point to the MXMIF application server IP address and port. When sending transactions to these interfaces, you will need to point your web service client to the IP address and port of the MXMIF application server IP address and port, not the cluster address for the UI instances


It is also important to make sure that the Integration Global Directory is in a location that all application servers in a multi-node environment can access. See the next section for information on the Integration Global Directory.




Important note:


Importing data can only be performed while logged into the IF instance where the Message Driven Bean is deployed. Exporting data can only be performed while logged into one of the UI applications

Setting up both a Cluster and Integration Framework for Maximo 7.1 on WebLogic 9


This document applies only to the following language version(s):

English

Question

How do you configure JMS resources for use with Integration Framework?

Answer

When using the Maximo Integration Framework (IF) in a clustered environment the following should be considered.
- For best performance with minimal impact to users, the Maximo Integration Framework (IF) can be configured to run on a single WebLogic application server instance of Maximo while users log in and work with a User Interface (UI) cluster of Maximo instances.

In the below example, you will need 4 WebLogic application servers. One application server will serve as the Administration console for the rest of the "managed" servers. One application server will be used for the stand-alone Maximo application used specifically for inbound IF transaction processing.

The other two application servers will be used to set up a cluster of application servers for use as the UI cluster. All outbound transactions will be generated by the UI cluster members running Maximo.

In the sample configuration below, there are 2 application servers in the UI cluster and 1 application server in the stand-alone application server. Below you will find instructions for configuring JMS resources for the IF instance and the UI cluster.

In the example configuration below, we will use the following names:
Name the Admin server AdminMAXSERV
Name the first Maximo application server for the UI cluster MAXIMOUI1
Name the second Maximo application server for the UI cluster MAXIMOUI2
Name the stand-alone Maximo application server MAXIMOIF

Creating your application servers
This document assumes you already have WebLogic 9.x installed and that you have an Administration server, and one managed server used for the Maximo application.

If you do not have a separate Administration server instance, create a new application server specifically for this purpose which will have a unique port.

You will need to modify the start script of your original application server and change the ADMIN_URL variable to point to the correct hostname and port of your new Administration server.
i.e. set ADMIN_URL=http://localhost:7001

Maximo will not be deployed to the administration server, it will be used only to manage all other application server instances.

Your original application server instance can be designated as your IF server. However, if you prefer to have it named according to this document, you will need to delete and recreate this server with the name MAXIMOIF.

You will also need to create 2 new managed application servers, belonging to a new cluster.
You can name them MAXIMOUI1 and MAXIMOUI2.


NOTE: When setting the maximum heap size for the MAXIMOIF application server JVM, the admin guide says to set this to 1024MB, however, since this application server will not be used by users directly, the memory size can be increased to 2048MB and 4096MB on some platforms so that it can handle a larger volume of messages without running out of memory.

Refer to the BEA web site for general information on load balancing in a cluster.

Defining the JDBC data source for use with JMS resources
1. From the WebLogic Administrative Console, click the “lock and edit” button
2. Navigate to services/jdbc/data sources and click "create a new jdbc data source"
3. Enter the name and JNDI name as follows:
jmsqueuedatasource
4. Select the type as your database platform type such Oracle thin or SQL server driver etc, click next - NOTE: this must be a non-XA driver
5. Turn off “supports global transaction” because this feature is not supported for jms stores, then click next
6. Configure the correct database name, hostname, port and user information, click next
7. Confirm the information and click the “test connection” button.
8. If successful click next
9. Select all 3 servers (IF, UI1 and UI2) as the targets for this data source
10. Click “finish”
11. Click “Activate Changes”

Creating your data stores for use with JMS resources
NOTE: The prefix values are very important, if you do not have unique names for prefix values on each store, messages can become corrupt as they will all use the same store files.

1. In the WebLogic console, click the “lock and edit” button.
2. Navigate in the left pane services/JDBC/persistent stores, click the link "create a new JMS jdbc store"
3. Enter the name as mxintcqinstore
4. Select the target for this store as MAXIMOIF
5. Select the data source created above
6. Enter a prefix value of "mxintcqin", then click "finish"
7. Create another new JMS jdbc store
8. Enter the name as mxintsqinstore
9. Select the target for this store as MAXIMOIF
10. Select the data source created above
11. Enter a prefix value of "mxintsqin", then click "finish"
12. Create a third JMS jdbc store
13. Enter the name as mxintsqoutstore
14. Select the target for this store as MAXIMOUI1(migrateable)
15. Select the data source created above
16. Enter a prefix value of "mxintsqout", then click "finish"
17. Create a fourth JMS jdbc store
18. Enter the name as mxintcqinerrstore
19. Select the target for this store as MAXIMOIF
20. Select the data source created above
21. Enter a prefix value of "mxintcqinerr", then click "finish"
22. Click “Activate Changes”

Creating your JMS resources for use in a clustered environment
1. Click the “lock and edit” button
2. Create four JMS servers with the following configuration parameters:
Parameter Value Properties
Name: Persistent store: Target:
sqinserver mxintsqinstore MAXIMOIF
sqoutserver mxintsqoutstore MAXIMOUI1(Migrateable)
cqinserver mxintcqinstore MAXIMOIF
cqinerrserver mxintcqinerrstore MAXIMOIF

3. Create a JMS system module named ifjmsmodule with MAXIMOIF selected as the target server.
4. Add a connection factory resource to the JMS module:
Parameter Value
Name: JNDI Name:
intjmsconfact jms/maximo/int/cf/intcf

Targets: Accept the default and click finish (the target will show the same selection as the target for this JMS module)

5. Add three queue resources to the JMS Module:
a. Create the queue resource type.
b. Create a new subdeployment with the same name as the queue, click next.
c. Select the radio button for the JMS server you are creating this subdeployment for.

Parameter Value
Queue 1
sqin

JNDI Name:
jms/maximo/int/queues/sqin

Subdeployment name:
sqin

JMS server name:
sqinserver

Queue 2
Name:
cqin

JNDI Name:
jms/maximo/int/queues/cqin

Subdeployment name:
cqin

JMS server name:
cqinserver

Queue 3
Name:
cqinerr

JNDI Name:
jms/maximo/int/queues/cqinerr

Subdeployment name:
cqinerr

JMS server name:
cqinerrserver


Template:
None

6. Enable the JMS connection factory for XA:
a. Select the intjmsconfact link.
b. From the Transactions tab, check the XA Connection Factory Enabled checkbox
c. Set the Maximum Messages per Session to -1.
7. Save and activate the changes.
8. Create a second JMS system module named uijmsmodule with UICluster checkbox selected as the target and the radio button "all servers in the cluster" selected.
9. Add a connection factory resource to the JMS module:
Parameter Value
Name:
intjmsconfact

JNDI Name:
jms/maximo/int/cf/intcf

Targets:
Accept the default and click finish (the target will show the same selection as the target for this JMS module)

10. Add one queue resource to the JMS Module:
a. Create the queue resource type.
b. Create a new subdeployment with the same name as the queue, click next.
c. Select the radio button for the JMS server you are creating this subdeployment for.
Parameter Value
Queue 1
Name:
sqout

JNDI Name:
jms/maximo/int/queues/sqout

JMS server name:
sqoutserver

Template:
None

11. Enable the JMS connection factory for XA:
a. Select the intjmsconfact link.
b. From the Transactions tab, check the XA Connection Factory Enabled checkbox
c. Set the Maximum Messages per Session to -1.
12. Save and activate the changes.
13. Restart the WebLogic Admin, IF and UI application servers

NOTE: For each JDBC data store created above, a table will automatically be created in your MAXIMO schema with the prefix names you entered when you created the new stores and will be created in the database when the application servers are restarted:

MXINTCQINWLSTORE
MXINTCQINERRWLSTORE
MXINTSQINWLSTORE
MXINTSQOUTWLSTORE

Build and deploy multiple EAR files from the same Maximo directory.
You will need to build multiple ear file builds of Maximo where some of the files to be included in each ear file will be different from the next, you do not need multiple instances of the Maximo installation folder.

For each file that will be modified making it different for one ear from the next, make a copy of that file and name it appropriately.

For example, since the User Interface application server requires one ear file that enables only outbound messaging crontask and the Integration Framework application server requires an ear file that enables all the other crontasks.

An example of the files that would be unique to each ear file for the above scenario might look like this:

C:\ibm\SMP\maximo\applications\maximo\properties
maximo.properties
maximo.propertiesUI
maximo.propertiesIF

C:\ibm\SMP\maximo\applications\maximo\mboejb\ejbmodule\META-INF
ejb-jar.xml
ejb-jarUI.xml
ejb-jarIF.xml

weblogic-ejb-jar.xml
weblogic-ejb-jarUI.xml
weblogic-ejb-jarIF.xml

Where there are 3 copies of each file, one with the default name, the next named for the User Interface ear, and one named for the Integration Framework ear.

In this scenario, for two ears you would make two copies of the file buildmaximoear.cmd and give them names such as the following:

buildmaximoear-UI.cmd
buildmaximoear-IF.cmd

These would be the files you use to build your individual ear files.

These are the steps to change the new cmd files to build your unique ear files:

1. Edit the buildmaximoear-UI.cmd file, and at the top of the file, enter the following shell commands:

copy /Y \IBM\SMP\maximo\applications\maximo\mboejb\ejbmodule\META-INF\ejb-jar-UI.xml \IBM\SMP\maximo\applications\maximo\mboejb\ejbmodule\META-INF\ejb-jar.xml

copy /Y \IBM\SMP\maximo\applications\maximo\mboejb\ejbmodule\META-INF\weblogic-ejb-jarUI.xml
\IBM\SMP\maximo\applications\maximo\mboejb\ejbmodule\META-INF\weblogic-ejb-jar.xml

copy /Y \IBM\SMP\maximo\applications\maximo\properties\maximo.propertiesUI \IBM\SMP\maximo\applications\maximo\properties\maximo.properties

2. Change the EAR_FILENAME variable to reflect the unique ear file name for the UI, for example:

set EAR_FILENAME=maximoUI.ear

3. Edit the buildmaximoear-IF.cmd file, and at the top of the file, enter the following shell commands:

copy /Y \IBM\SMP\maximo\applications\maximo\mboejb\ejbmodule\META-INF\ejb-jar-IF.xml \IBM\SMP\maximo\applications\maximo\mboejb\ejbmodule\META-INF\ejb-jar.xml

copy /Y \IBM\SMP\maximo\applications\maximo\mboejb\ejbmodule\META-INF\weblogic-ejb-jarIF.xml
\IBM\SMP\maximo\applications\maximo\mboejb\ejbmodule\META-INF\weblogic-ejb-jar.xml

copy /Y \IBM\SMP\maximo\applications\maximo\properties\maximo.propertiesIF \IBM\SMP\maximo\applications\maximo\properties\maximo.properties

4. Change the EAR_FILENAME variable to reflect the unique ear file name for the IF, for example:

set EAR_FILENAME=maximoIF.ear

5. Now when you run the build scripts to build the ear files, the resulting ear file will be named maximoUI.ear and maximoIF.ear respectively.

Prepare and Deploy the UI application cluster
1. Locate the maximo/applications/maximo/properties/maximo.propertiesUI file and change the mxe.name property to a name that represents that this is the ear file for the UI cluster, i.e. MXServerUI.
2. Add the line mxe.crontask.donotrun if it is does not already exist in the properties file so that only the JMSQSEQCONSUMER.SEQQOUT crontask will run on this server:
e.g.
mxe.crontask.donotrun=JMSQSEQCONSUMER.SEQQIN,IFACETABLECONSUMER.IFACEIN,BBcron.BBCRON1,......

Note: Since we want all crontasks to run in the IF instance, all crontasks will be listed here except for the JMSQSEQCONSUMER.SEQQOUT. This crontask will need to run in the cluster.

Crontasks are cluster aware as long as they are specified where to run using the maximo.properties. If using the Target Enable feature to force the IF crontasks to run in specific servers, they are not cluster aware and no failover will occur if the server running a specific IF crontask fails.

Be sure to go through your list of crontasks and note each instance in the correct case and add it to the mxe.crontask.donotrun parameter in the maximo.properties file, each separated by a comma.

3. Save and close the file.
4. Build the maximoUI.ear by running buildmaximoear-UI.cmd
5. Deploy this maximoUI.ear to the cluster (refer to the system administrator's guide for deployment information)
6. Restart the cluster

Prepare and Deploy the IF application server
To make sure that the MDB used by the IF application is deployed correctly, edit the following files and make sure the MDBs are uncommented:

1. Locate the file under Maximo/applications/maximo/mboejb/ejbmodule/META-INF/ejb-jarIF.xml
Open the file using a text editor and uncomment the following:

Make sure the following 4 sections look like this:
<!-- MEA MDB -->
<message-driven id="MessageDriven_JMSContQueueProcessor_1">
<ejb-name>JMSContQueueProcessor-1</ejb-name>
<ejb-class>psdi.iface.jms.JMSContQueueProcessor</ejb-class>
<transaction-type>Container</transaction-type>
<message-destination-type>javax.jms.Queue</message-destination-type>
<env-entry>
<env-entry-name>MESSAGEPROCESSOR</env-entry-name>
<env-entry-type>java.lang.String </env-entry-type>
<env-entry-value>psdi.iface.jms.QueueToMaximoProcessor</env-entry-value>
</env-entry>
</message-driven>


<!-- MEA MDB for error queue -->
<message-driven id="MessageDriven_JMSContQueueProcessor_2">
<ejb-name>JMSContQueueProcessor-2</ejb-name>
<ejb-class>psdi.iface.jms.JMSContQueueProcessor</ejb-class>
<transaction-type>Container</transaction-type>
<message-destination-type>javax.jms.Queue</message-destination-type>
<env-entry>
<env-entry-name>MESSAGEPROCESSOR</env-entry-name>
<env-entry-type>java.lang.String </env-entry-type>
<env-entry-value>psdi.iface.jms.QueueToMaximoProcessor</env-entry-value>
</env-entry>
<env-entry>
<env-entry-name>MDBDELAY</env-entry-name>
<env-entry-type>java.lang.Long </env-entry-type>
<env-entry-value>30000</env-entry-value>
</env-entry>
</message-driven>

<!-- MEA MDB -->
<container-transaction>
<method>
<ejb-name>JMSContQueueProcessor-1</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>

<!-- MEA MDB for error queue -->
<container-transaction>
<method>
<ejb-name>JMSContQueueProcessor-2</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>

2. Save and close the file.
3. Locate the file under Maximo/applications/maximo/mboejb/ejbmodule/META-INF/weblogic-ejb-jarIF.xml
Open the file using a text editor and uncomment the following:

Make sure the following 2 sections look like this:
<!-- MEA MDB -->
<weblogic-enterprise-bean>
<ejb-name>JMSContQueueProcessor-1</ejb-name>
<message-driven-descriptor>
<pool>
<max-beans-in-free-pool>3</max-beans-in-free-pool>
</pool>
<destination-jndi-name>jms/maximo/int/queues/cqin</destination-jndi-name>
<connection-factory-jndi-name>jms/maximo/int/cf/intcf</connection-factory-jndi-name>
</message-driven-descriptor>
<transaction-descriptor>
<trans-timeout-seconds>600</trans-timeout-seconds>
</transaction-descriptor>
<jndi-name>JMSContQueueProcessor-1</jndi-name>
</weblogic-enterprise-bean>

<!-- MEA MDB for error queue -->
<weblogic-enterprise-bean>
<ejb-name>JMSContQueueProcessor-2</ejb-name>
<message-driven-descriptor>
<pool>
<max-beans-in-free-pool>3</max-beans-in-free-pool>
</pool>
<destination-jndi-name>jms/maximo/int/queues/cqinerr</destination-jndi-name>
<connection-factory-jndi-name>jms/maximo/int/cf/intcf</connection-factory-jndi-name>
</message-driven-descriptor>
<transaction-descriptor>
<trans-timeout-seconds>600</trans-timeout-seconds>
</transaction-descriptor>
<jndi-name>JMSContQueueProcessor-2</jndi-name>
</weblogic-enterprise-bean>
4. Locate the Maximo/applications/maximo/properties/maximo.propertiesIF file and change the mxe.name property to a name that represents that this is the ear file for the IF instance, i.e. MXServerIF.
5. Add the line mxe.crontask.donotrun if it does not already exist in the properties files so that all crontasks except for the JMSQSEQCONSUMER.SEQQOUT crontask will run on this server:
e.g.
mxe.crontask.donotrun=JMSQSEQCONSUMER.SEQQOUT

Note: This will be the only crontask entry because this is the only crontask that we do not want to run.

6. Save and close the file
7. Build the maximoIF.ear by running buildmaximoear-IF.cmd
8. Deploy the maximoIF.ear to the MAXIMOIF application server (refer to the system administrator's guide for deployment information)
9. Restart the MAXIMOIF application server

Web services:
When deploying web services, you will need to set up the web service administration URL and port to point to the MAXIMOIF application server IP address and port.
When sending transactions to these interfaces, you will need to point your web service client to the IP address and port of the MAXIMOIF application server IP address and port, not the cluster address for the UI instances.
This is to prevent any inbound transaction processing from web service invocation from taking place on the UI cluster. It is also important to make sure that the Integration Global Directory is in a location that all application servers in a multi-node environment can access. See the next section for information on the Integration Global Directory.

The Integration Global Directory:
When you deploy a web service, all wsdl and schema files are written with the service you have just deployed. These file will be written to the Integration Global Directory. If WebLogic application servers will be distributed in a multi-node environment, the integration global directory must exist in a shared location that all application servers can access.

This shared location can be either a mapped drive or UNC share (Windows), or a mount point (Unix). The user specified to run the WebLogic services must have access to read and write to this share or mount point. This includes the node manager if in use. In Windows, do not use a local system account but rather a domain account as local system accounts to not have access to mapped drives or UNC shares.

You set the integration global directory path in the System Properties application, the property is called mxe.int.globaldir.

Important note:

Importing data can only be performed while logged into the IF instance where the Message Driven Bean is deployed. Exporting data can only be performed while logged into one of the UI cluster members.

If you need to be able to perform outbound transactions for any reason from the IF instance such as due to recurrence or crontasks that update data causing events to be fired, you will need to add another jms server to the MAXIMOIF application server, and create another queue with the same JNDI name jms/maximo/int/queues/sqout as exists in the first jms uijmsmodule in the ifjmsmodule.

This configuration will require that you duplicate the JMSQSEQCONSUMER.SEQQOUT crontask instance so you will have two instances running for the same queue JNDI name.

The first instance will need to be forced to run in the UI cluster and the second forced to run in the IF instance.

This is accomplished using the donotrun property.

Please note that advanced configuration such as distributed queueing is beyond the scope of Support Services however these configurations can be provided by the IBM Services groups.

Setting up both a Cluster and Maximo Enterprise Adapter for Maximo 6 on WebSphere 6.0


Problem(Abstract)

This document describes the steps required to set up a clustered Maximo application along with a stand-alone MEA application for best performance

Resolving the problem

When using the Maximo Enterprise Adapter (MEA) in a clustered environment the following should be considered.
· For best performance with minimal impact to users, the MEA can be configured to run on a single instance of Maximo while users log in and work with User Interface (UI) Instances of Maximo. In this case, you will need separate application servers (MEA and UI instances).

· To share these resources, all resources will need to be defined at the cell level within the WebSphere console. The reason for this is although the MEA instance will do all of the processing of inbound transactions, the outbound transaction events will still occur from the UI instances upon saving Maximo records. This means that the UI instances need to have access to the JMS resources such as connection factories in order to be able to send outbound messages.

· The MEA instance which will be responsible for processing inbound MEA transactions from the continuous queue will need to have the Message Driven Bean (MDB) deployed along with the Maximo application to its own application server and therefore will need a maximo.ear build that is slightly different than the UI instances which will not need the Message Driven Bean running within them.

Below you will find instructions for setting up a cluster environment for UI instances of Maximo and a stand-alone application server for Maximo MEA transaction processing.

In the example configuration below, we will use the following names:
MXSERVER is the application server for the Maximo UI from initial installation.
MAXIMOMEA is the application server for the Maximo Enterprise Adapter instance
MAXIMOCLUSTER is the cluster
MAXIMOUI1 is a clustered server for the UI
MAXIMOUI2 is a clustered server for the UI
Create a second application server: Name this second server MAXIMOMEA
Follow the instructions in the Maximo System Administrator's Guide to create a second application server
Name this server MAXIMOMEA

NOTE: When setting the maximum heap size for the MAXIMOMEA application server JVM, the admin guide says to set this to 1024MB, however, since this application server will not be used by users directly, the memory size can be increased to 2048MB so that it can handle large volumes of messages
Create a cluster and cluster members.
1. Open the WebSphere Administrative Console.
2. Click Servers > Clusters in the navigation pane.
3. Click New in the Server Cluster pane.

4. In Step 1 of the Enter Basic Cluster Information panel, perform the following actions:
a. Type MAXIMOCLUSTER in the Cluster name field.
b. Select the Prefer local box.
c. Select Do not include an existing server in this cluster button.
d. Click Next.

5. In Step 2 of the Create New Clustered Servers panel, perform the following actions:
a. Type MAXIMOUI1 in the Member name field.
b. Accept the defaults in the Select Node and Weight fields.
c. Select Generate Unique Http Ports.
d. Select the Existing application server button, and choose MAXIMOSERVER (this is the application server name created initially for Maximo) from the drop down list.
e. Click Apply.

6. Repeat step 5 to create a second cluster member, and in the Member name field enter MAXIMOUI2.

NOTE You do not have to perform step 5-d when you create additional clustered servers, because MAXIMOUI2 automatically defaults to the template you selected for MAXIMOUI1.

7. Click Next.
8. Click Finish to create the cluster and clustered servers.
9. Click Save.
10. Select Synchronize changes with Nodes, then click Save again.
Update Virtual Hosts
This procedure describes how to verify port numbers used by the clustered servers. It also explains how to update the virtual host with the port number information. A virtual host enables a single host machine to resemble multiple host machines. Each virtual host has a logical name and a list of one or more DNS aliases by which it is known.

1. To verify port numbers of the clustered application servers, perform the following actions:
a. In the navigation pane, click Servers > Application Servers.
b. In the Application Servers panel, click MAXIMOUI1.
c. Under the Communication heading, click Ports.
Note the WC_defaulthost port for use in Step 3 below (for example, step 3-h requires a WC_defaulthost port.)

2. Repeat Step 1 for MAXIMOUI2.

3. In the navigation pane, click Environment > Virtual Hosts.
Complete the following actions:
a. Click New to add a new virtual host for the cluster, then enter MAXIMOCLUSTER_host for the Name.
b. Click Apply.
c. Click Host Aliases under Additional Properties.
d. Click New in the Host Alias panel to add Host name and port number values to the host aliases list.
e. Enter the following:
Host Name: *
Port: 80 (same as port number for the IBM HTTP Server), Click OK.
f. Click Host Aliases, then click New.
g. Enter the following:
Host Name: *
Port: 9081 (same as port number for MAXIMOUI1), Click OK.
h. Click Host Aliases, then click New.
i. Enter the following:
Host Name: *
Port: 9082 (same as port number for MAXIMOUI2), Click OK.

4. To save the configuration, complete the following actions:
a. Click Save.
b. Check Synchronize changes with Nodes.
c. Click Save.
Creating data source providers for JMS stores
Set two data sources in the WebSphere console for use by the JMS resources
Note that each data source will require a unique schema, one will be used by the MEA instance, and the other by the Cluster. This is a WebSphere requirement that two message engines require unique schema names. As you add bus members, each member added will cause a unique message engine to be created. In this configuration there are two members, the MEA instance and the Cluster.

Since two schemas will be required for this configuration, and the first schema name will be the maximo schema, work with your DBA to create a second schema in the same database specifically for use by the second data source before proceeding with the steps below.

Note: The user that owns the second schema must be able to create tables.

1. Log in to the WebSphere console, and from the left pane, select Resources/JDBC Providers

2. On the JDBC providers screen, set the scope to be the cell and click "Apply"
This can be done by clearing all fields before clicking the apply button

3. Click the "new" button

4. In the General Properties, select your database type and provider type (i.e. oracle and oracle driver). In the implementation type dropdown select "XA data source", click next

5. In the name field, enter
oraclexa

6. In the classpath text box, enter (be sure to correct the path to reflect your oraclethin.jar path):
C:\maximo\applications\maximo\lib\oraclethin.jar

7. Click "apply" and save and synchronize with other nodes.
Creating the first data source
1. Navigate to your JDBC provider called oraclexa

2. Click the link on the right side of the screen called "data sources"

3. Click the "new" button

4. In the name field enter the value:
oraclexads

5. In the JNDI name field, enter the value:
jdbc/oraclexads

6. Select a data store helper class for your oracle version:
Example: Oracle 9i and prior data store helper

7. In the URL field, enter your JDBC URL (this can be found in your maximo.properties if you are not sure)
jdbc:oracle:thin:@server1:1521:maximo

8. Click apply, save and synchronize with other nodes
Creating your first authentication data entry
1. Navigate to your JDBC provider called oraclexa, then click data sources and select your data source called oraclexads

2. On the right side of the screen, under Related Items, click the link for "J2ee Connection Architecture Authentication data entries"

3. Click the "new" button

4. In the alias field, enter a value you would like to use: i.e. maximo

5. Enter the username and password used to connect to the database: i.e. maximo/maximo

6. Enter a Description that identifies this entry, click apply

7. Save and synchronize with other nodes

8. Navigate back to your data source called oraclexads

9. In the dropdown field for "Component managed authentication alias", select your data alias (i.e. maximo)

10. Click apply and save and synchronize with other nodes

11. Navigate to your data source again and click the test button at the top of the screen to test your data source

Once the test has succeeded, you can proceed to the next data source
Creating the second data source
1. Navigate to your JDBC provider oraclexa

2. Click the link on the right side of the screen called "data sources"

3. Click the "new" button

4. In the name field enter the value:
oraclexads2

5. In the JNDI name field, enter the value:
jdbc/oraclexads2

6. Select a data store helper class for your oracle version:
i.e. Oracle 9i and prior data store helper

7. In the URL field, enter your JDBC URL (this will be the URL to your new schema used for the second store)
jdbc:oracle:thin:@server1:1521:maximo2

8. Click apply, save and synchronize with other nodes
Creating your second authentication entry
1. Navigate to your JDBC provider called oraclexa, then click data sources and select your data source called oraclexads2

2. On the right side of the screen, under Related Items, click the link for "J2ee Connection Architecture Authentication data entries"

3. Click the "new" button

4. In the alias field, enter a value you would like to use: i.e. maximo2

5. Enter the username and password used to connect to the database: i.e. maximo/maximo

6. Enter a Description that identifies this entry, click apply

7. Save and synchronize with other nodes

8. Navigate back to your data source called oraclexads2

9. In the dropdown field for "Component managed authentication alias", select your data alias (i.e. maximo2)

10. Click apply and save and synchronize with other nodes

11. Navigate to your data source again and click the test button at the top of the screen to test your data source

Once the test has succeeded, you can proceed to the next section
Creating JMS resources for use in a clustered environment
Creating the JMS buses:
1. Log in to the WebSphere console and navigate in the left pane to Integration/buses

2. Click the "new" button to create a new bus

3. In the name field, enter "meajmsbus"

4. Deselect the "secure" checkbox

5. Change the "high message threshold" to 500,000 messages, click "apply"

6. Navigate again in the left pane to Integration/buses

7. Click the "new" button to create a second new bus

8. In the name field, enter "uijmsbus"

9. Deselect the "secure" checkbox

10. Change the "high message threshold" to 500,000 messages

11. Click "apply"
Adding members to the bus:

1. Navigate in the left pane to Integration/buses

2. Select the first bus created above called meajmsbus

3. Under "additional properties", select "bus members"

4. Click the "Add" button

5. Add the MAXIMOMEA server as a bus member by selecting that under the server section

6. In the data source JNDI name field, enter:
jdbc/oraclexads

7. Click Next, then click Finish

8. Navigate in the left pane to Integration/buses

9. Select the second bus created above called uijmsbus

10. Add the MAXIMOCLUSTER by selecting that under the cluster section

11. In the data source JNDI name field, enter:
jdbc/oraclexads2

12. Save and synchronize with other nodes.
Setting the data stores and authentication alias
1. Select the bus member (MEA instance) of your meajmsbus bus

2. from the list of message engines, select your message engine

3. Under "additional properties" click "data store"

4. In the data source JNDI name field, enter
jdbc/oraclexads

5. In the schema name field, enter your maximo schema name (i.e. maximo)

6. In the authentication alias dropdown, select the alias created for the data source above, click OK

7. Navigate back to your list of buses and select the uijmsbus

8. Select the bus member (Cluster) of your uijmsbus bus

9. From the list of message engines, select your message engine

10. Under "additional properties" click "data store"

11. In the data source JNDI name field, enter
jdbc/oraclexads2

12. In the schema name field, enter your second schema created above by your DBA (i.e. maximo2)

13. In the authentication alias dropdown, select the second alias created for this data source above

14. Click OK

15. Save and synchronize with other nodes
Creating bus destinations
1. Log in to the WebSphere console and navigate to Service Integration/buses

2. Select your bus meajmsbus

3. Under "Additional properties" click "destinations"

4. Click the "new" button

5. Set the destination type as "queue" and click next

6. In the identifier field, enter "cqinbdcls"

7. Assign the queue in the next screen to the MAXIMOMEA application server

8. Click next.

9. Then click finish

10. Repeat the steps above to create the sqinbdcls destination and assigning it to the
MAXIMOMEA application server

11. Navigate in the WebSphere console to Service Integration/buses

12. Select your bus uijmsbus

13. Under "Additional properties" click "destinations"

14. Click the "new" button

15. Set the destination type as "queue" and click next

16. In the identifier field, enter "sqoutbdcls"

17. Assign the queue in the next screen to the UI Cluster

18. Click next, then click finish

19. Navigate in the WebSphere console to each destination created above on both buses

20. For each destination above, set the "exception destination" to "none", then click Apply

21. Save and synchronize with other nodes
Creating MEA connection factories
1. Log in to the WebSphere console

2. Navigate in the left pane to Resources/JMS providers/default messaging

3. Set the scope to the cell and click apply, making sure node, cluster, and server fields are empty

4. Under "connection factories", select "JMS queue connection factory"

5. Click the "new" button

6. In the name field, enter "meaconfact"

7. In the JNDI name field, enter
jms/mro/int/qcf/intqcfmea

8. Select the bus meajmsbus from the dropdown

9. Click "apply" and save and synchronize with other nodes

10. Under "connection factories, select "JMS queue connection factory"

11. Click the "new" button

12. In the name field, enter "uiconfact"

13. In the JNDI name field, enter
jms/mro/int/qcf/intqcfui

14. Select the bus uijmsbus from the dropdown

15. Click "apply" and save and synchronize with other nodes
Creating JMS queues
Continuous inbound queue:
1. Log in to the WebSphere console and navigate to Resources/JMS providers/default messaging

2. Ensure that the scope is set to the Cell, and Under "destinations", click "jms queue"

3. Click the "new" button

4. Enter the name as "cqincls"

5. In the JNDI name field, enter "jms/mro/int/queues/cqincls

6. Select the meajmsbus as the bus for this queue

7. In the queue name field, enter the destination name for this as "cqinbdcls"

8. Click "OK"
Sequential inbound queue
1. Log in to the WebSphere console and navigate to Resources/JMS providers/default messaging

2. Under "destinations", click "jms queue"

3. Click the "new" button

4. Enter the name as "sqincls"

5. In the JNDI name field, enter "jms/mro/int/queues/sqincls

6. Select the meajmsbus as the bus for this queue

7. In the queue name field, enter the destination name for this as "sqinbdcls"

8. Click "OK"
Sequential inbound queue
1. Log in to the WebSphere console and navigate to Resources/JMS providers/default messaging

2. Under "destinations", click "jms queue"

3. Click the "new" button

4. Enter the name as "sqoutcls"

5. In the JNDI name field, enter "jms/mro/int/queues/sqoutcls

6. Select the uijmsbus as the bus for this queue

7. In the queue name field, enter the destination name for this as "sqoutbdcls"

8. Click "OK"

9. Save and synchronize with other nodes
Creating the JMS Activation Specification
1. Log in to the WebSphere console and navigate to Resources/JMS providers/default messaging

2. Ensure that the scope is set to the Cell

3. Under additional properties, click "jms activation specification"

4. Click the "new" button

5. In the name field, enter "meajmsactcls"

6. In the JNDI name field, enter "meajmsactcls"

7. In the "Destination JNDI name" field, enter "jms/mro/int/queues/cqincls"

8. Make sure the destination type is "queue"

9. Select your bus "meajmsbus" as the bus for this specification

10. Set Maximum batch size to 10

11. Set Maximo end points to 5

12. Click OK and save and synchronize with other nodes

13. Stop and Restart all IBM services
Build and deploy multiple EAR files from the same Maximo directory
You will need to build multiple ear file builds of Maximo where some of the files to be included in each ear file will be different from the next ear file, you do not need multiple instances of the Maximo installation folder.

For example, the User Interface (MAXIMOCLUSTER) application server requires one ear file that disables the MEA Inbound crontasks and the MEA application server requires an ear file that disables the MEA Outbound crontasks.

For each file that will be modified, making it different for one ear from the next, make a copy of that file and name it appropriately. An example of the files that would be unique to each ear file for the above scenario might look like this:

\maximo\applications\maximo\properties
maximo.properties
maximo.propertiesUI
maximo.propertiesMEA

\maximo\applications\maximo\META-INF\
application.xml
application.xmlUI
application.xmlMEA

maximo\applications\maximo\META-INF\
deployment-application.xml
deployment-application.xmlUI
deployment-application.xmlMEA

\maximo\applications\maximo\meajmsejb\ejbmodule\META-INF\
ibm-ejb-jar-bnd.xmi
ibm-ejb-jar-bnd.xmiUI
ibm-ejb-jar-bnd.xmiMEA

Where there are 3 copies of each file, one with the default name, the next named for the User Interface (Cluster) ear, and one named for the MEA ear.

In this scenario, for the creation of two different ear files you would make two copies of the file buildmaximoear.cmd and give them names such as the following:

buildmaximoear-UI.cmd
buildmaximoear-MEA.cmd

These would be the files you use to build your individual ear files.

These are the steps to change the new cmd files to build your unique ear files:

1. Edit the buildmaximoear-UI.cmd file,
a. At the top, enter the following shell commands:

copy /Y \maximo\applications\maximo\properties\maximo.propertiesUI \maximo\applications\maximo\properties\maximo.properties

copy /Y \maximo\applications\maximo\META-INF\application.xmlUI \maximo\applications\maximo\META-INF\application.xml

copy /Y maximo\applications\maximo\META-INF\deployment-application.xmlUI maximo\applications\maximo\META-INF\deployment-application.xml

copy /Y \maximo\applications\maximo\meajmsejb\ejbmodule\META-INF\ibm-ejb-jar-bnd.xmiMEA \maximo\applications\maximo\meajmsejb\ejbmodule\META-INF\ibm-ejb-jar-bnd.xmi

b. Change the EAR_FILENAME variable to reflect the unique ear file name for the UI and MEA, for example:

set EAR_FILENAME=maximoUI.ear

2. You can then run this build scripts to build the ear files. In this case, the resulting ear file will be named maximoUI.ear.
3. Repeat the above steps to create the maximoMEA.ear as well, changing references for UI to MEA.
Prepare and Deploy the UI application server
Since we want all MEA Inbound crontasks to run in the MAXIMOMEA instance, they are listed here as DONOTRUN for the UI application (MAXIMOCLUSTER).

1. Edit the maximo.propertiesUI file and add the donotrun option as below:
mxe.crontask.donotrun=JMSQSEQCONSUMER.SEQQIN,IFACETABLECONSUMER.IFACEIN,BBcron.BBCRON1,......

Note: Use of the above donotrun option is recommended over the target-enabled option because the donotrun option is Cluster-aware. Therefore, if the crontask is running in one application server, and that application server is shut down, another application server can take over running the crontasks.

Also, be sure to go through your list of crontasks and note each instance in the correct case and add it to the mxe.crontask.donotrun parameter in the maximo.propertiesUI, each separated by a comma

2. Build the maximoUI.ear file – using the buildmaximoear-UI.cmd.

3. Now that you have created and configured the MAXIMOCLUSTER, you should now deploy your maximoUI.ear (enterprise application - EAR) to the MAXIMOCLUSTER.

Note: When mapping modules to servers, make sure you select both MAXIMOCLUSTER and the webserver1 as the web server:
WebSphere:cell-ctgCell01,server=MAXIMOCLUSTER
WebSphere:cell-ctgCell01,node=ctgNode01,server=webserver1

4. Also, when mapping virtual hosts to web modules, use the MAXIMOCLUSTER_host virtual host.

5. Lastly, start/restart the MAXIMOCLUSTER server.

6. To access the cluster, open HTTP://<node name>:<port>/maximo where <port> is the port number of the IBM HTTP server (80)
Prepare and Deploy the MEA application
For the MAXIMOMEA application instance, edit the following files and uncomment the meajmsejb.jar:

1. Locate and edit this file under \maximo\applications\maximo\META-INF\application.xmlMEA
a. Uncomment the following (they may already be in the state below):
<!-- JMS MDB is not deployed by default -->
<module>
<ejb>/meajmsejb/ejbmodule</ejb>
</module>

2. Locate and edit the file under \maximo\applications\maximo\META-INF\deployment-application.xmlMEA
a. Uncomment the following (they may already be in the state below):
<!-- JMS MDB is not deployed by default -->
<module id="EjbModule_1077124925237">
<ejb>meajmsejb.jar</ejb>
</module>

3. The activation specification JNDI name is not the default (i.e. meajmsact) so you will need to edit the following file, and change the value as below to your new JNDI name:
\maximo\applications\maximo\meajmsejb\ejbmodule\META-INF\ibm-ejb-jar-bnd.xmiMEA
a. Locate the following line and change to:
<ejbBindings xmi:type="com.ibm.ejs.models.base.bindings.ejbbnd:MessageDrivenBeanBinding" xmi:id="MessageDrivenBeanBinding_1" activationSpecJndiName="meajmsactcls">

4. Edit the maximo.propertiesMEA file and set mxe.name to a unique value such as MAXIMOMEA and save
a. Edit the line so that all crontasks except for the JMSQSEQCONSUMER.SEQQOUT crontask will run on this server:
mxe.crontask.donotrun=JMSQSEQCONSUMER.SEQQOUT
(This will be the only crontask entry because this is the only crontask that we do not want to run.)

5. Build the maximoMEA.ear file – using the buildmaximoear-MEA.cmd.

6. Now that you have created and configured the MAXIMOMEA application server, you should now build and deploy your maximoMEA.ear (enterprise application - EAR) to the MAXIMOMEA application server.

Note: When mapping modules to servers, make sure you select both MXServer and the webserver1 as the web server:
WebSphere:cell-ctgCell01,server=MAXIMOMEA
WebSphere:cell-ctgCell01,node=ctgNode01,server=webserver1


7. Also, when mapping virtual hosts to web modules, use the MAXIMO_host virtual host.

8. Lastly, start/restart the MAXIMOMEA application server.
Changes required in Maximo

1. Launch the Maximo application and log in:

http://host:port/maximo

2. Navigate to configuration/cron task setup

3. Bring up the JMSQSEQCONSUMER crontask

4. For the SEQQIN instance, change the queue name to match your inbound sequential queue name:

jms/mro/int/queues/sqincls

5. For the SEQQOUT instance, change the queue name to match your outbound sequential queue name:

jms/mro/int/queues/sqoutcls

6. Save your changes.

7. Next, navigate to the Integration/External Systems application

8. Select any external system and then from the action menu, select add/modify queues

9. Create your three new queues with the following values:

Continuous inbound queue:
Queue JNDI name: jms/mro/int/queues/cqincls
Queue Connection Factory: jms/mro/int/qcf/intqcfmea
Sequential: NO
Inbound: Yes
Maximum Try count: 0

Sequential inbound queue:
Queue JNDI name: jms/mro/int/queues/sqincls
Queue Connection Factory: jms/mro/int/qcf/intqcfmea
Sequential: Yes
Inbound: Yes
Maximum Try count: 0

Sequential outbound queue:
Queue JNDI name: jms/mro/int/queues/sqoutcls
Queue Connection Factory: jms/mro/int/qcf/intqcfui
Sequential: Yes
Inbound: NO
Maximum Try count: 0

10. You will then need to bring up each external system and change the queue names associated with each system in the top right side of the screen to match those created above.

11. Save your changes.

Deploying web services:

When deploying web services, you will need to set up the web service administration URL and port to point to the MAXIMOMEA application server IP address and port.
When sending transactions to these interfaces, you will need to point your web service client to the IP address and port of the MAXIMOMEA application server IP address and port, not the cluster address for the UI instances.

Important note:

Importing data can only be performed while logged into the MEA instance where the Message Driven Bean is deployed. Exporting data can only be performed while logged into one of the UI cluster members.