My original problem was to find the MQ configuration data used by applications running under Liberty on z/OS. I eventually found I could display all the configuration data from Liberty. This provided me with more data than I wanted to know. However this uses an interface with no authentication on authorization, and it can stop parts of Liberty.
I used the bundles command, collected the information in a file, and wrote a python script to process this file. This put each jar’s information in its own file, so it is readable.
This post describes what I see in it – It is not documented, so I may be wrong.
Within the data are
Within the file are two section
- Registered services – services this jar provides
- Services in use – services which this jar uses.
These contain dictionaries of service properties. For example
{javax.jms.Queue
javax.jms.Destination
}=
{
component.id=416
config.displayId=jmsQueue[default-0]
config.id=com.ibm.ws.jca.adminObject.supertype[extends-0]
osgi.jndi.service.name=jms/stockRequestQueue
properties.0.CCSID=1208
properties.0.baseQueueManagerName=
properties.0.baseQueueName=STOCK_REQUEST
...
service.id=795
}
and
{javax.jms.Queue
javax.jms.Destination
}=
{osgi.jndi.service.name=jms/stockResponseQueue
properties.0.baseQueueManagerName=
properties.0.baseQueueName=STOCK_RESPONSE
...
service.id=796
}
This shows there are multiple object of type javax.jms.Queue/javax.jms.Destination. One for a queue called STOCK_REQUEST, the other for STOCK_RESPONSE
The object type com.ibm.ws.jca.service.AdminObjectService has almost the same information as the javax.jms.Queue object. They have a different service.id, so they are different services.
I used grep to find all instances of STOCK_REQUEST. There were 3 entries in 2 jar files
- jar com.ibm.ws.app.manager_1.1.41 cl200620200528-0414:
- {com.ibm.wsspi.application.lifecycle.ApplicationRecycleComponent,
com.ibm.wsspi.resource.ResourceFactory,
com.ibm.ws.jca.service.AdminObjectService
}= - config.displayId=jmsQueue[default-0],
jndiName=jms/stockRequestQueue,
properties.0.baseQueueName=STOCK_REQUEST
- {com.ibm.wsspi.application.lifecycle.ApplicationRecycleComponent,
- jar com.ibm.ws.jca_1.0.41 cl200620200528-0414:
- {com.ibm.wsspi.application.lifecycle.ApplicationRecycleComponent
com.ibm.wsspi.resource.ResourceFactory
com.ibm.ws.jca.service.AdminObjectService
}= - config.displayId=jmsQueue[default-0]
jndiName=jms/stockRequestQueue
properties.0.baseQueueName=STOCK_REQUEST
service.id=795
- {com.ibm.wsspi.application.lifecycle.ApplicationRecycleComponent
- jar com.ibm.ws.jca_1.0.41 cl200620200528-0414:
- {javax.jms.Queue
javax.jms.Destination
}= - config.displayId=jmsQueue[default-0]
osgi.jndi.service.name=jms/stockRequestQueue
properties.0.baseQueueName=STOCK_REQUEST
service.id=796
- {javax.jms.Queue
We can see the same data is in multiple places – it should all be similar.
MQ pool size
I was interested in the information about MQ connection pools. I found this in com.ibm.ws.jca.cm_1.1.41.cl200620200528-0414.
- agedTimeout=-1
- component.id=491
- component.name=com.ibm.ws.jca.connectionManager
- config.displayId=connectionManager[ConMgr1]
- config.id=com.ibm.ws.jca.connectionManager[ConMgr1]
- config.overrides=true
- config.source=file
- connectionTimeout=30
- enableSharingForDirectLookups=true
- id=ConMgr1
- maxIdleTime=1800
- maxPoolSize=5
- purgePolicy=EntirePool
- reapTime=180
See here for what they mean.
My python code for taking the output from “bundles” and create individual files
import sys
fIn = open("/home/colinpaice/Documents/osgi.log", "r")
for x in range(4): # ignore the top 4 lines
line = fIn.readline()
if not line: break
outputFile = 0
for x in range(100000): #
line = fIn.readline()
if not line: break
if line[0:5] == "osgi>": break
if line[0] != ' ': # new file
if outputFile != 0:
outputFile.close()
line1 = line.split();
fn = 'output/' + line1[0]
outputFile = open(fn,'w')
outputFile.write(line)
elif line[0:5] == " Id=":
v = line.split('"')
outputFile.write(v[0] +"\n" )
if len(v) > 1 :
outputFile.write(" "+ '"'+v[1] +'"\n') # services
elif line[0:5] == ' {':
p = line[5:-2].split("}={")
p0 = p[0].split(", ")
pad = " {"
for ip0 in p0:
outputFile.write(pad + ip0 +"\n")
pad = " "
outputFile.write(" }="+"\n")
p1 = p[1].split(", ")
c = {} # dictionary of the keyword=values
for ip1 in p1:
v = ip1.split("=")
if ( len(v) ==1 ): # no k=value, just value
value = value + " " + v[0] # append it to the previous one
if value.endswith("]"): # if it is the last one
# update the dict
c[kw] = value
else:
kw = v[0]
value = v[1]
c[kw] = value
pad = " {" # only the first one has {...
for key in sorted(c.keys()): # print alphabetically
outputFile.write(pad + key+"="+c[key] +"\n")
pad = " "
outputFile.write(" }" +"\n")
else:
outputFile.write(line )