Monday, November 22, 2010

EDIFACT Document Identification with Oracle B2B

When receive a "document protocol identification error" on an inbound native EDI transaction set, it is possible that extraneous characters e.g. CR/LF at the end of the EDI have been added to the file. For example:
The following property setting will have Oracle B2B checks and removes them.

b2b.edi.enablePreprocess= true

The properties will need to be set in the System Mbean Browser within Enterprise manager.
Below are the steps to navigate to the System Mbean Browser, and how to invoke the B2B config Mbean.

  1. Login into Enterprise manager.
  2. Expand SOA
  3. Right click on soa-infra
  4. Select Administration
  5. Select System Mbean browser
  6. Expand Application Defined Mbeans
  7. Expand oracle.as.soainfra.config
  8. Expand the soa server domain
  9. Expand B2B config
  10. Select Operations
  11. Select addProperty
  12. Enter the desired property for the key, such as b2b.edi.enablePreprocess.
  13. Enter the value, true.
  14. Add any comments if desired.
  15. Invoke the mbean and check the b2b-config.xml that the property is reflected in the file.
  16. Restart the managed server.

Wednesday, November 10, 2010

Working with array in Oracle BPEL

This is an extension usage of array based from my previous post.

In the following example the variable Variable_whileLoopIteration is the iteration counter in the WHILE activity.

Reading from a specific element in an array:
<assign name="Extract_ProductName">
<copy>
<from expression="bpws:getVariableData('Variable_PurchaseOrder',concat('/ns1:purchaseOrder/ns1:items/ns1:item[',bpws:getVariableData('Variable_whileLoopIteration'),']/ns1:productName'))"/>
<to variable="Variable_productName"/>
</copy>
</assign>
Writing to a specific element in an array:
<assign name="Assign_NewProductNameToPO">
<copy>
<from expression="'NewProductName'"/>
<to variable="Variable_PurchaseOrder" query="/ns1:purchaseOrder/ns1:items/ns1:item[position() = bpws:getVariableData('Variable_whileLoopIteration')]/ns1:productName"/>
</copy>
</assign>

My advise is don't rely on JDeveloper Design view alone. Most of the time you have to manually edit the source to get it to do exactly what you want.

Tuesday, November 09, 2010

Convert Gregorian Date to JD Edwards Date in XSLT

Q: How to convert Gregorian Date to JDE Date in XSLT?

The format is C-YY-DDD, which is used by JD Edwards software: the century after 1900, the year in that century and the Julian date within that year.  Here are a few examples:

Checkout JDE Julian Date Converter tool by David Macek.

Important: Make sure you declare the XSLT version 2.0!
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="2.0">
...
<ns1:JDEDateNumber>
<xsl:variable name="InStringDate" select="'2010-11-09'"/>
<xsl:variable name="Year" select="substring($InStringDate,1,4)"/>
<xsl:variable name="ShortYear" select="substring($InStringDate,3,2)"/>
<xsl:variable name="StartOfYear" select='concat($Year,"-01-01")'/>
<xsl:value-of select="concat('1', $ShortYear, format-number(days-from-duration((xsd:date($InStringDate) - xsd:date($StartOfYear))) + 1, '000'))"/>
</ns1:JDEDateNumber>
...
</xsl:stylesheet>

Thursday, October 28, 2010

Configuring Oracle SOA Suite 11g with JDE on AS400 using JDBC

Awhile back I have attempted at using Oracle Application Adapter for JDE without much success, namely because there is no known customer currently. So I'm defaulting to JDBC as a means to connect to our JDE ERP8.

This is a guide for how to configure Oracle SOA Suite 11g to a JD Edwards ERP8 running on AS400 (iSeries). You will need to do these steps to setup your runtime environment.

  1. Download/extract IBM Toolkit for Java/JTOpen.
  2. Create a new directory, C:\Oracle\Middleware\wlserver_10.3\server\ext\jdbc\as400
  3. Copy the jt400.jar to C:\Oracle\Middleware\wlserver_10.3\server\ext\jdbc\as400\jt400.jar
  4. Edit C:\Oracle\Middleware\wlserver_10.3\common\bin\commEnv.cmd
  5. Append the new jar file in step (3) to the WEBLOGIC_CLASSPATH
  6. Restart both AdminServer and soa_server1.
  7. Goto Oracle Weblogic Administration Console (http://localhost:7001/console/)
  8. Navigate to soa_domain > Services > JDBC > Data Sources
  9. Add new JDBC Data Source, Name = AS400Connection, JNDI Name = jdbc/AS400Connection, Database Type = DB2 for i5/OS
  10. Database Driver as JTOpen's DB2 for i5/OS Driver (Type 4) IBM Toolkit for Java; Version 8.X, 9.X
  11. If you choose non-XA, remember to uncheck Supports Global Transactions.
  12. When prompted for the database port number, put in a temporary port as 60000.
  13. On the Test Database Connection screen, make sure you overwrite the database URL to match your environment, ie. jdbc:as400://JDESERVER;naming=DATASOURCE;errors=full.
  14. Deploy to target server soa_server1.
  15. If test connection failed with the error message "Cannot load driver: com.ibm.as400.access.AS400JDBCDriver", then repeat step (2) - (6)
  16. Next, create a new Outbound Connection Pool Configuration, Interface Name = javax.resource.cci.ConnectionFactory, JNDI Name = eis/DB/AS400Connection, dataSourceName = jdbc/AS400Connection.
  17. Save and run Update action on DBAdapter
  18. Done!

Configuring JDeveloper 11g with AS400

The following steps is a guide on how to connect to an AS400 database using JDBC and JDeveloper 11g for design-time. Where my local JDeveloper installation is at C:\Oracle\sqldeveloper and my JDE server name is JDEEnt1.
  1. Download/extract IBM Toolkit for Java/JTOpen.
  2. Copy the jt400.jar to C:\Oracle\sqldeveloper\jdbc\lib\jt400.jar
  3. Navigate to Tools > Preferences > Database > JDBC Driver Options
  4. Add a new JDBC Driver, calling the driver class as "com.ibm.as400.access.AS400JDBCDriver"
  5. For the Library definition, click Browse
  6. Name the Library as "AS400 JDBC"
  7. Add entry to the class path, referencing the jar file in step (2)
  8. Your new AS400 JDBC Driver should look like this
  9. Back to your SOA composite, simple use the Database Adapter
  10. The Database Adapter wizard will prompt you to create a new connection.
  11. Select Connection Type as "Generic JDBC" and Driver Class as "com.ibm.as400.access.AS400JDBCDriver"
  12. Now test the connection

  13. Done!

Wednesday, October 27, 2010

Register a new Australian company

This is a guide on how to register a new proprietary Australian company.

  1. Read the Corporations Act 2001 to understand your legal obligations.
  2. Start searching for available company names at the ASIC website. You are not allow to register the company name if its already being registered by a sole trader in a different state/territory. "MyCompany" and "My Company" is effectively the same.
  3. Complete the Form 201 Application for registration as an Australian company, see my sample form.
  4. Goto the ASIC office in person to get the company name registered immediate or post your application will takes 1-2 weeks.
  5. Pay $412.00 for the application fee. An accountant will charge you $800.00-$1200.00 for the service.

For more information read Starting a Company or Business.

Tuesday, October 19, 2010

Looping over each nodes in Oracle BPEL

This is an example how to use WHILE loop in Oracle BPEL Process Manager 11g.



This example will be based on the JDEPurchaseOrders.xsd schema and the JDEPurchaseOrders.xml sample data.

Step 1, create another XSD to map your temporary data at for each node. Let's call it JDEPurchaseOrder.xsd.

Step 2, create variables based on the message type that contains this collection, and 2 counters, Variable_LoopRunningIndex for the running index, and Variable_LoopCounter for the length of the collection.As shown below:

    <variable name="Variable_LoopRunningIndex" type="xsd:integer"/>
    <variable name="Variable_LoopCounter" type="xsd:integer"/>
    <variable name="Variable_tempJDEPurchaseOrder" element="ns3:HEADER"/>

Step 3, initialise variables for looping.
    <assign name="Initialise_WhileLoop">
      <copy>
        <from expression="number(1)"/>
        <to variable="Variable_LoopRunningIndex"/>
      </copy>
      <copy>
        <from expression="ora:countNodes('Receive_JDEFlatfile_Read_InputVariable','body','/ns3:JDEPurchaseOrder/ns3:HEADER/ns3:ID') + 1"/>
        <to variable="Variable_LoopCounter"/>
      </copy>
    </assign> 
Step 4, implement BPEL while activity to loop over each node
    <while name="For_Each_Header_Record"
           condition="bpws:getVariableData('Variable_LoopRunningIndex') &lt; bpws:getVariableData('Variable_LoopCounter')">
      <bpelx:annotation>
        <bpelx:general>
          <bpelx:property name="userLabel">For_Each_Header_Record</bpelx:property>
        </bpelx:general>
      </bpelx:annotation>
      <sequence name="Split_Purchase_Order">
        <scope name="Scope_1">
        <!-- Declare scope variables -->
          <variables>
            <variable name="Variable_selector" type="xsd:string"/>
            <variable name="Variable_tempJDEPurchaseOrder" element="ns3:HEADER"/>
          </variables>
          <sequence name="Sequence_1">
          <!-- Map current node into temp struct -->
            <assign name="Create_tempJDEPurchaseOrder">
              <copy>
                <from expression="concat(&quot;/ns3:JDEPurchaseOrder/ns3:HEADER[&quot;, string(bpws:getVariableData('Variable_LoopRunningIndex')),&quot;]&quot;)"/>
                <to variable="Variable_selector"/>
              </copy>
              <copy>
                <from expression="bpws:getVariableData('Receive_JDEFlatfile_Read_InputVariable','body', bpws:getVariableData('Variable_selector'))"/>
                <to variable="Variable_tempJDEPurchaseOrder"/>
              </copy>
            </assign>
            <!-- Transform temp struct required output -->
            <assign name="XForm_tempJDEPurchaseOrder_to_EDIFACT">
              <bpelx:annotation>
                <bpelx:pattern>transformation</bpelx:pattern>
              </bpelx:annotation>
              <copy>
                <from expression="ora:processXSLT('xsl/XForm_tmpJDEPurchaseOrder2EDIFACT.xsl',bpws:getVariableData('Variable_tempJDEPurchaseOrder'))"/>
                <to variable="SendPurchaseOrder_send_InputVariable"
                    part="body"/>
              </copy>
            </assign>
            <!-- Send output to B2B to dispatch -->
            <invoke name="SendPurchaseOrder"
                    inputVariable="SendPurchaseOrder_send_InputVariable"
                    partnerLink="DispatchPurchaseOrder"
                    portType="ns2:B2B_send_ptt" operation="send">
              <bpelx:inputProperty name="b2b.documentProtocolVersion"
                                   variable="Variable_documentProtocolVersion"/>
              <bpelx:inputProperty name="b2b.documentTypeName"
                                   variable="Variable_documentTypeName"/>
              <bpelx:inputProperty name="b2b.toTradingPartnerId"
                                   variable="Variable_toTradingPartnerId"/>
            </invoke>
          </sequence>
        </scope>
        <!-- Increment the index and repeat next node -->
        <assign name="Increment_LoopRunningIndex">
          <copy>
            <from expression="bpws:getVariableData('Variable_LoopRunningIndex') + 1"/>
            <to variable="Variable_LoopRunningIndex"/>
          </copy>
        </assign>
      </sequence>
    </while> 

Thursday, October 14, 2010

Working with DB2 on AS/400

I have a customer kick starting their SOA mobilisation project with the Procurement-to-Payment business process, using Oracle SOA Suite 11g integrating with JD Edwards XE 7.334. Below are some learning.

DBMS on an iSeries is commonly referred to (but I think mistakenly called) DB2, it is not the same as DB2 on AIX or Z/OS.

Before you can access the datasource from Oracle SOA Suite 11g, you will need to download and install the JDBC DB2 for AS/400 from JTOpen.

The current Oracle SQL Developer 2.1.1 do not have support for DB2 for AS/400. Best tool for the simple data analysis is DBVisualizer, the free version but lean on features. However, if you want to perform data migration, export, complex SQL, etc you should checkout SQL-Workbench.

Friday, September 17, 2010

Debugging Oracle BPEL process using Sensors in 11g

Sensor is a great feature if you want customise audit trail or debug BPEL processes. The following use case is logging a custom audit message after a transformation BPEL activity has finished, the steps are as follows:

1. Open the composite application

2. Go into your BPEL process

3. Add a new variable called "AuditMessage"



4. Populate value for AuditMessage, in this case I want to set "ReadMessage process step completed successfully." message to the AuditMessage at ReadMessage process step.



5. Change to Monitor View

6. Create sensor at the ReadMessage process step

7. Label the sensor as "ActivitySensor_ReadMessage"

8. Set evaluation time at Completion

9. Create activity variable sensor

10. Create sensor action

11. Sensor is illustrated with an antena icon

12. Save and deploy your composite application

13. Run your composite application
14. Logon to Oracle Enterprise Manager and navigate to SOA Infra

15. Click on the Instance ID

16. Click on the BPEL component

17. Navigate to Sensor Values tab

Further reading:

Thursday, September 02, 2010

Oracle Fusion Middleware #2

A brief version history:
8i and 8i - The i stands for "Internet" to indicate that 8/9i is "Internet ready".
10g and 11g - The g stands for "grid" to indicate that 10/11g is "grid-computing ready".
11gR2 is the second and terminal release. The common theme for this release is "Consolidate. Compress. Control."

Oracle Corporation has been agressively acquiring best of breed software power house, most recently BEA and Sun Microsystems. What that means for consultants like myself is a rich technology stack for delivering innovative solutions. Software consolidation is still progressing. Here are some tools I was was using this week.

Oracle Weblogic Server:

Oracle Enterprise Manager:

Oracle JRockit Mission Control:

Java VisualVM:

Wednesday, September 01, 2010

Oracle Fusion Middleware #1

My decision to move to Oracle® Fusion Middleware because it integrates well with most customer's existing back-office systems.

Over the next few months I am going to take an in depth view of how Oracle SOA Suite is being applied to SOA and Semantic Integration.

Tuesday, August 17, 2010

Modularisation of the integration services must support reuse across business domains

Integration solutions are means to provide capability exposed as integration services. These services are govern by metadata in the service registry to be use during design-time. Current usage of service metadata is only for binding service contract. An emerging trend is extrapolating service metadata for semantic service discovery in run-time.

Integration services can be extended to meet domain specific business requirements. However, project team needs to factor in service version changes.

Reusable services is the core driver for most of "IT cost reduction" and "lowering cost of ownership" initiatives.

Service-Oriented Architecture (SOA) lays the foundation for reuse of functions through interfaces (refactoring your legacy functions as web services is not SOA enablement).

Service registry must be the starting point in your design options study. Reuse integration services where necessary. Follow policy to obey the service contract and register dependencies against the service. Good Architect must comes up with at least two design options for every solution.

Common processing steps must be separated from the specific requirements of individual products.

User oriented functions must be separated from core business logic processing.

Decision support functions must be separated from transactional processing.

Thursday, August 05, 2010

Integration Architecture must be current and relevant

The Integration Architecture is both a process and the result of the process. The process is iterative and the results are incremental. It will be regularly enhanced, updated and communicated.

Strong Integration Architecture continuity requires constant updates to adapt with Technology, IT trends, economic condition and objectives of the organisation.

Lessons from the past:
  • Development and projects must update the Integration Architecture.
  • There must be a process for the review and assessment of Integration Architecture.
  • Audit by an external consultant on a regular basis.
  • Utilise industry standards.
  • Peer review must be a minimum assurance mechanism for any change to the Integration Architecture.
  • Business and information system strategy must inform Integration Architecture.
  • Industry trends must be considered.
  • The Integration Architecture must capture both the future state and the current state models.
  • Short-term tactical solutions versus long-term strategic solutions must be constantly re-examined.
  • “Just enough architecture, just in time”: The Pareto principle must be embedded within the architecture development cycle, creating an understanding for the application of the 80/20 rule and culture.

Friday, July 30, 2010

autoRefresh() usage in webMethods Composite Application Framework (CAF)

When working with webMethods Designer CAF Development, consider enabling autoRefresh() properties during design-time.

Why? Because reference data or static data that used to populate drop-down options on the UI, enabling autoRefresh() return the results from cache. The underline attributes worked the same as caching in flow services - when the input data changed, only then that the service will invoke the web service connector for the updated result set.


The effect is streamlining the user experience and making navigation between screens alot more responsive.

This property is available in webMethods Designer, My webMethods perspective, under the Bindings tab.

Tuesday, July 13, 2010

Briefing on Issue Management

I have not found the time to attempt the ITIL V3 Foundation certification. But from time-to-time I advised customers on ITIL principles:

Issues can be identified directly or they can eventuate when risks are realised. Issues that cannot be resolved within tolerances (budget, time, quality, scope, etc) may lead to Change Requests.

StepResponsible Role (Group / Title) Required OutputKey Steps
1. Identify All Issue created on issue log, Status set to "Raised"
  1. It is the responsibility of everyone to identify issues that are impacting a project. Identified issues are evaluated with the relevant Project Manager to determine if a true issue exists.
  2. Project Managers then log unresolved issues to the issue log.
  3. The status of the Issue should be set to "Raised"
2. Analyse Project Managers
Risk & Issues Manager
Issue log updated
Priority assigned
Status set to "Assessed"
  1. The full analysis of each issue should occur within one week of the issue being recorded on the issue log.
  2. Ensure a full description of the issue is captured in the issue log.
  3. An initial assessment of the impact of the issue will be made and a priority will be assigned. Issues impacting business as a whole will be escalated to the Risk and Issues Manager. The status of the Issue should be set to "Assessed"
3. Action Project Managers
Risk & Issues Manager
Issue log updated
Priority re-evaluated
Issue Owner assigned
Action Plan defined
Status set to "Assigned"
  1. Each issue is assigned to an appropriate project resource (Issue Owner).
  2. Issue impact and priority is re-evaluated with the Project Manager and stakeholders directly impacted by the issue.
  3. Actions that are considered appropriate to resolve the issue, are defined and an owner for each action is appointed with an appropriate due date for the action.
  4. The action plan must be agreed with the relevant Project Manager and stakeholders.
  5. The status of the Issue should be set to "Assigned"
4. Resolution Issue Owner (Project Team Member) Execution of action plan
Status set to "Resolved"
Issue action plan is executed and progress is reported to the relevant Project Manager (and Risk and Issues Manager) via updates to the issue log and weekly meetings.
5. Monitor & Control Project Managers
Risk & Issues Manager
Issue detail included in status report The monitoring and reporting of issues is an ongoing multi faceted process, this process is defined further in the section below.
6. Close Project Manager (project-level issues)
Risk & Issues Manager (program-level issues)
Status set to "Closed"
  1. Once an issue has been fully resolved it should be closed within the issue log. The originator of the issue must confirm that the issue is resolved before it can be closed. When issues are closed a risk may need to be raised if the issue has the potential to reoccur.
  2. The status of the Issue should be set to "Closed"

Wednesday, July 07, 2010

Virtual scaling pattern

While reading into software architecture to support high dynamic scalability and high availability I stumbled upon on a well-written article, The Impact of Virtualization on Software Architecture by Nishant Thorat and Arvind Raghavendran.

Scalability and high availability has been one of the painful realisation for one of my customer. Three months after go-live they starts to find performance issues and the solution struggling to process large number of business transactions. Amongst the 41-page recommendation report, as a tactical (short-term) resolution I recommended the customer to go with virtual scaling pattern to ease their immediate pain.

Figure source: The Different Paths to Virtualization, Issue 24, The Architecture Journal

Friday, July 02, 2010

What I learn from the Virgin Blue IT incident

There are three major factors determine the quality of a product: the people that
develop a software system, the technology that is employed by them, and the organisation of the process of development. In today's ever growing size and complexity of software projects, steering committee are investing into processes cope with the business stakeholders demand.

High cost project, late delivery, resource dependence are all symptoms of lacking processes.

The role of IT is to deliver software products to the business with minimal disruption. As a customer, I experienced the disastrous go-live of Navitaire New Skies ticketing system at Virgin Blue.

Here is a Release Management process I've developed for many clients to introduce "quality gates" into their SDLC. You may have notice that this process have emphasis on the Quality Assurance Testing phrase, from experience solid testing will yield good outcomes.

Friday, June 25, 2010

Customer engagement template

Regardless whether the customer engagement is one week or one year, I always organise the my files in the following hierarchy. Firstly, it helps you focus on the purpose and customer expectation. Secondly, some customers are difficult being organised allows you to backtrack all your work for justification.
01 Statement of work
02 Research and Analyse
03 Architecture and Design
05 Project Management
06 Project Deliverables
07 Administration
09 Tools
10 References
11 Working
I find one of the most useful tool to keep my notes is Tiddylywiki (www.tiddlywiki.com). It is extremely easy to use and no setup required.

Wednesday, June 16, 2010

SSL certificate in webMethods Software

Generating a SSL Private Key
  1. Install webMethods Certificate Toolkit which can be found in version 6.5 image.
  2. Run webMethods Certificate Toolkit
  3. Use default keysize of 1024 bits
  4. Label filename as MyEnterprise_PrivateKey.der
Generating the SSL Certificate Signing Request (CSR)
  1. Run webMethods Certificate Toolkit
  2. Select the private key generated above
  3. Label the CSR filename as MyEnterprise_CSR.pem
  4. Fill in the Server Information as required
  5. Send the Certificate Signing Request (CSR) to an authorised person who deal commercially with VeriSign.
Extracting SSL certificates from VeriSign's response
  1. Once the purchase of SSL Certificate is complete VeriSign will response with an email
  2. The cert.p7b attachment received from verisign is a PKCS#7 file which contains the CA certificate and the signed/public key, you will need to extract them.
  3. Save this attachment as MyEnterprise.p7b
  4. Double-click on the MyEnterprise.p7b to inspect the certificates, note the expiration date
  5. Double-click CA cetrificate (Issued To=www.verisign.com...)
  6. Navigate to the Details tab
  7. Click on the Copy to File button
  8. Export file as DER encoded binary X.509 format, label filename as MyEnterprise_CA.cer
  9. Rename MyEnterprise_CA.cer to MyEnterprise_CA.der
  10. Double-click CA cetrificate (Issued To=b2b.jemena.com.au...)
  11. Navigate to the Details tab
  12. Click on the Copy to File button
  13. Export file as DER encoded binary X.509 format, label filename as MyEnterprise_Signed.cer
  14. Rename MyEnterprise_Signed.cer to MyEnterprise_Signed.der
Configure SSL certificate support for incoming transactions
  1. Request MyEnterprise's private key, signed/public key and CA certificates from Security Team
  2. Send MyEnterprise's signed/public key and CA certificates to CompanyA
  3. Request CompanyA's signed/public key and CA certificates from CompanyA
  4. Navigate to Reverse Invoke Server > IS Adminstration > Security > Ports > Gateway External
  5. Upload MyEnterprise_PrivateKey.der and MyEnterprise_Signed.der onto Reverse Invoke Server under /IntegrationServer/config/cert/myent directory
  6. Upload MyEnterprise_CA.der onto Reverse Invoke Server under /IntegrationServer/config/cert/cas directory
  7. Under Listener Specific Credentials, select Protocol as HTTPS
  8. Set Server's Certificate as config/cert/myent/MyEnterprise_Signed.der
  9. Set Authority's Certificate as config/cert/cas/MyEnterprise_CA.der
  10. Set Private Key as config/cert/myent/MyEnterprise_PrivateKey.der
  11. Set Trusted Authority Directory as config/cert/cas
  12. Navigate to Internal Server > IS Adminstration > Security > Certificates > Configure Client Certificates
  13. Upload MyEnterprise_Sign.der onto Internal Server under /IntegrationServer/config/cert/com_a directory
  14. Under Import Certificate, set Certificate Path as /IntegrationServer/config/cert/com_a/CompanyA_Signed.der
  15. Set User as Administrator (recommend you create unique user on IS for easy supportability)
  16. Set Usage as SSL Authentication
  17. Click on Import Certificate
Configure SSL certificate support for outcoming transactions
  1. Request v's private key, signed/public key and CA certificates from Security Team
  2. Send MyEnterprise's signed/public key and CA certificates to CompanyA
  3. Request CompanyA's signed/public key and CA certificates from CompanyA
  4. Run webMethods Trading Networks Console, logon to Internal Server
  5. Navigate Enterprise profile > Security > SSL Client
  6. Under Certificate Chain, add MyEnterprise_Signed.der and MyEnterprise_CA.der
  7. Set Private Key as MyEnterprise_PrivateKey.der
  8. Save Enterprise profile
  9. Upload MyEnterprise_CA.der and CompanyA_CA.der onto Internal Server under /IntegrationServer/config/cert/cas directory
  10. Navigate to Internal Server > IS Adminstration > Security > Certificates > Edit Certificates Settings
  11. Under Trusted Certificates, set CA Certificate Directory as config/cert/cas
  12. Save changes
You might have notices the Outbound SSL Certificates section, why is that there? That's only required if you use pub.client:http service to invoke HTTPS URL, the IntegrationServer will act as a client.

Monday, June 14, 2010

Roles and responsibilities

A good Consultant is a subject matter expert (SME) in his role.

So what makes a great Consultant? He who have two or more core competencies and is capable of performing different roles in appropriate situations.
RoleResponsibility
Solution & Enterprise ArchitectsEnterprise and business process architects responsible for defining and maintaining business solution design, enterprise architecture standards and principles
Project/Integration LeadIntegration lead (or the Integration Release and Resource Lead) manages the integration deliverables, resources and planning.
Integration COEConsists of Integration Architects responsible for integration solution consulting and process governance assurance.
Design OwnerDesign owner reports to Integration Release and Resource Lead and responsible for defining integration design as per requirements.
Development OwnerDevelopment owner reports to Integration Release and Resource Lead and responsible for development of solution as per design requirements.
Environment Management & Integration SupportEnvironment management and integration support team is responsible for supporting the integration solution and environment (inc. production). This team also provides feedback in design processes.

Configuring sticky session in CISCO Content Services Switch (CSS) load-balancer

One of the best thing in delivery is engaging in a greenfield project. You discover so much more about the limitation about the product stack.

In this scenario, we are configuring hardware load balancing (CISCO CSS) for the webMethods Integration Server.

Problem: When accessing the instance via the Virtual Internet Protocol (VIP), user is continuously being prompted for credentials.

Facts: This is caused by the TCP three-way handshake and cookie in the webMethods Integration Server.
    • The user browse to the VIP
    • CSS forward the request to Node 1
    • Node 1 send authentication request to the user with a random hex number ssnid=29c4f640596011de9579da14127f22f1 in the HTTP header
    • The user enter his/her credential and submit
    • The browser send the response the CSS
    • CSS forward the response to Node 2
    • Node 2 rejected the response because of unrecognised SSNID
    • Node 2 send authentication request to the user with a random hex number ssnid=b9066b60559411de9034cfa576455f64 in the HTTP header
    • The user enter his/her credential and submit
    • This goes around in an infinite loop.
Unfortunately the CSS cannot load-balance on dynamic cookies.

The customer has configured the CSS to look for a cookie called ‘ssnid=’
owner WMQA-VIP 
  content WMQA-HTTP-N 
    vip address 146.195.84.125 
    add service WMQA-1-HTTP-N 
    port 8080 
    protocol tcp 
    add service WMQA-2-HTTP-N 
    string range 208 to 528 
    string prefix "ssnid=" 
    advanced-balance cookies 

and then told the service to look for the following string;
service WMQA-1-HTTP-N 
  string WMQA-1 

This will not work because the string doesn’t exist in the cookie.

Resolution: The only workaround is to configure the arrowpoint-cookie. This is a cookie generated by the CSS itself and inserted into the TCP stream.

For example the owner and content should look something like this (remove all redundant commands)

service WMQA-1-HTTP-N 
   no  string 
  
owner STICKY-VIP 
  
  content STICKY-WMQA-HTTP-N 
    vip address 146.195.84.125 
    add service WMQA-1-HTTP-N 
    add service WMQA-2-HTTP-N 
    advanced-balance arrowpoint-cookie 
    sticky-mask 255.255.240.0 
    protocol tcp 
    port 8080 
    url "/*" 
    active 

Saturday, June 12, 2010

Right angle bracket (>) in XML Specification

I like to close the discussion about the use of the right angle bracket (>) in XML document. Despite what the the claim "the greater than character is legal, but it is a good habit to replace it" by the w3schools, usage of the right angle bracket must be escaped! It clearly mentioned in the XML 1.0 Specifications:
The ampersand character (&) and the left angle bracket (<) must not appear in their literal form, except when used as markup delimiters, or within a comment, a processing instruction, or a CDATA section. If they are needed elsewhere, they must be escaped using either numeric character references or the strings " & " and " < " respectively. The right angle bracket (>) may be represented using the string " > ", and must, for compatibility, be escaped using either " > " or a character reference when it appears in the string " ]]> " in content, when that string is not marking the end of a CDATA section.

In the content of elements, character data is any string of characters which does not contain the start-delimiter of any markup and does not include the CDATA-section-close delimiter, " ]]> ". In a CDATA section, character data is any string of characters not including the CDATA-section-close delimiter, " ]]> ".
W3C Recommendation, Extensible Markup Language (XML) 1.0 (Fifth Edition), 26 November 2008

Wednesday, June 09, 2010

How to create rule to forward meeting requests?

As a Consultant I often engaged to many customers, I have a hard time keeping track of my meetings. So I'm using my consulting company's exchange server to centralise all my appointments.

I do not believe there is a template for this one. You might have to start with a blank rule. Here is what I did:
  1. Start Microsoft Outlook
  2. Click "Tools", "Rules and Alerts", "New Rule", Start with a blank rule "Check Messages When They Arrive"
  3. Check the box that says "which is a meeting invitation or update"
  4. Click Next
  5. Check the box that says "move it to the specified folder"
  6. Ensure you click on "specified" and choose the correct folder

Tuesday, June 08, 2010

OASIS ebXML version 2.0 implementation

The Advanced Metering Infrastructure (AMI) project in Victoria, Australia is the world first (definitely the first in Asia Pacific) production implementation of OASIS ebXML v2.0. At the time of the post there is one one other client in Europe trialing this standard in pre-production status.

For those who worked in the VicGas market currently supporting ebMS v1.0, don't underestimate ebMS v2.0, because it has significant differences. Before you get started, I advise you to read the following documents:

ebXML Message Service Specification v2.0 - describes the concept, background, objective and core functionality. Two sections in particular are worth noting. First, ebXML with SOAP, this should give you the technical understanding the transport protocol of messages. Second, Reliable Messaging Module, these optional attributes provide guarantee delivery of messages.

ebXML Collaborative Partner Profile Agreement (CPPA) v2.0 - in ebXML v2.0, CPPA is mandatory, so here is one I prepared earlier.





There are currently two commercial adapters available in the market that supported ebXML v2.0:
The logical architecture of your implementation should follow this pattern.


If you have further questions, please don't hesitate to contact me.

Cloning webMethods Integration server

This approach is not supported by Software AG, but its a quick way to replicate another Integration Server instance for testing or proof-of-concept.
  1. Shutdown the source IS
  2. Copy the entire directory across
  3. Delete the folowing directories on the new instance, they will regenerate on first startup
    • Audit/data
    • Logs
    • Datastore
    • Documentstore
    • Replicate (keep directories)
    • Wmrepository2
    • Wmrepository4
    • The lockfile
    • /config/dispatch.cnf & /config/backup/dispatch.cnf
  4. Update the following files to reflect new target IS location and desired port number. The following files need to be modified
    • /IntegrationServer/bin/ini.cnf
    • /IntegrationServer/bin/jcode.sh
    • /IntegrationServer/bin/server.sh
    • /IntegrationServer/config/port.cnf
    • /IntegrationServer/config/server.cnf
    • /IntegrationServer/packages/WmRoot/config/listeners.cnf
  5. That's it!

Configuring webMethods Broker 7.1.2 as a JMS Provider

Increasingly, customers are aware of the value in adopting open standards within their IT infrastructure. 

In middleware Java Message Service (JMS) is the most widely standard used for sending and receiving messages.  It allows components based on Java 2 Platform, Enterprise Edition (J2EE) to create, send, receive, and read messages.

Instructions below is a guide for installing and configuring webMethods Software for JMS compatible.


  1.  Install Integration Server 7.1.2 (localhost:5555) and Broker Server (localhost:6849)
    • Remove all unused packages
    • Add developer account
    • Set Outbound Passwords to 0
    • Set Broker Configuration to Not Configured (restart required)
    • Install WmBrokerAdmin_6_5.zip package
  2. Remove default broker and create ESB JMS broker
  3. MSDOS> cd C:\webMethods712\Broker\bin
    MSDOS> .\broker_delete.exe "Broker #1@localhost:6849"
    MSDOS> .\broker_create.exe ESB@localhost:6849 -default -description "Enterprise Service Bus JMS Broker"
    
  4. Create JMS Connection Alias to ESB@localhost:6849
  5. Modify JNDI properties file (C:\webMethods712\Broker\bin\jndi.properties) to refers to the ESB JMS Broker
  6. java.naming.factory.initial=com.webmethods.jms.naming.WmJmsNamingCtxFactory
    java.naming.provider.url=wmjmsnaming://ESB@localhost:6849
    com.webmethods.jms.naming.clientgroup=admin
    
  7. Create JMS Connection Alias
  8. Connection Alias Name: ESB_JMS
    Enabled: Yes
    Description: Enterprise Service Bus JMS Broker
    Transaction Type: NO_TRANSACTION
    Connection Client ID: HOST_IS
    Create Connection Using: NATIVE WEBMETHODS API
    Broker Host: localhost:6849
    Broker Name: ESB
    Client Group: admin
    
  9. Bind JMS topics to JNDI (so that it can be visible to 3rd JMS)
  10. MSDOS> cd C:\webMethods712\Broker\bin\
    MSDOS> .\jmsadmin.exe -p jndi.properties
    / > conn broker ESB server localhost:6849
    Connected to ESB on localhost:6849
    / > list
    / > create topic testTopic
    / > permit group admin to publish testTopic
    / > permit group admin to subscribe testTopic
    / > bind topic testTopic with tn=testTopic
    / > bind tcf topicFactory with brokerHost=localhost:6849 group=admin brokerName=ESB
    / > list
    [1]: testTopic ==> com.webmethods.jms.impl.WmTopicImpl
    / > quit
    
  11. Create JNDI Provider Alias
  12. JNDI Alias Name: JNDI_ESB
    Description: JNDI for ESB JMS Broker
    Initial Context Factory: com.webmethods.jms.naming.WmJmsNamingCtxFactory
    Provider URL: wmjmsnaming://ESB@localhost:6849
    Other Properties: com.webmethods.jms.naming.clientgroup=admin
    

Macquarie Professional Assessments

While ago I attempted the Macquarie Professional Assessments. Attach is my solution to the Practice Leaflet.

Drive: The surprising truth about what motivates us

Anyone who employs or manages staff in a creative enterprise would be mad to dismiss the ideas in this video.