Showing posts with label IIB. Show all posts
Showing posts with label IIB. Show all posts

Tuesday, March 10, 2020

IBM Integration Bus - When you write Java™ code for a JavaCompute node, you can include references to other Java projects and JAR files.

To complete this task, you must have completed the following tasks:
  • Add a JavaCompute node to your message flow.
  • Create Java code for a JavaCompute node.
The Java code in a JavaCompute node might contain references to other Java projects in the Eclipse workspace (internal dependencies), or to external JAR files, for example the JavaMail API (external dependencies), or a set of JAXB Java object classes (internal or external). If other JAR files are referenced, you must add the files to the project class path.
See Using JAXB with a JavaCompute node for an example of a project using Java objects generated by the JAXB binding compiler.
  1. Right-click the project folder for the project on which you are working, and click Properties.
  2. Click Java Build Path in the left pane.
  3. Click the Libraries tab.
  4. Complete one of the following steps:
    • To add an internal dependency, click Add JARs, select the JAR file that you want to add, then click OK.
    • To add an external dependency, click Add External JARs, select the JAR file that you want to add, then click Open. Copy the JAR file to the shared-classes directory required. For more details of the shared-classes directories available and the effects of each, see Java shared classloader. If you do not copy the JAR file to a valid shared-classes directory, ClassNotFoundException exceptions are generated at run time.
You have now added a code dependency.

Reference: https://www.ibm.com/support/knowledgecenter/en/SSMKHH_9.0.0/com.ibm.etools.mft.doc/ac30280_.htm

Loads all the JAR files located within the shared-classes directories.

Loads all the JAR files located within the shared-classes directories. The precedence order of loading is dictated by the directories the JAR files are located in.

Determine the integration node workpath to use by running the mqsireportbroker command as follows:

mqsireportbroker integrationNodeName

JAR files are loaded in the following precedence order:
  • For Windows
    • workpath\config\<my_int_node_name>\<my_int_server_label>\shared-classes
  • For Linux, UNIX, and z/OS
    • workpath/config/<my_int_node_name>/<my_int_server_label>/shared-classes
  • For Windows
    • workpath\config\<my_int_node_name>\shared-classes
  • For Linux, UNIX, and z/OS
    • workpath/config/<my_int_node_name>/shared-classes
  • For Windows
    • workpath\shared-classes
  • For Linux, UNIX and z/OS
    • workpath/shared-classes

Sunday, March 1, 2020

IBM Integration Bus - Filter Node

Filter Node
The “Filter” node is the simplest of the routing nodes and provides a simple “If-Then-Else” routing mechanism within a Message Flow. The “Filter” node is an ESQL node. The ESQL executed in this node must terminate with an ESQL RETURN statement. This statement must return a Boolean value. The route taken from this node depends upon the value of the RETURN statement.
This node has four output terminals. These terminals are:

  •  Failure (A failure in the ESQL code)
  • True (ESQL code returns a “True” value)
  • False (ESQL code returns a “False” value)
  • Unknown (ESQL code returns a “NULL” value or does not “RETURN” a boolean)
Note: The “Filter” node propagates an unchanged input message to an output terminal. If you are referring to the input message to interrogate its contents in a Database or Filter node, use correlation name Body to refer to the start of the message. Body is equivalent to Root followed by the parser name (for example, Root.XMLNS), which you can use if you prefer. You cannot use the Body correlation name in a DatabaseInput node.
You must use these different correlation names because there is only one message to which to refer in a Database or Filter node; you cannot create an output message in these nodes. Use a Compute node to create an output message.


Example:

CREATE FILTER MODULE HTTPInputMessageFlow_Filter
    CREATE FUNCTION Main() RETURNS BOOLEAN
    BEGIN
        
        DECLARE space1 NAMESPACE 'namespace1';
        IF Body.space1:root.space1:example = 'ABCDE' THEN
            RETURN TRUE;
        ELSE
            RETURN FALSE;
        END IF;
    END;
END MODULE;



Wednesday, February 26, 2020

IBM Integration Bus- DFDL in ESQL

To parse  binary to XML in ESQL:

CREATE LASTCHILD OF OutputRoot DOMAIN('DFDL') PARSE(binaryData ENCODING InputRoot.Properties.Encoding TYPE '{Namespace}:RootElement');

To convert XML to binanry in ESQL:
We have to prepare the DFDL in OutputRoot like:

CREATE LASTCHILD OF OutputRoot DOMAIN('DFDL') NAME 'DFDL';
DECLARE ns NAMESPACE 'Namespace';
SET OutputRoot.DFDL.Namespace:RootElement=...

The Output is auto convert to binary
DECLARE bPayload BLOB ASBITSTREAM(InputRoot.DFDL.HRRecords CCSID InputRoot.Properties.CodedCharSetId ENCODING InputRoot.Properties.Encoding);

IBM Integration Bus - Working with MQ ( request and response with same correlId).

We have the service via couple queue, We send request to Input Queue and get the response from Out Queue with the same correlId.
The code for "set message to queue" compute node
CREATE COMPUTE MODULE HTTPInputMessageFlow_set_message_to_queue
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
-- CALL CopyMessageHeaders();
-- CALL CopyEntireMessage();
SET OutputRoot.BLOB.BLOB = InputRoot.BLOB.BLOB;

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;

The code for "set correlId" compute node
CREATE COMPUTE MODULE HTTPInputMessageFlow_set_correlId
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
-- CALL CopyMessageHeaders();
-- CALL CopyEntireMessage();
SET OutputRoot.MQMD.CorrelId = InputLocalEnvironment.WrittenDestination.MQ.DestinationData.correlId;

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;

IBM Integration Bus- ESQL Code Snippets

ESQL Code Snippets

1. Convert XMLNSC to BLOB 

Sometimes you may need to convert your payload to a BLOB(Binary Large Object). To be able to accomplish this the ASBITSTREAM function has to be used. The ASBITSTREAM function will return a bit stream representation of your payload. When I need to put my payload to MQ queue I convert it to a BLOB.
 DECLARE myChar CHAR CAST(myBLOB AS CHAR CCSID InputRoot.Properties.CodedCharSetId Encoding InputRoot.Properties.Encoding);  

2. Convert BLOB to CHAR

 DECLARE myChar CHAR CAST(myBLOB AS CHAR CCSID InputRoot.Properties.CodedCharSetId Encoding InputRoot.Properties.Encoding);  

3. Convert CHAR to BLOB

 DECLARE myBlob BLOB CAST( myChar AS BLOB CCSID InputRoot.Properties.CodedCharSetId);  

4. Convert BLOB to XMLNSC 

 CREATE LASTCHILD OF OutputRoot.XMLNSC DOMAIN('XMLNSC') PARSE(myBlob, InputRoot.Properties.Encoding, InputRoot.Properties.CodedCharSetId);  

5. Left Padding

 RIGHT('0000000000' || CAST(field AS CHAR),10);  
The above will left zero pad field to a 10 long field.


6. Nil Element & Namespace Declaration

 SET OutputRoot.XMLNSC.ns:myElement.(XMLNSC.NamespaceDecl)xmlns:"xsi" ='http://www.w3.org/2001/XMLSchema-instance';    
 SET OutputRoot.XMLNSC.ns:myElement.(XMLNSC.Attribute)xsi:nil = 'true';   

7. Convert Payload to a String

 DECLARE myBlob BLOB;  
 SET myBlob = ASBITSTREAM(InputRoot.XMLNSC CCSID InputRoot.Properties.CodedCharSetId ENCODING InputRoot.Properties.Encoding);  
 DECLARE myChar CHAR CAST(myBlob AS CHAR CCSID InputRoot.Properties.CodedCharSetId Encoding InputRoot.Properties.Encoding);  

8. Backup a JSON Payload without losing arrays

 CREATE LASTCHILD OF OutputRoot DOMAIN('JSON') TYPE Name NAME 'JSON';  
 CREATE FIELD OutputRoot.JSON.Data IDENTITY(JSON.Object)Data;  
 SET OutputRoot.JSON.Data = InputLocalEnvironment.Backup.Data;   

9.Pass Parameters to an HTTP request Node 

 OutputLocalEnvironment.Destination.HTTP.QueryString.param1 = 'param1';  
Each parameter must be individually set.

10. Convert BLOB to JSON 

 CREATE LASTCHILD OF OutputRoot DOMAIN('JSON') PARSE(InputRoot.BLOB.BLOB);  

11. Select value from an ESQL array 

This statement allows you to select the name without iterating through OutputLocalEnvironment.Variables.Person[] where the Id value matches the nameId.

 SET name = the(select item fieldvalue(r.Name) from OutputLocalEnvironment.Variables.Person[] as r where r.Id = nameId);   

Tuesday, February 25, 2020

IBM Integration Bus - Assign node with SELECT command in ESQL

For Ex, We have the input below.
<?xml version="1.0" encoding="UTF-8"?>
<breakfast_menu>
<food>
    <name>Belgian Waffles</name>
    <price>$5.95</price>
    <description>
   Two of our famous Belgian Waffles with plenty of real maple syrup
   </description>
    <calories>650</calories>
</food>
<food>
    <name>Strawberry Belgian Waffles</name>
    <price>$7.95</price>
    <description>
    Light Belgian waffles covered with strawberries and whipped cream
    </description>
    <calories>900</calories>
</food>
<food>
    <name>Berry-Berry Belgian Waffles</name>
    <price>$8.95</price>
    <description>
    Belgian waffles covered with assorted fresh berries and whipped cream
    </description>
    <calories>900</calories>
</food>
<food>
    <name>French Toast</name>
    <price>$4.50</price>
    <description>
    Thick slices made from our homemade sourdough bread
    </description>
    <calories>600</calories>
</food>
<food>
    <name>Homestyle Breakfast</name>
    <price>$6.95</price>
    <description>
    Two eggs, bacon or sausage, toast, and our ever-popular hash browns
    </description>
    <calories>950</calories>
</food>
</breakfast_menu>

We just want create the output with the price of food that have name is "Homestyle Breakfast", We could use the SELECT command  in ESQL like below.

SET OutputRoot.XMLNSC.food.price= THE(SELECT FIELDVALUE(c.price) AS price FROM InputRoot.XMLNSC.breakfast_menu.food[] AS c WHERE c.name ='Homestyle Breakfast');

The SELECT command for querying the food with name is 'Homestyle Breakfast' and return a LIST of matched ROW. The "THE" command with the first element in the LIST and return for assigning to OutputRoot.XMLNSC.food.price
We will have the output like:
<food>
       <price>$6.95</price>
</food>
Without the "THE" command, we have use [] like below
SET OutputRoot.XMLNSC.food[]= (SELECT FIELDVALUE(c.price) AS price FROM InputRoot.XMLNSC.breakfast_menu.food[] AS c WHERE c.name ='Homestyle Breakfast');
The same output:
<food>
       <price>$6.95</price>
</food>

Sunday, February 23, 2020

IBM Integration Bus- Database Definition

Securing database connections

mqsisetdbparms broker_name -n jdbc::security_identity -u userID -p password

Download JDBC driver for type 4 connections

Setting up a JDBC provider for type 4 connections

mqsicreateconfigurableservice LOCALBROKER -c JDBCProviders -o JDBCOracleDBConnector -n connectionUrlFormat,connectionUrlFormatAttr1,connectionUrlFormatAttr2,connectionUrlFormatAttr3,connectionUrlFormatAttr4,connectionUrlFormatAttr5,databaseName,databaseType,databaseVersion,description,environmentParms,jarsURL,jdbcProviderXASupport,maxConnectionPoolSize,portNumber,securityIdentity,serverName,type4DatasourceClassName,type4DriverClassName -v jdbc:oracle:thin:[user]/[password]@[serverName]:[portNumber]:[connectionUrlFormatAttr1],MYDB,,,,,MYDB,Oracle,11.2,"Oracle DEV",default_none,"C:\temp\jars",false,0,5001,security_identity,dev72.hdd.com,oracle.jdbc.xa.client.OracleXADataSource,oracle.jdbc.OracleDriver

Please note: Please correct  the below information 
- securityIdentity( ex: security_identity is same with step Securing database connections)
- jarsURL(ex: "C:\temp\jars" is folder contains the jdbc driver jar files).
- connectionUrlFormat( ex: "jdbc:oracle:thin:[user]/[password]@[serverName]:[portNumber]:[connectionUrlFormatAttr1]"  is jdbc url  to connect to  the BD).
-  databaseName( Ex: "MYDB").
- serverName( Ex: "dev72.hdd.com")
- type4DatasourceClassName( Ex: com,oracle.jdbc.xa.client.OracleXADataSource)
- type4DriverClassName( Ex: oracle.jdbc.OracleDriver).
- Provider name( Ex: JDBCOracleDBConnector).

Create Database Definition

Create database definition( note that  provider name should be same with jdbc provider name as ablove, ex: JDBCOracleDBConnector )

IBM Integration Bus - How to debug in IBM integration tookit

For debugging, We have to set the debug port with comment below
mqsichangeproperties integrationNodeName -e default  -o ComIbmJVMManager -n jvmDebugPort -v 3920
The port(ex: 3920) is used for debug
We have to stop and start node for effect.
Now, choose the "Launch Debuger", add breakpoint and enjoy.


IBM Integration Bus - Webphere MQ

For using the Webphere MQ in  IIB, We have installed the MQ Client at least. Download MQ Client in https://developer.ibm.com/messaging/mq-downloads/

Create the MQ Security Identity:

Create the MQ Security Identity&nbsp; with below command line:

mqsisetdbparms integrationNodeName -n mq::queueid-u username -p password

The command above, create the MQ Security Identity name is queueid

Config the MQ node


After finish, We create 1 flow, and drag and drop a MQ node( Like: MQInput,...)
We have choose the Properties of Node. In Basic Tab, input the Queue Name
In "MQ Connection Tab":

  • Select "MQ client connection Properties" in Connection
  • Input Queue Manager, Host name, port, Channel Name and Security Identity( ex: queueid that is create before)


Install and use xorg-server on macOS via Homebrew

  The instructions to install and use xorg-server on macOS via Homebrew: Install Homebrew (if you haven't already): /bin/bash -c ...