IBM provides the IBM Integration API, also known under the less accurate and descriptive name Configuration Manager Proxy (CPM), through which you can write your applications to control IBM Integration Bus components.
The Java code below provices a working example of this API. The code presented revolves around a BrokerManager class. In the code below only one method on this class has been implemented, but it can easily be extended with other methods.
The code uses a z/OS specific way to connect to a broker. On z/OS we do not connect through the network but locally. This needs a slightly different approach using the getLocalInstance method on the Broker Proxy API.
The main() method in this sample implements the instantiation and invocation of the BrokerManager, implementing a command line solution, but the same code could be used in different contexts seamlessly.
The documentation of the API can be found in the IBM Integration Bus Knowledge Center.
Information for the App Connect enterprise version can be found through this link. I have not tried that version.
package com.your.company.package.broker;
import com.ibm.broker.config.proxy.AdministeredObject;
import com.ibm.broker.config.proxy.AdministeredObjectListener;
import com.ibm.broker.config.proxy.ApplicationProxy;
import com.ibm.broker.config.proxy.AttributeConstants;
import com.ibm.broker.config.proxy.BrokerConnectionParameters;
import com.ibm.broker.config.proxy.BrokerProxy;
import com.ibm.broker.config.proxy.CompletionCodeType;
import com.ibm.broker.config.proxy.ConfigManagerProxyException;
import com.ibm.broker.config.proxy.ConfigManagerProxyLoggedException;
import com.ibm.broker.config.proxy.ConfigManagerProxyPropertyNotInitializedException;
import com.ibm.broker.config.proxy.ExecutionGroupProxy;
import com.ibm.broker.config.proxy.LogEntry;
import com.ibm.broker.config.proxy.MQBrokerConnectionParameters;
import com.ibm.broker.config.proxy.MQPropertyFileBrokerConnectionParameters;
import com.ibm.broker.config.proxy.MessageFlowProxy;
import com.ibm.mq.MQException;
import java.util.Enumeration;
public class BrokerManager {
private BrokerProxy bp;
private String bn;
private String qm;
private String hn;
private int port;
BrokerManager(String broker, String host, String qmgr, int port) {
this.bn = broker;
this.qm = qmgr;
this.hn = host;
this.port = port;
System.out.println("Creating Broker Manager " + this.bn);
}
public boolean connect() {
BrokerConnectionParameters bcp;
boolean brokerIsResponding = false;
// bcp = new MQBrokerConnectionParameters(this.hn, this.port, this.qm);
// Not for z/OS
// bcp = new MQBrokerConnectionParameters("", this.port, this.qm); but we will use
// getLocalInstance for z/OS below
try {
this.bp = BrokerProxy.getLocalInstance(this.bn);
// alternative this.bp = BrokerProxy.getInstance(bcp);
// Ensure the broker is actually talking to us.
brokerIsResponding = bp.hasBeenPopulatedByBroker(true);
if (brokerIsResponding) {
System.out.println("Broker" + this.hn + " broker " + this.bn + "is responding");
} else {
System.err.println("Broker" + this.bn + "is not responding");
this.bp.disconnect();
this.bp = null;
}
} catch (ConfigManagerProxyLoggedException e) {
System.err.println("Broker" + this.bn + " CONNECT failed" + e.toString());
}
return brokerIsResponding;
}
public boolean setStartMode(String exg, String sm) {
// Set startmode for all flows in given execution group
//
// AttributeConstants.STARTMODE_MAINTAINED which means at deploy time or
// restart the message flow will start based on its isRunEnabled value.
// AttributeConstants.STARTMODE_MANUAL which means at deploy time or
// restart the message flow will be stopped.
// AttributeConstants.STARTMODE_AUTOMATIC
this.bp.setSynchronous(15000);
boolean result = false;
try {
Enumeration<ExecutionGroupProxy> listEG = this.bp.getExecutionGroups(null);
while (listEG.hasMoreElements()) {
ExecutionGroupProxy eg = listEG.nextElement();
if (eg.getName().equalsIgnoreCase(exg)) {
System.out.println("Connected to execution group " + exg );
Enumeration<MessageFlowProxy> listMsgFlow = eg.getMessageFlows(null);
while (listMsgFlow.hasMoreElements()) {
MessageFlowProxy flow = listMsgFlow.nextElement();
if (sm.equalsIgnoreCase("maintained")) {
flow.setStartMode(AttributeConstants.STARTMODE_MAINTAINED);
} else if (sm.equalsIgnoreCase("manual")) {
flow.setStartMode(AttributeConstants.STARTMODE_MANUAL);
} else if (sm.equalsIgnoreCase("automatic")) {
flow.setStartMode(AttributeConstants.STARTMODE_AUTOMATIC);
}
System.out.println(flow.getName() + " startmode set to " + sm);
}
}
}
} catch (Exception e) {
System.err.println("Error " + e.toString() + " during getExecutionGroup");
}
return result;
}
public static void main(String[] args) {
// Variables, initialised
String action = "";
String startmode = "";
String brokername = "";
String exgname = "";
String qmgr = "";
String hostname = "";
int brokerport = 0;
// Parse the command line arguments
// We currently only need these, so we do not make parsing of arguments more complex than this
if (args.length < 4) {
System.out.println("Error in input. Please provide: Brokername, Executiongroupname, Action, parametervalue");
} else {
brokername = args[0];
exgname = args[1];
action = args[2];
startmode = args[3];
// Create brokermanager and connect
BrokerManager b = new BrokerManager(brokername, hostname, qmgr, brokerport);
b.connect();
// Perform given action, currently only
if (action.equalsIgnoreCase("setstartmode")) {
b.setStartMode(exgname, startmode);
} else {
System.out.println("You gave action: " + action + " Specify valid action: setstartmode.");
}
}
}
}
Hope this works for you. Let me know if you have comments.
// Niek de Greef