Sunday, 16 July 2017

ilog.rules.teamserver.model.IlrConnectException Caused by: java.lang.NullPointerException

As one of my many spinning threads, I've been tinkering with the migration of an IBM Operational Decision Manager (ODM) environment from version 8.0 ( circa 2012 ) to version 8.9 ( circa 2017 ).

In part, this involves running some SQL scripts to migrate the old data to the new environment.

This is especially relevant for the Decision Center, which is the Rules authoring environment, aka the Source Code Management (SCM) system-of-record.

The Decision Center, also known as the Team Server ( reflecting the product's heritage as iLog JRules ) or Rule Team Server or RTS, is based upon a database.

Therefore, the first step is to BACKUP the existing database ( RTSDB, in my case ) from the old/source system.

One benefit of the migration is that it's effectively side-by-side, meaning that you leave the old source system alone, and build a new, parallel environment into which the data ( Rules etc. ) is restored.

In my case, I'm using IBM DB2, but other databases are available.

The process is documented here: -

and here: -

and involves running a pair of Ant scripts against the existing database schema ( in my case, that's db2user1 ) resulting in a pair of SQL scripts that can then be executed against a new database schema ( in my case, that's db2user2 ) to migrate the roles AND data from one to t'other.

I was quite obviously doing something wrong, as I kept seeing exceptions such as: -

Caused by: java.lang.NullPointerException

in the Decision Center logs post migration.

It was, however, a PEBKAC - I was obviously doing it wrong.

Once I changed my approach: -

Restore backup of RTSDB - as db2inst1

db2 restore database RTSDB from /tmp

Connect as the instance owner - as db2inst1

db2 connect to RTSDB user db2inst1 using passw0rd

Grant the new schema - db2user2 - rights to the database - as db2inst1

db2 grant dbadm on database to user db2user2

Terminate the DB2 session - as db2inst1

db2 terminate

Connect as the new schema - as db2inst1

db2 connect to RTSDB user db2user2 using passw0rd

Run the provided script to create the necessary ODM tables, indices etc. - as db2inst1

db2 -tvf ~/rule-team-server.sql

- For the record, this SQL script is generated when one first logs into the Decision Center, so I just kept a copy :-)

Terminate the DB2 session - as db2inst1

db2 terminate

Start the Decision Centre cluster - as wasadmin

AdminControl.invoke('WebSphere:name=DecisionCenterCluster,process=dmgr,platform=common,node=Dmgr,version=,type=Cluster,mbeanIdentifier=DecisionCenterCluster,cell=odmCell01,spec=1.0', 'start')

Log into the Decision Centre - as wasadmin

Follow the prompts to complete basic setup - extensions, locale ( I'm using en_GB as I'm a Brit ) etc. *BUT* avoid executing the generated SQL ( this has already been done ), as per this: -

At this stage, we've got a clean Decision Center database, ready to receive BUT with no roles or data migrated from the old environment: -

Set variables - as wasadmin

export ANT_HOME=/opt/ibm/ODM89/shared/tools/ant
export PATH=$PATH:/opt/ibm/ODM89/shared/tools/ant/bin
export JAVA_HOME=/opt/ibm/ODM89/jdk/jre

Run the Ant scripts to extract the roles and data for the old db2user1 schema - as wasadmin

cd /opt/ibm/ODM89/teamserver/bin

ant -DoldDatabaseSchemaName=db2user1 -Dserver.url= -DrtsAdmin.login=wasadmin -DrtsAdmin.password=passw0rd -DoutputFile=/tmp/migrate_roles.sql gen-migration80-role

ant -DoldDatabaseSchemaName=db2user1 -Dserver.url= -DdatasourceName=jdbc/ilogDataSource -DrtsAdmin.login=wasadmin -DrtsAdmin.password=passw0rd -DoutputFile=/tmp/migrate_data.sql gen-migration80-script

This results in a pair of SQL scripts: -

-rw-r--r-- 1 wasadmin wasadmins 79746 Jul 16 16:25 /tmp/migrate_data.sql
-rw-r--r-- 1 wasadmin wasadmins  9552 Jul 16 16:24 /tmp/migrate_roles.sql

Connect as the new schema - as db2inst1

db2 connect to RTSDB user db2user2 using passw0rd

Execute migration scripts - as db2inst1

db2 -tvf /tmp/migrate_roles.sql
db2 -tvf /tmp/migrate_data.sql

Terminate the DB2 session - as db2inst1

db2 terminate

Log into the Decision Centre - as wasadmin

C'est voila, we have a NEW ODM 8.9 Decision Centre with the project that was previously created on the OLD ODM 8.0 Decision Centre: -

No comments: