Thursday, April 25, 2013

Migrating the BAM objects across environments with the ANT script – Oracle BAM 11g

This post explains how to use the ANT script to migrate the BAM objects across the environments.The script can be run remotely from the client machine or from the server machine.
  • Create a folder BAMConfig and create two sub folders BAMObjects and config inside the BAMConfig folder
  • Copy the BAMICommandConfig.xml from $ORACLE_HOME/bam/config folder of the server to the config folder created in the above step.
  • Add the default user name and the password to the BAMICommandConfig.xml file
           <ICommand_Default_User_Name>weblogic</ICommand_Default_User_Name>
           <ICommand_Default_Password>hiyEbs0vwXPQrKh8yE7z3f7JVNhmLLEe+cR3bansiPc=</ICommand_Default_Password>

         Also verify the ADCServerPort - the BAM Server http listening port and   ADCServerName -  BAM Server host name properties.

Content of the configuration file:

<?xml version="1.0" encoding="UTF-8"?><BAMICommand>
<ADCServerPort>9001</ADCServerPort>
<ADCServerName>BAM Server hostname</ADCServerName>
<ICommand_Default_User_Name>weblogic</ICommand_Default_User_Name>
<ICommand_Default_Password>hiyEbs0vwXPQrKh8yE7z3f7JVNhmLLEe+cR3bansiPc=</ICommand_Default_Password>
<Communication_Protocol>t3</Communication_Protocol>
<SensorFactory>oracle.bam.common.statistics.noop.SensorFactoryImpl</SensorFactory>
<GenericSatelliteChannelName>invm:topic/oracle.bam.messaging.systemobjectnotification</GenericSatelliteChannelName>
</BAMICommand>

Default password should be encrypted else you will be receiving “ICommandEngine.MissingCredentials” error.

To encrypt the password configure the BAMICommandConfig.xml file in the $ORACLE_HOME/bam/config folder with the plain text password and run any standard icommand from the server (e.g $ORACLE_HOME/bam/bin/icommand -cmd export -type dataobject -name SampleDO -file C:\temp\SampleDO.xml) that will encrypt the password.
  • Create Export_BAM_Objects.xml file with the BAM export commands and place the same in BAMConfig folder created in the above step, the contents of the file look like below
<OracleBAMCommands>
   <!--import dataobjects-->
    <Export name="/Albin/BAMWebservice" type="dataobject" file="$BAM_PROJ_HOME$/BAMWebservice.xml"/>
    <Export name="/SampleDO" type="dataobject" file="$BAM_PROJ_HOME$/SampleDO.xml"/>
</OracleBAMCommands>
Configure the required export commands (exporting different type of objects) into this file.
  • Create Import_BAM_Objects.xml file with the BAM import commands and place the same in BAMConfig folder created in the above step, the contents of the file look like below
<OracleBAMCommands>
   <!--import dataobjects-->
   <Import file="$BAM_PROJ_HOME$/BAMWebservice.xml"/>
</OracleBAMCommands>
Configure the required import commands into this file.
  • Create the BAMBuild.xml file with the following contents and place the same in the BAMConfig folder created in the above step.
<project name="BAMMigrationProject" basedir="." default="config">
   <!--import the property file-->
   <property environment="env"/>
   <property name="src.dir" value="."/>
   <property name="proj.home" value="${env.BAM_PROJ_HOME}"/>
   <property name="oracle.home" value="${env.ORACLE_HOME}"/>
   <property name="oracle.common.home" value="${env.ORACLE_COMMON_HOME}"/>
   <property name="bam.core.lib.dir" value="${env.ORACLE_HOME}/bam/modules/oracle.bam_11.1.1"/>
   <property name="bam.tp.lib.dir" value="${env.ORACLE_HOME}/bam/modules/oracle.bam.thirdparty_11.1.1"/>
   <property name="dms.lib.dir" value="${env.ORACLE_COMMON_HOME}/modules/oracle.dms_11.1.1"/>
   <!--BAM Classpath required by icommand application-->
   <path id="bamClasspath">
      <fileset file="${bam.core.lib.dir}/oracle-bam-icommand.jar"/>
      <fileset file="${bam.core.lib.dir}/oracle-bam-common.jar"/>
      <fileset file="${bam.core.lib.dir}/oracle-bam-adc-ejb.jar"/>
      <fileset file="${dms.lib.dir}/dms.jar"/>
      <fileset file="${bam.tp.lib.dir}/jgroups-core.jar"/>
      <fileset file="${bam.tp.lib.dir}/xstream-1.3.1.jar"/>
      <fileset file="${bam.tp.lib.dir}/commons-codec-1.3.jar"/>
      <fileset file="${oracle.home}/../wlserver_10.3/server/lib/weblogic.jar"/>
      <fileset file="${oracle.common.home}/modules/org.jaxen_1.1.1.jar"/>
   </path>
   <!--export BAM DOs through icommand-->
   <target name="export" description="Export BAM dataobjects and reports" depends="config">
    <delete dir="${basedir}/BAMObjects" includeemptydirs="true" includes="*/**"></delete>
      <java classname="oracle.bam.icommand.Application" fork="true" dir="${src.dir}" classpathref="bamClasspath">
         <sysproperty key="oracle.bam.debug" value="true"/>
         <arg value="-CmdFile"/>
         <arg value="${basedir}/Export_BAM_Objects.xml"/>
      </java>
   </target>
   <!--import BAM DOs through icommand-->
   <target name="import" description="Import BAM dataobjects and reports" depends="config">
      <java classname="oracle.bam.icommand.Application" fork="true" dir="${src.dir}" classpathref="bamClasspath">
         <sysproperty key="oracle.bam.debug" value="true"/>
         <arg value="-CmdFile"/>
         <arg value="${basedir}/Import_BAM_Objects.xml"/>
      </java>
   </target>
   <!--Modify bam icommand files-->
   <target name="config">
       <!--replace $project.home$ with the actual project directory inside the command file-->
      <replace file="Export_BAM_Objects.xml" token="$BAM_PROJ_HOME$" value="${basedir}/BAMObjects"/>
      <replace file="Import_BAM_Objects.xml" token="$BAM_PROJ_HOME$" value="${basedir}/BAMObjects"/>
   </target>
</project>
  • To run the scripts from the server copy the BAMConfig folder with all the contents to the server.Set the environment variables ORACLE_HOME and ORACLE_COMMON_HOME(e.gORACLE_HOME=/oracle/Middleware/Oracle_SOA1;export ORACLE_HOME;ORACLE_COMMON_HOME=oracle/Middleware/oracle_common;export ORACLE_COMMON_HOME) and also set the PATH to ANT(e.g export PATH=$PATH:$ORACLE_HOME/../modules/org.apache.ant_1.7.1/bin)
         Execute the ant scripts
          ant –f BAMBuild.xml export

        The objects will be exported based on the commands in the Export_BAM_Objects.xml as an xml file   to the BAMObjects folder
         ant –f BAMBuild.xml import

           The xml file contents will be imported to BAM based on the commands in the Import_BAM_Objects.xml
  • To run the script from the client machine the JDeveloper with the same version as the BAM server should be installed.Set the ORACLE_HOME (e.g C:\EnvSetup\MiddlewareBlog\jdeveloper) and ORACLE_COMMON_HOME(e.g C:\EnvSetup\MiddlewareBlog\oracle_common) environment variables and also set the PATH to ANT
        Copy the commons-codec-1.3.jar file from the server location   ${env.ORACLE_HOME}/bam/modules/oracle.bam.thirdparty_11.1.1 to the <JDEV_HOME>\ jdeveloper\bam\modules\oracle.bam.thirdparty_11.1.1

########

Recovering the BPEL instances from Java For all faulted invoke

Written By Archit Bhardwaj

There are three types of Recoverable messages in BPEL Recovery console
  • 1.       Invoke
  • 2.       Callback
  • 3.       Activity
There are five message states for each type
1.       Undelivered
2.       Resolved
3.       Delivered
4.       Cancelled
5.       Exhausted

The Classes mentioned below are used only to recover messages in Undelivered Message state.

·         FaultRecoveryForInvoke.java- It recovers undelivered recoverable Invoke instances based on Composite Name.
·         FaultRecoveryForInvokeAll.java- It recovers all the Undelivered recoverable Invoke instances.
·         FaultRecoveryForCallback.java- It recovers undelivered recoverable Callback instances based on Composite Name.
·         FaultRecoveryForCallbackAll.java- It recovers all the Undelivered recoverable Callback instances.
The state set for undelivered instances is 0 in the code.

  
 For recovering messages from other states ,the filter.setState(x) can be changed to :-
0 for Undelivered
1 for Resolved
2 for delivered
3 for Cancelled
4 for exhausted
The jar files used for the code are :-
 
Code For Fault Recovery For Invoke
***************************************************************************

package Recovery.client;

import java.util.Hashtable;
import java.util.List;
import java.util.ListIterator;
import java.util.Scanner;
import javax.naming.Context;
import oracle.soa.management.facade.Locator;
import oracle.soa.management.facade.LocatorFactory;
import oracle.soa.management.facade.bpel.BPELServiceEngine;
import oracle.soa.management.facade.bpm.BPMInvokeMessage;
import oracle.soa.management.util.MessageFilter;

public class FaultRecoveryForInvokeAll{
    private Locator locator = null;
    private BPELServiceEngine mBPELServiceEngine;
     
   
    public FaultRecoveryForInvokeAll(){
        System.out.println("Inside Constructor");
        locator = this.getLocator();
   
            try{
                System.out.println("Try Block of Constructor");
                mBPELServiceEngine=(BPELServiceEngine)locator.getServiceEngine(Locator.SE_BPEL);
            }
            catch (Exception e){
                e.printStackTrace();
            }
    }
   
   
      // Setting up connection properties
     
    public Hashtable getJndiProps(){
      System.out.println("Inside getJndiProps");
        Hashtable jndiProps = new Hashtable();
        jndiProps.put(Context.PROVIDER_URL,"t3://manish:7501/soa-infra");
        jndiProps.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
        jndiProps.put(Context.SECURITY_PRINCIPAL, "manish");
        jndiProps.put(Context.SECURITY_CREDENTIALS, "********");
           jndiProps.put("dedicated.connection", "true");
      System.out.println("Connection Successfull");
        return jndiProps;
    }
     
      //Creating the locator to set up the connection to the server
     
    public Locator getLocator(){
      System.out.println("Inside  getLocator"); 
      try{
            System.out.println("Try Block of getLocator");
            return LocatorFactory.createLocator(getJndiProps());
        }
      catch(Exception e){
            e.printStackTrace();
      }
        return null;
    }
     
      // Reovering all recoverable faults listed under invoke and having the state Undelivered as on BPEL Recovery Console
     
    public void recoverFaults(){
      System.out.println("Inside  recoverFaults");
      try{
            int i=1;
            System.out.println("Try Block of recoverFaults");
            MessageFilter filter=new MessageFilter();
                 
          
            //filters can be set according to desired criteria
          
            filter.setState(0); 
                             
            //Getting all recoverable messages
            System.out.println("Getting Recoverable messages");
            List<BPMInvokeMessage> recoverable=mBPELServiceEngine.getInvokeMessages(filter);
            ListIterator it=recoverable.listIterator();
            while(it.hasNext()){
                  System.out.println("Record number----->>>"+i+"\t"+it.next());
                  i++;
            }
            System.out.println("total number of records-------->>>>>"+recoverable.size());
           
            //Recovering all recoverable messages
            mBPELServiceEngine.recoverInvokeMessages(recoverable);
            System.out.println("Messages Retried in one chance");
        }
      
        catch (Exception e){
            e.printStackTrace();
      }
    }
    public static void main(String[] args){
      // calling the method recoverFaults
       FaultRecoveryForInvokeAll faultRecovery = new FaultRecoveryForInvokeAll();
       faultRecovery.recoverFaults();
    }
}
************************************************************************


########