Friday, 19 June 2015

IBM Integration Bus - Developing my interest ( and an SOA / ESB solution )

I have blogged about IBM Integration Bus (IIB) a fair bit recently, as I develop my expertise.

Most recently, I wrote: -


specifically as I'm busy developing an integration demonstration for my client, comprising IBM Business Process Manager, IBM Integration Bus, IBM WebSphere MQ and IBM DB2.

Today's post describes my experience creating a really really simple flow in IIB.

In the first instance, this flow represents a service that exposes a function from my mythical System of Record, actually a DB2 database table called EMPLOYEE.

My objective is to have this service running inside my Enterprise Service Bus (ESB), which is being delivered by IIB, and be callable in an asynchronous AND synchronous manner.

Initially, my service ( flow ) is only exposed via WebSphere MQ.

In principle, I have an Integration Node, called IB9NODE, which hosts an Integration Server, called IIB9, and a Queue Manager, called IB9QMGR.

The Queue Manager hosts a pair of Queues, CUSTOMER.INPUT and CUSTOMER.OUTPUT.

I will script the definition of the IIB components and the Queue Manager at a later date, to start with, I created them using the IIB Toolkit ( I'm using IIB 9 which has an automatic dependency on an underlying Queue Manager ).

Having set up IIB and the Queue Manager, I created my Queues: -

defineQueues.msc 

DEFINE QLOCAL(CUSTOMER.INPUT)
DEFINE QLOCAL(CUSTOMER.OUTPUT)


runmqsc IB9QMGR < defineQueues.msc 

5724-H72 (C) Copyright IBM Corp. 1994, 2014.
Starting MQSC for queue manager IB9QMGR.


     1 : DEFINE QLOCAL(CUSTOMER.INPUT)
AMQ8006: WebSphere MQ queue created.
     2 : DEFINE QLOCAL(CUSTOMER.OUTPUT)
AMQ8006: WebSphere MQ queue created.
       : 
2 MQSC commands read.
No commands have a syntax error.
All valid MQSC commands were processed.

My flow effectively joins the two Queues together, by way of a Compute Node. This Compute Node uses a Database Service, which does the clever stuff i.e. connecting to DB2 via ODBC and exposing one or more SQL operations - I'm "merely" doing a SELECT.

So, logically the client, be that MQ, the IIB Toolkit or, in the future, a BPEL flow hosted by IBM BPM, puts a message onto the CUSTOMER.INPUT Queue, the flow does the heavy lifting to retrieve the selected row from DB2, and places the output onto the CUSTOMER.OUTPUT Queue.

This is what my flow looks like: -

My Input Node is configured to use the CUSTOMER.INPUT Queue: -

which is configured parse a message in the JSON format: -


Here's an example message in JSON format: -

{"EmployeeID":"000100"}

My Compute Node is configured to bind to the SAMPLE ODBC datasource ( see my previous post re ODBC fun and games ): -


The Compute Node contains some basic generated ESQL, which I've subtly modified: -

PATH DatabaseService.EMPLOYEE_OPS_GROUP, DatabaseService1.EMPLOYEE_OPS_GROUP;

CREATE COMPUTE MODULE customerService_Compute
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN

DECLARE dbResultSet ROW;
DECLARE dbResultSetRef REFERENCE TO dbResultSet;

DECLARE rowRef REFERENCE TO dbResultSetRef.row;

DECLARE empno CHARACTER;
SET empno = InputRoot.JSON.Data.EmployeeID;
CALL retrieveEmployee(empno, dbResultSetRef);

SET OutputRoot.XMLNSC.EMPLOYEE = rowRef;
 
RETURN TRUE;
END;

CREATE PROCEDURE CopyMessageHeaders() BEGIN
DECLARE I INTEGER 1;
DECLARE J INTEGER;
SET J = CARDINALITY(InputRoot.*[]);
WHILE I < J DO
SET OutputRoot.*[I] = InputRoot.*[I];
SET I = I + 1;
END WHILE;
END;

CREATE PROCEDURE CopyEntireMessage() BEGIN
SET OutputRoot = InputRoot;
END;
END MODULE;


I've highlighted the code that I added to the generated ESQL.

Of that, this is what the IIB Toolkit gave me when I created the Database Service against the SAMPLE database: -

DECLARE dbResultSet ROW;
DECLARE dbResultSetRef REFERENCE TO dbResultSet;

DECLARE rowRef REFERENCE TO dbResultSetRef.row;

CALL retrieveEmployee(empno, dbResultSetRef);


and this is what I added: -

DECLARE empno CHARACTER;
SET empno = InputRoot.JSON.Data.EmployeeID;
SET OutputRoot.XMLNSC.EMPLOYEE = rowRef;


The first line: -

DECLARE empno CHARACTER;

sets up a variable called, imaginatively, empno as type CHARACTER.

The second line: -

SET empno = InputRoot.JSON.Data.EmployeeID;

assigns the value of the JSON object EmployeeID to the empno variable - the InputRoot "variable" relates to the entire incoming MQ message, and uses the JSON parser to retrieve the EmployeeID object.

The third line: -

SET OutputRoot.XMLNSC.EMPLOYEE = rowRef;

does almost the reverse - it assigns the value of rowRef ( as retrieved by the Database Service and stored as a row in a Result Set ) to the OutputRoot "variable", using the XMLNSC parser to create the EMPLOYEE XML message.

It's this EMPLOYEE message that is put onto the outgoing CUSTOMER.OUTPUT Queue.

Finally, here's me testing the flow, using the MQ samples amqsput and amqsget : -

Input

/opt/mqm/samp/bin/amqsput CUSTOMER.INPUT IB9QMGR

Sample AMQSPUT0 start
target queue is CUSTOMER.INPUT
{"EmployeeID":"000100"}
{"EmployeeID":"000200"}


Output

/opt/mqm/samp/bin/amqsget CUSTOMER.OUTPUT IB9QMGR

Sample AMQSGET0 start
message <<EMPLOYEE><row><EMPNO>000100</EMPNO><FIRSTNME>THEODORE</FIRSTNME><LASTNAME>SPENSER</LASTNAME></row></EMPLOYEE>>
message <<EMPLOYEE><row><EMPNO>000200</EMPNO><FIRSTNME>DAVID</FIRSTNME><LASTNAME>BROWN</LASTNAME></row></EMPLOYEE>>


I then went a little further, and changed my Compute Node to return a JSON object: -

SET OutputRoot.JSON.Data.Employee = rowRef;

Having redeployed the flow to the Integration Server ( on the Integration Node ) from the Toolkit, I re-tested it using the MQ samples: -

/opt/mqm/samp/bin/amqsput CUSTOMER.INPUT IB9QMGR

Sample AMQSPUT0 start
target queue is CUSTOMER.INPUT
{"EmployeeID":"000100"}
{"EmployeeID":"000200"}

/opt/mqm/samp/bin/amqsget CUSTOMER.OUTPUT IB9QMGR

Sample AMQSGET0 start
message <{"Employee":{"row":{"EMPNO":"000100","FIRSTNME":"THEODORE","LASTNAME":"SPENSER"}}}>
message <{"Employee":{"row":{"EMPNO":"000200","FIRSTNME":"DAVID","LASTNAME":"BROWN"}}}>

So, that's it for now ....

Next I need to create my "client" which will be an SCA module hosted on IBM BPM Advanced ( aka Process Server ) using a BPEL flow, which will use JMS to post the input message onto the CUSTOMER.INPUT Queue, and monitor the CUSTOMER.OUTPUT Queue for the resulting message.

I'll create the SCA module using IBM Integration Designer, and leverage the built-in Process Server integrated test environment.

When time allows, I'll then create a BPMN Process Application ( using Process Designer ) which will again be hosted on a BPM Advanced Process Server. This BPMN application will provide the user interface, where the end-user ( perhaps a service agent in a call centre or perhaps an employee via a self-service mobile application ) would enter the required employee ID and get back the resulting record.

From little acorns do large oak trees grow ......

For reference, we have this: -



and, purely for the record, there's a nice video here: -



Thursday, 18 June 2015

Webcast replay: Debugging top ten WebSphere Message Broker V7.x/8.x problems with databases on Windows/UNIXes

This helped me out no end in the past 23 hours or so: -


This WSTE will discuss the latest top 10 WMB problems with the databases. It will focus on troubleshooting and debugging techniques involved in resolving the problems that may be extended to other problems of similar nature.

IBM Integration Bus, ODBC and DB2

Following on from my previous post: -


having set up DB2 and ODBC on my Red Hat box, I then configured IBM Integration Bus (IIB) to utilise it.

Firstly, I tested the connectivity from IIB: -

mqsicvp IB9NODE

BIP8873I: Starting the component verification for component 'IB9NODE'. 
BIP8876I: Starting the environment verification for component 'IB9NODE'. 
BIP8894I: Verification passed for 'Registry'. 
BIP8894I: Verification passed for 'MQSI_REGISTRY'. 
BIP8894I: Verification passed for 'Java Version - 1.7.0 IBM Linux build pxa6470sr8fp10-20141219_01(SR8 FP10)
BIP8894I: Verification passed for 'MQSI_FILEPATH'. 
BIP8878I: The environment verification for component 'IB9NODE' has finished successfully. 
BIP8882I: Starting the WebSphere MQ verification for component 'IB9NODE'. 
BIP8886I: Verification passed for queue 'SYSTEM.BROKER.ADMIN.QUEUE' on queue manager 'IB9QMGR'. 
BIP8886I: Verification passed for queue 'SYSTEM.BROKER.EXECUTIONGROUP.QUEUE' on queue manager 'IB9QMGR'. 
BIP8886I: Verification passed for queue 'SYSTEM.BROKER.EXECUTIONGROUP.REPLY' on queue manager 'IB9QMGR'. 
BIP8884I: The WebSphere MQ verification for component 'IB9NODE' has finished successfully. 
BIP8290I: Verification passed for the ODBC environment. 
BIP8270I: Connected to Datasource 'SAMPLE' as user 'db2inst1'. The datasource platform is 'DB2/LINUXX8664', version '10.05.0005'. 
BIP8275I: Verification passed for User Datasource 'SAMPLE'. 
BIP8292I: '1' User data sources were not verified, because they do not have mqsisetdbparms credentials. 
BIP8874I: The component verification for 'IB9NODE' has finished successfully. 
BIP8071I: Successful command completion. 

and: -

mqsicvp IB9NODE -n SAMPLE

BIP8290I: Verification passed for the ODBC environment. 

BIP8270I: Connected to Datasource 'SAMPLE' as user 'db2inst1'. The datasource platform is 'DB2/LINUXX8664', version '10.05.0005'. 
===========================
databaseProviderVersion      = 10.05.0005
driverVersion                = 10.05.0005
driverOdbcVersion            = 03.51
driverManagerVersion         = 03.52.0002.0002
driverManagerOdbcVersion     = 03.52
databaseProviderName         = DB2/LINUXX8664
datasourceServerName         = db2inst1
databaseName                 = SAMPLE
odbcDatasourceName           = SAMPLE
driverName                   = libdb2.a
supportsStoredProcedures     = Yes

...
BIP8071I: Successful command completion. 

Now, purely for the record, I discovered that IIB "stores" it's ODBC configuration here: -

/var/mqsi/registry/IB9NODE/CurrentVersion/DSN/

As an example, when I registered the DSN ( Data Source Name ) for IIB: -

mqsisetdbparms IB9NODE -n SAMPLE -u db2inst1 -p passw0rd

this is what I get: -

cat /var/mqsi/registry/IB9NODE/CurrentVersion/DSN/SAMPLE/UserId

db2inst1

cat /var/mqsi/registry/IB9NODE/CurrentVersion/DSN/SAMPLE/Password 

8f30eede9d43eead9934a99ddb46bff9

I tell you this purely because I spent quite a while pulling my hair out, whilst I was trying to resolve an IIB > ODBC > DB2 exception, as evidenced in the IIB logs

cat /var/log/user.log 

...
Jun 18 11:28:21 bpmdemo IIB[80541]: IBM Integration Bus v9002 (IB9NODE.IIB9) [Thread 92667] (Msg 2/7) BIP2230E: Error detected whilst processing a message in node 'customerService.Compute'.
Jun 18 11:28:21 bpmdemo IIB[80541]: IBM Integration Bus v9002 (IB9NODE.IIB9) [Thread 92667] (Msg 3/7) BIP2488E:  (.customerService_Compute.Main, 6.3) Error detected whilst executing the SQL statement 'retrieveEmployee(dbResultSetRef);'.
Jun 18 11:28:21 bpmdemo IIB[80541]: IBM Integration Bus v9002 (IB9NODE.IIB9) [Thread 92667] (Msg 4/7) BIP2934E: Error detected whilst executing the function or procedure 'retrieveEmployee'.
Jun 18 11:28:21 bpmdemo IIB[80541]: IBM Integration Bus v9002 (IB9NODE.IIB9) [Thread 92667] (Msg 5/7) BIP2488E:  (DatabaseService.EMPLOYEE_OPS_GROUP.retrieveEmployee, 3.2) Error detected whilst executing the SQL statement 'SET dbResultSetRef.row[ ] = SPECIFICPASSTHRU('SELECT EMPNO, FIRSTNME, LASTNAME, MIDINIT FROM DB2INST1.EMPLOYEE', Database.SAMPLE);'.
Jun 18 11:28:21 bpmdemo IIB[80541]: IBM Integration Bus v9002 (IB9NODE.IIB9) [Thread 92667] (Msg 6/7) BIP2393E: Database error: ODBC return code '-1' from data source '' using ODBC driver manager '/opt/ibm/IE02/2.0.1/lib/libodbcinterface.so'.
Jun 18 11:28:21 bpmdemo IIB[80541]: IBM Integration Bus v9002 (IB9NODE.IIB9) [Thread 92667] (Msg 7/7) BIP2322E: Database error: SQL State '08001'; Native Error Code '-1013'; Error Text '[unixODBC][IBM][CLI Driver] SQL1013N  The database alias name or database name " " could not be found.  SQLSTATE=42705 '.
Jun 18 11:28:22 bpmdemo IIB[80541]: IBM Integration Bus v9002 (IB9NODE.IIB9) [Thread 92667] (Msg 1/1) BIP2648E: Message backed out to a queue; node 'customerService.Input'.

...

Note - As per this post - IBM Integration Bus - Oh, that's where the logs are hiding ... - I have forced rsyslog to locate the IIB logs in /var/log/user.log

The solution ?

The Compute Node that I was using inside my Message Flow .... yes, that wasn't configured to actually use the datasource that I'd spent ages creating :-)


Once I fixed that, it all started working :-)

But that's another post for another day .....

Ah, ODBC, it's been a while

Now I started using ODBC back in the early 90s, when I was helping customers connect their Windows for Workgroups systems to the AS/400 database via PC Support/400.

This was in the days before IBM rebranded the AS/400 database as DB2/400 ( mainly because few customers realised that their beloved midrange system included a database ).

I got back into ODBC in the context of WebSphere Application Server (WAS) on Unix, connecting (again) to DB2/400, in the early 00s, specifically although I cannot think why we weren't using the JT400 JDBC driver .....

So, this time around, I'm working with IBM Integration Bus 9, formerly known as WebSphere Message Broker in an earlier invocation, and creating a flow that connects to ... DB2 ( albeit not on IBM i ) via ... ODBC.

I'm going to be writing a LOT about IBM Integration Bus (IIB) in future posts, so I'm mainly going to focus upon the ODBC side of the equation.

Briefly, IIB is connecting via ODBC, rather than JDBC, to DB2.

Both IIB and DB2 are running on the same OS ( Red Hat Enterprise Linux on VMware on my Mac ), so I don't need to install any additional DB2 client software.

Note - for my client, we're running IIB on one AIX LPAR and DB2 on another, so we've installed the DB2 client onto the IIB LPAR to provide the connectivity.

With my chosen Red Hat Enterprise Linux 6.6 installation, the open-source unixODBC driver comes free: -

rpm -qa | grep -i odbc

unixODBC-2.2.14-14.el6.x86_64

I had previously created a sample database in my DB2 environment: -

su - db2inst1
db2sampl

which I then validated: -

db2 connect to sample as db2inst1 using passw0rd
db2 "select empno,firstnme,lastname from db2inst1.employee"

...
EMPNO  FIRSTNME     LASTNAME       
------ ------------ ---------------
000010 CHRISTINE    HAAS           
000020 MICHAEL      THOMPSON       
000030 SALLY        KWAN           
000050 JOHN         GEYER          
000060 IRVING       STERN          
000070 EVA          PULASKI        
000090 EILEEN       HENDERSON      
000100 THEODORE     SPENSER        
000110 VINCENZO     LUCCHESSI      
000120 SEAN         O'CONNELL      
000130 DELORES      QUINTANA       
000140 HEATHER      NICHOLLS       
000150 BRUCE        ADAMSON        
000160 ELIZABETH    PIANKA         
..
.

I then tested the connectivity using the wonderful unixODBC isql test tool: -

isql SAMPLE db2inst1 passw0rd

+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL>
select empno,firstnme,lastname from db2inst1.employee
+-------+-------------+----------------+
| EMPNO | FIRSTNME    | LASTNAME       |
+-------+-------------+----------------+
| 000010| CHRISTINE   | HAAS           |
| 000020| MICHAEL     | THOMPSON       |
| 000030| SALLY       | KWAN           |
| 000050| JOHN        | GEYER          |
| 000060| IRVING      | STERN          |
| 000070| EVA         | PULASKI        |
| 000090| EILEEN      | HENDERSON      |
| 000100| THEODORE    | SPENSER        |
| 000110| VINCENZO    | LUCCHESSI      |
| 000120| SEAN        | O'CONNELL      |
| 000130| DELORES     | QUINTANA       |
...
| 200280| EILEEN      | SCHWARTZ       |
| 200310| MICHELLE    | SPRINGER       |
| 200330| HELENA      | WONG           |
| 200340| ROY         | ALONZO         |
+-------+-------------+----------------+
SQLRowCount returns -1
42 rows fetched
SQL> 


which proved the basic connectivity.

I then setup ODBC for the IIB integration, by creating a pair of files in /etc : -

/etc/odbc.ini

[ODBC Data Sources]
SAMPLE=IBM DB2 ODBC Driver

[SAMPLE]
DRIVER=/opt/ibm/db2/V10.5/lib64/libdb2.so
Description=IBM DB2 ODBC Database
Database=SAMPLE

[ODBC]
InstallDir=/opt/ibm/mqsi/9.0.0.2/ODBC64/V7.0/lib
UseCursorLib=0
IANAAppCodePage=106
UNICODE=UTF-8


/etc/odbcinst.ini

[ODBC]
Threading=2
Trace=1
TraceOptions=5
TraceFile=/tmp/odbc.trc


Note - in this example, I've configured tracing, but that's not the default :-)

I'll cover the IIB aspect of this in the next post ....



IBM Java 7 and 256-bit AES ciphers - The unrestricted truth

I have written a LOT about TLS 1.2 recently: -








so here's some more grist for that particular mill.

This is again in the context of WAS to DB2 connectivity, where my colleague. John The DBA, and I were looking at the key length of the AES ciphers that we're using.

( For the record, AES is Advanced Encryption Standard, also referenced as Rijndael - source: Wikipedia )

John kindly shared a nice little Java class: -

CipherTest.java

import javax.crypto.Cipher;
class CipherTest {
    public static void main(String args[]) {
        try {
            int maxKeyLen = Cipher.getMaxAllowedKeyLength("AES");
            if(maxKeyLen < 256) {
                System.out.println("FAILED: Max AES key length too small! (" + maxKeyLen + ").");
            } else {
                System.out.println("PASSED: Max AES key length OK! - >= 256 (" + maxKeyLen + ").");
            }
        } catch(Exception e) {
            System.out.println("FAILED: No AES found!");
        }
    }
}


I compiled this on a box running IBM Java 7 and WAS 8.5.5: -

...
Name                  IBM WebSphere SDK Java Technology Edition (Optional)
Version               7.0.8.10
ID                    IBMJAVA7
Build Level           cf051507.01
Build Date            2/19/15
Package               com.ibm.websphere.IBMJAVA.v70_7.0.8010.20150219_1802
Architecture          x86-64 (64 bit)
Installed Features    IBM WebSphere SDK for Java Technology Edition 7

...
Installed Product
--------------------------------------------------------------------------------
Name                  IBM WebSphere Application Server Network Deployment
Version               8.5.5.5
ID                    ND
Build Level           cf051507.01
Build Date            2/20/15
Package               com.ibm.websphere.ND.v85_8.5.5005.20150220_0158
Architecture          x86-64 (64 bit)
Installed Features    IBM 64-bit WebSphere SDK for Java
                      WebSphere Application Server Full Profile
                      EJBDeploy tool for pre-EJB 3.0 modules
                      Embeddable EJB container
                      Sample applications
                      Stand-alone thin clients and resource adapters

...


having first setup my shell to use the IBM Java 7: -

source /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/bin/setupCmdLine.sh 

I compiled and ran the class: -

javac CipherTest.java

java -cp . CipherTest

but, alas, it failed: -

128
FAILED: Max AES key length too small! (128).


Or, to be more precise, the test worked perfectly, by indicating that, out-of-the-box, the IBM JRE is only happy to accept 128-bit ciphers.

The class uses this code: -

Cipher.getMaxAllowedKeyLength

which is part of the javax.crypto.Cipher class.

So, the fact that the class returns 128 tells me a lot about my Java Runtime Environment.

Now, as mentioned in some of my other posts, I can choose to replace the JRE policy files with these: _


which I did choose to do.

This is what I did: -

(a) Establish where Java lives

which java

/opt/IBM/WebSphere/AppServer/java_1.7_64/bin/java

(b) Navigate to the JRE's security policy library folder

cd /opt/IBM/WebSphere/AppServer/java_1.7_64/jre/lib/security

(c) Backup the existing policy files

mv local_policy.jar  local_policy.RAJ
mv US_export_policy.jar  US_export_policy.RAJ

(d) Unpack the unrestricted policy files: -

unzip /tmp/unrestrictedpolicyfiles.zip 

( This all done as wasadmin who "owns" the WAS binaries and configuration )

I then re-tested my class: -

java -cp . CipherTest

which now returns: -

2147483647
PASSED: Max AES key length OK! - >= 256 (2147483647).

Now I need to replicate this on my AIX environment, and also trace the connectivity between WAS and DB2 to see which particular cipher suite is being chosen.

Which is nice :-)

WebSphere Application Server - Jython, continuing to learn learn learn


I had a particular requirement today. I needed to update a bunch of JDBC data sources, and change the Connection Pool properties, specifically the Aged Timeout value.

This was at the behest of our DBA, as we were looking at the way that connections are created/persisted between WAS and DB2.

Therefore, he ( let's call him John ) wanted to test to see whether changing the Aged Timeout value from the default of 0 to 1200 seconds.

On the journey, I acquired a few more scars ^H^H^H^H^H skills, as per the following examples: -

Getting Cluster Status

clusterName='AppCluster'
clusterID=AdminConfig.getid('/ServerCluster:'+clusterName+'/')
clusterObj=AdminControl.completeObjectName('type=Cluster,name='+clusterName+',*')
clusterStatus=AdminControl.getAttribute(clusterObj,'state')
print clusterStatus


Getting JNDI Names, Max Connections, Purge Policy and Aged Timeout

The trick is to get a "handle" on the Connection Pool, and then retrieve the Attributes from there. This works for ALL data sources.

for dataSource in AdminConfig.list('DataSource').splitlines():
 jndi=AdminConfig.showAttribute(dataSource,'jndiName')
 connPool=AdminConfig.showAttribute(dataSource,'connectionPool')
 maxConn=AdminConfig.showAttribute(connPool,'maxConnections')
 purgePolicy=AdminConfig.showAttribute(connPool,'purgePolicy')
 agedTimeout=AdminConfig.showAttribute(connPool,'agedTimeout')


( Note the indent during the loop )

Reviewing and Changing Aged Timeout

for dataSource in AdminConfig.list('DataSource').splitlines():
 jndi=AdminConfig.showAttribute(dataSource,'jndiName')
 connPool=AdminConfig.showAttribute(dataSource,'connectionPool')
 print "Old"
 print AdminConfig.showAttribute(connPool,'agedTimeout')
 AdminConfig.modify(connPool, '[[agedTimeout "1200"]]')
 print "New"
 print AdminConfig.showAttribute(connPool,'agedTimeout')
AdminConfig.save()
AdminNodeManagement.syncActiveNodes()


( Note the indent during the loop )

which reports

...
Old
0
''
New
1200
Old
0
''
New
1200

...

Ironically, I then used almost the same script to revert out the change, setting the agedTimeout attribute from 1200 back to 0.

WebSphere MQ Logs - wherefore are thou ?

Following on from an earlier post about IBM Integration Bus: -


I'd learned where WebSphere MQ keeps its logs, leastways in the world of Unix, way back when.

On my own VMs, running Red Hat Enterprise Linux, WebSphere MQ version 8.0 keep the logs for any given Queue Manager here: -

/var/mqm/qmgrs/[QMNAME]/errors

namely: -

ls -al /var/mqm/qmgrs/IB9QMGR/errors

total 292
drwxrws---  2 mqm mqm   4096 Jun 10 20:38 .
drwxrwsr-x 22 mqm mqm   4096 Jun 17 21:28 ..
-rw-rw----  1 mqm mqm 283303 Jun 17 21:28 AMQERR01.LOG
-rw-rw----  1 mqm mqm      0 Jun 10 20:38 AMQERR02.LOG
-rw-rw----  1 mqm mqm      0 Jun 10 20:38 AMQERR03.LOG

noting that the primary log - AMQERR01.LOG - is the main one: -

cat /var/mqm/qmgrs/IB9QMGR/errors/AMQERR01.LOG 

...
-------------------------------------------------------------------------------
17/06/15 21:28:36 - Process(72587.1) User(wmbadmin) Program(amqfqpub)
                    Host(bpmdemo.uk.ibm.com) Installation(Installation1)
                    VRMF(8.0.0.2) QMgr(IB9QMGR)
                   
AMQ5806: Queued Publish/Subscribe Daemon started for queue manager IB9QMGR.

EXPLANATION:
Queued Publish/Subscribe Daemon started for queue manager IB9QMGR.
ACTION:
None.
-------------------------------------------------------------------------------
17/06/15 21:28:36 - Process(72594.1) User(wmbadmin) Program(runmqchi)
                    Host(bpmdemo.uk.ibm.com) Installation(Installation1)
                    VRMF(8.0.0.2) QMgr(IB9QMGR)
                   
AMQ8024: WebSphere MQ channel initiator started.

EXPLANATION:
The channel initiator for queue SYSTEM.CHANNEL.INITQ has been started.
ACTION:
None.
-------------------------------------------------------------------------------

...

However, on Windows, the path is subtly different.

I dug around, and found them here: -

C:\ProgramData\IBM\MQ\qmgrs\[QMNAME\errors

albeit with the same naming convention and primacy.

Again, this is for MQ 8.

This may help ALTHOUGH it does only reference MQ versions prior to 7.5, and suggests: -

...
The WebSphere MQ for Windows error logs are located in the following directories. 
This is the default directory path, however it may have been changed at install time. 

c:\Program Files\IBM\WebSphere MQ\errors 
c:\Program Files\IBM\WebSphere MQ\qmgrs\<queueManagerName>\errors 
c:\Program Files\IBM\WebSphere MQ\qmgrs\@SYSTEM\errors (not used at V6 and higher
...



Note to self - Firefox and local connections

 Whilst trying to hit my NAS from Firefox on my Mac, I kept seeing errors such as:- Unable to connect Firefox can’t establish a connection t...