QSS - Sterling Quick Start Services

Debashis Ray's picture

Sterling Quick Start Services


Purpose of this Document:

          This document will illustrate my experience while working in Sterling Quick Start Services commonly known as QSS. I have included some tricks and tips , a known BUG of this product and its workaround and my notion about QSS. Currently the support for this product has been stopped by IBM, so this document may help them who are working with QSS in any organization, and to them who loves to read through the experience of working with this product. I have not included the configuration procedures, migration procedures etc in this document, as they can be found in the IBM website documentation for this product.



          By the name, this was developed and marketed by IBM as an extension of Sterling B2B Integrator to quickly onboard and integrate the partners in the system. It seems to me like having a framework in SI that will provide an additional help towards building the dataflow EDI and NON-EDI architecture of the Company. Perhaps this is why all the backend tables and the readymade BPs have followed the pattern of starting the name as “SIFRAMEWORK_”.


How this product will Help:

          This product will definitely help to set up a new partner quickly enough, only if the requirements matches with any of the existing partners, or follow the existing processes(in QSS it has been referred to as Rule and Rule Group), But if the requirement needs more customization then we have to create new Rules and this will lead us to the creation of new set of BPs in SI. That means the quickness of Sterling Quick Start Services depends on the diversity of the requirements. Hence sometimes we may find it less useful.


Components of QSS:

          There are four components – Trading Partner Set up (This is not the same as SFG partner set up, we may call it as QSS TP set up), Rule, Rule Group Creation and multi destination set up.

Rule is nothing but the individual BPs . Say for example we have developed a BP that will do the translation of the primary document, and we can create a rule as “translation” and assign it to that BP. Similarly we can create rule like “mailbox_add” “FTP” etc ..

Rule group is a combination of six types of rules, say the new partner data needs to be translated first then a FTP is required, then wecan create a rule group containing translation and FTP in it, and assign it to the partner while creating the Trading partner set up in QSS.


Multidestination I have not explored, but it is used to send file to different location for a partner.

Now to set up a QSS partner, we have to create a QSS TP and the corresponding QSS TP documents, below is a sample screenshot. Here the parameters will be passed as XML tags to the ProcessData of the BPs that are assigned in that rule group.

So basically, while onboarding a new partner, we have to create the QSS TP, and the TP documents, and assign the correct rule group to it.




How it works:

          If we closely look into the backend tables and the inbuilt BPs provided by this product, then we can see that it is basically storing the parameters (QSS TP, TP docs, Rule etc.) in the below backend tables, and just firing a lightweight JDBC adapter inside the BP to retrive them and call the desired BPs inline to process the data.

Tips & Tricks:


1)   How to create several partners in QSS at once:
 Just form an insert SQL with the help of the below and execute it in the backend DB of SI & similarly we can make entry in the SIFRAMEWORK_DOCUMENTS as well.

2)   How to use more than six rules for a specific partner:
To do this, there are two ways, either create a new BP combining the two or more BPs from the Rules you want to apply for the partner and then create a new rule and rule group; or you can create another TP docs and pass the data from the first TP document to the second one, and the assign the first six rules in a rule group and assign it to the first TP document and assign the remaining rules in the second TP document. The output from the last TP Docs will be the desired output for that partner.

One known BUG and its workaround:

          During migration of the QSS partners, the map name does not get migrated into the destination environment, or instances of SI, All the time we have to manually update the map name in the QSS TP document. This is a known BUG in QSS, and the below process can be used to get a workaround type solution of this.


To the context, let me describe the migration process a bit, first we have to export the TP data from QSS, and the TP Docs data and in the target environment execute the SIFramework_MigrationUtil_ImportData BP with TP data first and then with TP Docs.

The migration process will remain the same. We have to modify the SIFramework_MigrationUtil_ImportData BP to take the map value from the source environment and update it directly into the destination environment by a JDBC adapter. For taking the map value from the source environment, we can use the below java code in a java task service.

 Java Code:

import java.sql.*; String url = "jdbc:oracle:thin:@edidbdv00:1521:"; String dbName = "edidev"; String driver = "oracle.jdbc.OracleDriver"; String userName = "sbidb"; String password = "passwd"; String ctp = (String)wfc.getWFContent("ctp"); String ctpd = (String)wfc.getWFContent("ctpd"); String sql="select map_name from SIFRAMEWORK_DOCUMENTS where tp_name = '"+ctp+"' and document_name='"+ctpd+"'"; try { Class.forName(driver).newInstance(); System.out.println(url+dbName+userName+password); Connection conn = DriverManager.getConnection(url+dbName,userName,password); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql); while (rs.next()) { wfc.setWFContent("mapn", rs.getString("MAP_NAME"), true); } conn.close(); } catch (Exception e) { e.printStackTrace(); } return "";

 -       where  edidbdv00 is the source SI DB, schema name is  sbidb and its a oracle DB.

 Modified BP:



Added the below portion in the original BP

<rule name="Loopenter">
                    <condition>count(/ProcessData/test/document) &gt;= /ProcessData/docctr/text()</condition>
          <assign to="docctr">1</assign>
          <choice name="LoopSQCHC">
                              <case ref="Loopenter" activity="LoopSQ"/>
                    <sequence name="LoopSQ">
                              <assign name="Assign" to="ctp" from="/ProcessData/test/document[position()=/ProcessData/docctr/text()]/TPName/text()"/>
                              <assign name="Assign" to="ctpd" from="/ProcessData/test/document[position()=/ProcessData/docctr/text()]/DocumentName/text()"/>
                              <operation name="JavaTask Service">
                                       <participant name="BDimportqss"/>
                                       <output message="JavaTaskInputMessage">
                                                 <assign to="." from="*"/>
                                       <input message="inmsg">
                                                 <assign to="." from="*"/>
                              <assign name="Assign" to="sql" from="concat(&quot;update SIFRAMEWORK_DOCUMENTS set map_name = &apos;&quot;,mapn,&quot;&apos; where tp_name = &apos;&quot;,/ProcessData/ctp,&quot;&apos; and document_name=&apos;&quot;,/ProcessData/ctpd,&quot;&apos;&quot;)"/>
                              <operation name="FirstLookup">
                                       <participant name="CVI_Lightweight_JDBC"/>
                                       <output message="LightweightJDBCAdapterTypeInputMessage">
                                                 <assign to="query_type">UPDATE</assign>
                                                 <assign to="pool">oraclePool</assign>
                                                 <assign to="result_name">Result1</assign>
                                                 <assign to="row_name">row</assign>
                                                 <assign to="sql" from="sql/text()"/>
                                                 <assign to="." from="*"/>
                                       <input message="inmsg">
                                                 <assign to="JDBC_Lookup" from="DocToDOM(PrimaryDocument)" append="true"/>
                              <assign to="docctr" from="docctr+1"/>
                              <operation name="Release Service">
                                       <participant name="ReleaseService"/>
                                       <output message="ReleaseServiceTypeInputMessage">
                                                 <assign to="." from="*"/>
                                                 <assign to="TARGET">sql | mapn | ctp | ctpd</assign>
                                       <input message="inmsg">
                                                 <assign to="." from="*"/>
                              <repeat name="LoopSQCHCrepeat" ref="LoopSQCHC"/>



 --- With Warm Wishes --- Debashis – Dt: August 12 , 2015