Enterprise Architecture & Integration, SOA, ESB, Web Services & Cloud Integration

Enterprise Architecture & Integration, SOA, ESB, Web Services & Cloud Integration

Tuesday 25 September 2012

Oracle SOA BPEL Exception Handling - WSDL messageType "{http://schemas.oracle.com/bpel/extension}remoteFault" of variable "" is not defined in any of the WSDL files

Exception handling is an essential requirement while building any robust application. It is true for the application that is built using BPEL also. As you would know, Oracle BPEL supports both business specific exceptions (they are declared in the service WSDL) and run time exceptions (Needless to say, they are NOT declared in the WSDL). This post is about supporting run time exception.

Assume that as part of your BPEL flow, you are invoking a SOAP service that is hosted remotely. When the remote service is not up and running, then BPEL flow will send back a fault to the client. The fault message will be something similar to the following: -

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
   <env:Header/>
   <env:Body>
      <env:Fault>
         <faultcode>env:Server</faultcode>
         <faultstring>oracle.fabric.common.FabricInvocationException: Unable to access the following endpoint(s): http://localhost:9090/axis2/services/StockQuoteService.StockQuoteServiceHttpSoap11Endpoint/</faultstring>
         <faultactor/>
         <detail>
            <exception>Unable to access the following endpoint(s): http://localhost:9090/axis2/services/StockQuoteService.StockQuoteServiceHttpSoap11Endpoint/</exception>
         </detail>
      </env:Fault>
   </env:Body>
</env:Envelope>


This is not a correct behaviour for a good application. The application should catch the exceptions and handle it properly depending on the application requirement. Assume that, in this case, you have to return a default value, say -1, instead of sending exception message.

Oracle BPEL supports this by having 'Add Catch' construct which can be added to the 'Scope' construct where in you actually have defined the 'Invoke' activity. In Oracle SOA suite 11g, when you add 'Catch' construct, it will import a WSDL (namely RuntimeFault.wsdl) that defines the structure of the runtime message automatically. The definition is as given below: -

<?xml version="1.0" encoding="UTF-8"?>
<definitions name="RuntimeFault"
             targetNamespace="http://schemas.oracle.com/bpel/extension"
             xmlns:xsd="http://www.w3.org/2001/XMLSchema"
             xmlns="http://schemas.xmlsoap.org/wsdl/">

    <message name="RuntimeFaultMessage">
        <part name="code" type="xsd:string"/>
        <part name="summary" type="xsd:string"/>
        <part name="detail" type="xsd:string"/>
    </message>
</definitions>


The above message will support catching code, summary and details of the remote exception thrown because of the downtime of the remote service. In this example, we are not going to use any of these three parts (however, it is possible to do that). Alternatively, we are going to catch the exception and return a default value, say -1.

When you define the 'Catch' construct, it will add a line as given below in your .bpel file: -

<variable messageType="bpelx:remoteFault" name="FaultVar"/>

- where FaultVar is the name of the fault variable using which you can  access its child elements - code, summary and detail


After adding Catch construct, now do a 'Deploy' to application server. But you will get an error as given below: -

Error(67): WSDL messageType "{http://schemas.oracle.com/bpel/extension}remoteFault" of variable "" is not defined in any of the WSDL files

So, what went wrong?

Take a look at these two :-
a) FaultVar variable declaration in the bpel file and
b) RuntimeFaultMessage message definition in the RuntimeFault.wsdl.

The FaultVar is of 'bpelx:remoteFaul' type which is not defined anywhere. Instead, RuntimeFault.wsdl defines another messgae type which is of "RuntimeFaultMessage" type. So, solution is simple - just replace 'remoteFault' by 'RuntimeFaultMessage'. It will do the necessary MAGIC!!!

Now, recompile and deploy to application server. The BPEL service will get deployed onto the application server. When you access the service, now you will get the expected response

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing">
   <env:Body>
      <processResponse xmlns="http://xmlns.oracle.com/StockApps/StockMarket/StockMarketProcess">
         <result>-1</result>
      </processResponse>
   </env:Body>
</env:Envelope>


Hope this is useful to you.

Happy Fault Handling!

Monday 17 September 2012

Oracle Business Rules error - Fact not found in the rule engine working memory, rule session execution failed

Recently, I got stuck with the a problem while I was learning Oracle Business Rules. Many of you would have faced this very same issue.

Fact not found in the rule engine working memory, rule session execution failed.
The rule session 60015 failed because an instance of the fact com.oracle.xmlns.rules.insuranceeligibility.ApplicantOutput could not be found in the working memory of the rule session.
This is most likely a rule modeling error. The decision service interaction expects the fact instance to exist in the working memory of the rule session. Check the rule actions in rule designer and make sure that a fact of the expected type is being asserted. If the error persists, contact Oracle Support Services. 60015


I am not intending to create a OBR tutorial page as there several good websites/blogs already available. Herewith I am including only the necessary details.

Please refer to the ruleset which I have created in JDeveloper editor.






There could be several reasons why you got this error. After hours of investigation, I 'accidentally' found the root cause - I have not defined 'else' condition in my rule set. Please find below the modified ruleset.









After the rule modification, now every thing seems to be working fine. Hope this tip will be useful in saving your valuable time. Here is the full BPEL flow for your reference.



Thursday 2 August 2012

javax.mail.MessagingException: Can't send command to SMTP host & 530 5.7.1 Client was not authenticated

One of the easily available sample programs in the net is java mail application that you can use to send automated emails from java application. While running these java mail application program, sometimes you might get several errors - popular one is "Can't send command to SMTP host;".

The complete stack trace is here:-
Exception in thread "main" javax.mail.MessagingException: Can't send command to SMTP host;
  nested exception is:
    java.net.SocketException: Software caused connection abort: socket write error
    at com.sun.mail.smtp.SMTPTransport.sendCommand(SMTPTransport.java:2106)
    at com.sun.mail.smtp.SMTPTransport.sendCommand(SMTPTransport.java:2093)
    at com.sun.mail.smtp.SMTPTransport.close(SMTPTransport.java:1184)
    at javax.mail.Transport.send0(Transport.java:197)
    at javax.mail.Transport.send(Transport.java:124)
    at SendMail.main(SendMail.java:27)
Caused by: java.net.SocketException: Software caused connection abort: socket write error
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(Unknown Source)
    at java.net.SocketOutputStream.write(Unknown Source)
    at com.sun.mail.util.TraceOutputStream.write(TraceOutputStream.java:114)
    at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
    at java.io.BufferedOutputStream.flush(Unknown Source)
    at com.sun.mail.smtp.SMTPTransport.sendCommand(SMTPTransport.java:2104)
    ... 5 more


The sample code that generated the exception above is

import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;

public class SampleSMTPClient1 {

    public static void main(String args[]) throws Exception {

        Properties properties = new Properties();
        properties.setProperty("mail.smtp.host", "localhost" );
        Session session = Session.getDefaultInstance(properties);
        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress("joe.smith@js.com"));
        message.addRecipient(Message.RecipientType.TO, new InternetAddress("jsmith@js.com"));
        message.setSubject("Wishes..!");
        message.setText("Have a great day!");

        System.out.println("Sending Message .....");
        Transport.send(message);
        System.out.println("Message Sent.....");
    }
}



By adding properties.put("mail.debug", "true"), your program can generate lots of debug information. I did so, and then I got all the below mentioned debug information.

DEBUG: JavaMail version 1.4.4
DEBUG: successfully loaded resource: /META-INF/javamail.default.providers
DEBUG: Tables of loaded providers
DEBUG: Providers Listed By Class Name: {com.sun.mail.smtp.SMTPSSLTransport=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Sun Microsystems, Inc], com.sun.mail.smtp.SMTPTransport=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc], com.sun.mail.imap.IMAPSSLStore=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Sun Microsystems, Inc], com.sun.mail.pop3.POP3SSLStore=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Sun Microsystems, Inc], com.sun.mail.imap.IMAPStore=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc], com.sun.mail.pop3.POP3Store=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Sun Microsystems, Inc]}
DEBUG: Providers Listed By Protocol: {imaps=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Sun Microsystems, Inc], imap=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc], smtps=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Sun Microsystems, Inc], pop3=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Sun Microsystems, Inc], pop3s=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Sun Microsystems, Inc], smtp=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]}
DEBUG: successfully loaded resource: /META-INF/javamail.default.address.map
Sending Message .....
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
DEBUG SMTP: useEhlo true, useAuth false
DEBUG SMTP: trying to connect to host "localhost", port 25, isSSL false
220 LOCALHOST Microsoft ESMTP MAIL Service ready at Thu, 2 Aug 2012 10:23:10 +0530
DEBUG SMTP: connected to host "localhost", port: 25

EHLO LOCALHOST
250-LOCALHOST Hello [10.xx.xx.xx]
250-SIZE
250-PIPELINING
250-DSN
250-ENHANCEDSTATUSCODES
250-STARTTLS
250-X-ANONYMOUSTLS
250-AUTH NTLM
250-X-EXPS GSSAPI NTLM
250-8BITMIME
250-BINARYMIME
250-CHUNKING
250-XEXCH50
250 XRDST
DEBUG SMTP: Found extension "SIZE", arg ""
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "DSN", arg ""
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
DEBUG SMTP: Found extension "STARTTLS", arg ""
DEBUG SMTP: Found extension "X-ANONYMOUSTLS", arg ""
DEBUG SMTP: Found extension "AUTH", arg "NTLM"
DEBUG SMTP: Found extension "X-EXPS", arg "GSSAPI NTLM"
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "BINARYMIME", arg ""
DEBUG SMTP: Found extension "CHUNKING", arg ""
DEBUG SMTP: Found extension "XEXCH50", arg ""
DEBUG SMTP: Found extension "XRDST", arg ""
DEBUG SMTP: use8bit false
MAIL FROM:<joe.smith@js.com>
530 5.7.1 Client was not authenticated
DEBUG SMTP: got response code 530, with response: 530 5.7.1 Client was not authenticated

RSET
DEBUG SMTP: EOF: [EOF]
com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.1 Client was not authenticated

    at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:2057)
    at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:1580)
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1097)
    at javax.mail.Transport.send0(Transport.java:195)
    at javax.mail.Transport.send(Transport.java:124)
    at SendMail.main(SendMail.java:29)
QUIT

Now it is pretty much clear that client authentication is required. Otherwise your SMTP server will not allow you to send emails. Now, the question is - how do we pass the credentials required for the client authentication. While there may be other way possible, I have followed the below one and got it working.

You have to make two changes to the above code:
a) Add properties.put("mail.smtp.auth", "true");
b) Implement an authenticator class

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;

public class SMTPAuthenticator extends Authenticator { 
 
    protected PasswordAuthentication getPasswordAuthentication() { 
        return new PasswordAuthentication("username", "password"); 
    } 


The modified mail client program is as below: -

import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;

public class SampleSMTPClient2 {

    public static void main(String args[]) throws Exception {

        Properties properties = new Properties();
        properties.setProperty("mail.smtp.host", "localhost" );

properties.put("mail.smtp.auth", "true");
        Session session = Session.getDefaultInstance(properties, new SMTPAuthenticator() );
        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress("joe.smith@js.com"));
        message.addRecipient(Message.RecipientType.TO, new InternetAddress("jsmith@js.com"));
        message.setSubject("Wishes..!");
        message.setText("Have a great day!");

        System.out.println("Sending Message .....");
        Transport.send(message);
        System.out.println("Message Sent.....");
    }
}


Now rerun the program. Hope this works for you as well!

Tuesday 24 July 2012

Apache SSL configuration with sample


Many a times, you might want to set up an Apache httpd server as front end that talks to back end application servers such as Oracle WebLogic or Apache Tomcat. While httpd acts as a proxy, you might also want to use it as an SSL server. It will ensure that the communication between browser and apache httpd is secure. But, have you ever thought how easy it is to set up SSL using apache? Believe me, it is really easy. Apache configuration is so powerful (I agree, sometimes it is painful if you don’t know what you are usingJ) and needs very minimal configuration.

The minimum things that you would need are: -
a) Server certificate
                - Your browser user can identify which server he/she is connecting to. This is PEM encoded certificate. If you open the certificate in an editor like notepad, you can see scrambled text which starts with -----BEGIN CERTIFICATE----- and ends with -----END CERTIFICATE-----.

b) Private key to decrypt the encrypted data
                - Please make sure that your private key is kept secure. You can use key that use either RSA or DSA.

c) Certificate chain from your certificate authority
                - The end certificate in the chain will be a root certificate. If you don’t have the complete chain, SSL might not work.

If you have all the above, then you can easily set up 'one-way' SSL which is otherwise known as 'Server authentication'. Please see below the snippet that is the minimal configuration required:

Listen 443
<VirtualHost *:443>
     SSLEngine on
     SSLCertificateFile public.crt
     SSLCertificateKeyFile private.key
     SSLCertificateChainFile intermediate.crt      
</VirtualHost>

The mod_ssl module also allows you to access certain environment variables which you may use them for debugging purpose. Use the following line that will allow you to create a separate log file for capturing SSL related information. You may also decide to switch on logging only in development.

CustomLog logs/ssl_request_log "%t %h %l %u %{SSL_PROTOCOL}x %{SSL_CIPHER}x %{HTTPS}x %{REFERER}i %{X-Forwarded-For}i \"%r\" %s %b"

One common issue that every one might face is with configuring 443 for SSL. you might get an error that is given below: -
(13)Permission denied: AH00072: make_sock: could not bind to address xx.xxx.xx.xx:443
no listening sockets available, shutting down
AH00015: Unable to open logs

Please make sure that you have 'root' access which is required for using standard ports 80 for http and 443 for https.

Hope this information will be useful for you. 

Wednesday 20 June 2012

Configure apache (2.4.2) load balancer with virtual hosts

My boss asked me couple of days ago to configure apache load balancer. It has been some time since I have done one. I could still remember most of the things, so started making changes to httpd configuration files (thanks to so many site/blogs including apache official site offering help on load balancer configuration). The journey is so far nice. Here is my initial load balancer configuration (all important lines, if not all, are shown here) -

My server needs to be configured with two virtual hosts listening on 8081 and 9081 respectively.

Listen 8081
Listen 9081

ProxyRequests off
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so

#LoadModule proxy_scgi_module modules/mod_proxy_scgi.so
#LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule rewrite_module modules/mod_rewrite.so

LoadModule headers_module             modules/mod_headers.so
LoadModule status_module             modules/mod_status.so

LoadModule lbmethod_byrequests_module     modules/mod_lbmethod_byrequests.so
 

<Proxy balancer://mycluster8081>
  BalancerMember http://myserver1:6001
  BalancerMember http://myserver1:7001
  BalancerMember http://myserver2:6001
  BalancerMember http://myserver2:7001

 </Proxy>

<Proxy balancer://mycluster9081>
  BalancerMember http://myserver3:6001
  BalancerMember http://myserver3:7001
  BalancerMember http://myserver4:6001
  BalancerMember http://myserver4:7001
</Proxy>

<Location /manager>
    SetHandler balancer-manager
</Location>

<VirtualHost *:8081>
    ProxyPass /myportal balancer://mycluster8081/myportal
    ProxyPassReverse /myportal balancer://mycluster8081/myportal
</VirtualHost>

<VirtualHost *:9081>
    ProxyPass /myportal balancer://mycluster9081/myportal
    ProxyPassReverse /myportal balancer://mycluster9081/myportal
</VirtualHost>


I restarted the server and I encountered my first issue - the server refused to start after spitting an error "AH01177: Failed to lookup provider 'shm' for 'slotmem': is mod_slotmem_shm loaded??". After spending time on investigation, I have added the following module (which has been added in 2.4.x, it didn't exist in 2.2.x) -

LoadModule slotmem_shm_module modules/mod_slotmem_shm.so

Now, I got the second problem, bigger than the first one - "(22)Invalid argument: AH01186: worker slotmem_grab failed". After googling, I have found that this is an existing issue with 2.4.x. The technical details can be obtained from here https://issues.apache.org/bugzilla/show_bug.cgi?id=52402

What was working in 2.2.x is not working now in 2.4.x, but Apache keeps adding more features and improving its existing features too. So, this happens. However, as I am running against time, I can't wait till someone fixes this issue, so tried searching for a workaround. After several attempts by changing the configuration, there seems to be a workaround available - move all proxy balancer stuffs into respective VirtualHost configuration. Please see below the modified configuration -

Listen 8081
Listen 9081

ProxyRequests off
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so

#LoadModule proxy_scgi_module modules/mod_proxy_scgi.so
#LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule rewrite_module modules/mod_rewrite.so

LoadModule headers_module             modules/mod_headers.so
LoadModule status_module             modules/mod_status.so

LoadModule lbmethod_byrequests_module     modules/mod_lbmethod_byrequests.so LoadModule slotmem_shm_module modules/mod_slotmem_shm.so


<Location /manager>
    SetHandler balancer-manager
</Location>

<VirtualHost *:8081>
<Proxy balancer://mycluster8081>
   BalancerMember http://myserver1:6001
  BalancerMember http://myserver1:7001
  BalancerMember http://myserver2:6001
  BalancerMember http://myserver2:7001
</Proxy>

    ProxyPass /myportal balancer://mycluster8081/myportal
    ProxyPassReverse /myportal balancer://mycluster8081/myportal
</VirtualHost>

<VirtualHost *:9081>
<Proxy balancer://mycluster9081>
BalancerMember http://myserver3:6001
  BalancerMember http://myserver3:7001
  BalancerMember http://myserver4:6001
  BalancerMember http://myserver4:7001
</Proxy>

    ProxyPass /myportal balancer://mycluster9081/myportal
    ProxyPassReverse /myportal balancer://mycluster9081/myportal
</VirtualHost>

At least this workaround will keep you move forward till you get the official fix. (At least, a new patch is not an option in my case). Hope this workaround works for you. If not, please respond to me.

Tuesday 28 February 2012

Boomi: How to modify an atom's memory or debug a custom connector?


Have you ever stuck without knowing how you could increase the heap memory size of your Boomi Atom or how you could debug a custom connector which you have developed for integrating your organization specific custom application that is not supported by available Boomi connectors? Then, this post will be handy for you if you were not able to get the advice from the Boomi site directly.

When you install Boomi atom in your local machine, it comes with 512MB configuration by default. The configuration details are captured in a file namely atom.vmoptions. This file can be located at  <atom_install_dir>/bin folder and be opened using a text editor. This is the same place you would want to modify the configuration to enable the debug functionality. The following lines need to be added to the existing configuration.

-Xdebug
-Xnoagent
-Djava.compiler=NONE
-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000

Please do not forget to stop and start (or alternatively restart) your atom to effect these changes. Then comes the next question - how can you check if the configuration is successful. It is very simple to validate. In AtomSphere portal, please go to Manage -> Atom Management -> Atom startup properties. You can see the modified value for heap memory. Now that the debug port (8000) is enabled and you can connect from your IDE (for example Eclipse) to port number 8000 to start debugging your application.

The above should be very straight forward and you should be able to make it in the first time itself. If at all you face any issue, it could be that you are using Windows 7 and have installed your atom in the default location i.e., c:\Program Files. A simple solution is to install your atom outside 'Program Files' folder.Hope this post is useful

Monday 30 January 2012

Simple and Quick Enterprise Integrations using Dell Boomi


Enterprise Integration Challenges

In the midst of an incredibly challenging economic climate, ‘change’ has been a hot topic around the world. Enterprises worldwide have been undergoing changes because of internal challenges and external challenges because of mergers and acquisitions (M&A). The application landscape is getting really complex where in several applications are redundant, isolated and not fully leveraged in the enterprise.

Enterprise Integration (EI) is the need of the hour as it plays a very critical role in bringing People, Process and Technology together to deliver an efficient enterprise with business agility and IT flexibility. Enterprise architecture frameworks such as TOGAF also play a major role in providing tools and methods to effect a smooth and seamless integration at an enterprise level.

Adding to the complexity of IT application landscape is the ever increasing popularity of ‘cloud’ applications. While enterprises move some of the functions such as CRM to cloud, rest of the applications are very much still in the premise behind the firewall. This presents us a very interesting problem – data synchronization between cloud and on-premise applications. There are several ways of addressing the problem from building Point-to-Point (P2P) connections between applications to centralized Enterprise Service Bus (ESB) based integrations.

While P2P seems a good solution for small scale integrations, it brings forth with few critical issues – create resources ‘critical’, scatter mediation capabilities such as data connectivity, transformation, enrichment etc. and needless to say, maintaining the hardwired code.

Service-oriented Architecture (SOA) based Enterprise Service Bus solves the scattered message processing logic by centralizing them and leveraging them for present and future integrations. They are secular in providing connectivity to all possible applications. However, the challenges are steep learning curve, heavy upfront capital expenditure and slow time to market.

It is evident from past several customer engagements that the customers are not really looking for highflying, hyped technologies, or expensive tools but they are really looking for simplified integrations, faster time to market, more productivity, small learning curve and very importantly lower capital expenditure.

Complex problems do not need a complex solution. They actually need a simple solution with great innovation. Here is my attempt to introduce you to one such solution – Boomi and provide you a very quick overview of Boomi and how it could help enterprise customers in achieving quick integrations.

Boomi – A cloud integration platform

Boomi is a latest acquisition from Dell in the cloud space. Dell Boomi is an on-demand, cloud integration platform that connects your on-premise applications with cloud applications such as Salesforce.com, Sugar CRM and so forth. What is really fascinating is that its graphical user interface (with drag & drop feature) enables any integration designer with no or little knowledge of programming languages to create integration processes to move data from one application to another in a real quick time.

Boomi Core components



Process

Integration process is the heart of Boomi integrations. The deliverable of any integration in Boomi’s context is the integration process. The process is like a mini workflow that is woven visually by connecting several connectors, data maps and routing logics. It connects to different applications and moves the data from source applications to destination applications. In between applications, you can have if loops, business rules, data transformation, exception handling etc. Depending on your preference, you could follow either top down approach – start with creating process and then other required components or bottom up approach – start with creating required components first followed by creating the integration process.

Interface

Once the integration process is created, it can be accessed in following ways: -

API – Certain applications might want to get the data in real time. In order to fulfill this, Boomi allows you to expose integration process as a Web Services. Using Web Service Server connector, you will be able to turn your integration process into a Web Service. Only the deployed process will be available as Web Services. Once the Web Service is exposed, it is ready for consumption. All that you will need is a SOAP client to create and send SOAP request to Boomi web service. For beginners, please consider using SoapUI tool to test the Web Services. It does not force you to write single line of code. The description of the Web Service (WSDL) can be accessed through this link http://<boomi_atom_host>:8080/ws/soap?wsdl.

Scheduler – you can also schedule the integration process to run at regular intervals. In order to schedule a process, it should have been already deployed. There are several options for scheduling a process – scheduling from once a day to once a minute. You can also schedule only on particular days(s) on a week. Please see official documentation for more information.

Mediation

In a secular enterprise application landscape, applications implements different technology and use different data formats. Boomi understands this and supports co-existing of applications by providing diverse connectivity and data transformation features.

Connector – Boomi has a rich set of connectors that support nearly all popular applications. Boomi connectors are classified as standard connectors and application connectors. Standard connectors provide connectivity to standard data sources in the enterprise such as AS2, Database, Disk, FTP, HTTP, JMS, LDAP, Mail, SFTP and Web Services. The list is not limited and is still growing. As you would understand, these connectors will allow you to connect to data sources within the firewall and web applications outside the firewall as well. Boomi also supports several popular applications such as Salesforce, SAP, NetSuite and so forth. For complete list, please see the official documentation.

Data Profile & Data Map – Data profile is used to capture the structure of the message that comes into or goes out of Boomi integration process. As of now, profiles can be created for different types of data – XML, Database, EDI, Flat file. Once profiles are created, you would be allowed to do a field mapping that aids in data transformation and enrichment. Boomi supports all types of transformation for example, XML to XML or XML to Database, Flat file to XML and so forth.  Field mapping is a nice UI that helps you visually design the mapping between fields present in the source and the destination profiles. It also supports applying certain functions such as string, mathematical etc. in the field mapping. For example, string function ‘toUppercase’ can be applied to a field so that the destination profile gets all the characters in uppercase. Data maps and profiles are very important constructs that you will use in almost all integrations involving applications like Salesforce.com.

Data Process is useful feature for data manipulation. It allows you to manipulate the data inside the process. If the incoming document is a flat file document, you can use data process to split the entire document into multiple documents – one document per row. This is not all. It provides several useful functions such as zipping/unzipping, PGP encryption, Base 64 encoding and so on.

Route supports a much needed ‘content based routing’. This feature can route the incoming request messages to different destination applications based on certain content in the incoming message. My colleague’s favorite example for content based routing is Forex rate conversion. If the Forex rate conversion involves a small amount, the request may be forwarded to a ‘cached’ Forex rate service. If the amount is large, then the request may alternatively be sent to a ‘real time’ Forex rate service that gives most accurate Forex rate. This helps in avoiding any potential Forex loss due to volatility.

Boomi also supports business rules. It allows you to execute one or more business rules and depending on the outcome of execution, the request can follow either of the two paths – true or false. The rule creation is supported by very intuitive user interface. The feature also allows creating a custom error message that can be accessed in nodes in the down for error reporting purpose.

Exception step provides you the control to stop the process flow execution. It also allows creating custom error messages that will be captured in the process reporting. These messages can be used for further troubleshooting. The customer error message can be a static message and/or dynamic message.

Do you have too many messages to be processed and worried about the execution time? Boomi has a solution for that as well. Flow control step will allow you to execute the incoming documents in multiple threads. However this feature has been disabled in Test mode.

That’s all? No, it has so many other useful features as well. Please refer to official documentation.

Platform

AtomSphere - an on-demand integration platform available as a service. It allows companies to build, deploy and manage integration processes directly from the web. It does not matter whether you are in need of integration applications which are on the cloud or on-premise. It enables both
  • Cloud to cloud integration
  • Cloud to on-premise integration

It offers easy to create and manage integrations, subscription based services. Its nice user interface will help you in moving away from code based integrations to configuration based integrations. Getting started with using Boomi AtomSphere is really simple. Just get access to it by opening a trial online account now at https://ondemand.boomi.com/application/registration.php

Boomi Atom - a runtime component that runs all integration processes. It is small but very powerful and self-contained; once your integration process is deployed onto the atom, it has all required components to execute the integration processes.

Depending on your organization’s integration requirement, your atom can be installed into the cloud or on-premise.
  • Atom in the cloud – this is ‘pure’ cloud approach. All your applications are in the cloud and so is the atom. Atom will be installed in the Dell Boomi data center. Hence, your organization will have zero footprint of software as everything is on the cloud
  • Atom in on premise – this is very much required when part or all of your applications are behind the firewall. For example, database. In this case, atom is also required to be installed behind the firewall so that atom can connect freely to inside applications using respective protocols and connect to outside applications over internet. Your organization firewall should allow connecting to applications which are located in the internet

Molecule - a single tenant, clustered atom that runs integration processes in parallel. It provides both load balance and fail over features. Atoms that are installed in different machines can be grouped to create a molecule. The molecule configurations are very useful for handling high volume of transactions and improve overall performance. However this feature is available only in the high end Boomi edition.

Non-functional features

Security - For any cloud application, one would always wonder about the data security. Boomi does not store any customer data and it simply transfers data from source applications to destination applications. Also, it uses secure protocols such as SFTP, HTTPS to transport data between applications.

For cloud atom that runs in the Boomi data center, it is very secure and it adheres to partner security requirements. The data center is also deemed SAS 70 Type II compliant.

For local atom that runs in on-premise, the data is on the customer server, the atom is behind the firewall and the organization data center will ensure the security.

The above ensures that data is secured both in the server and in the transit.

Monitoring & Managment - For any complex system, monitoring and management are key issues. One would want to gain visibility into an integration process – execution status, error message etc. Boomi AtomSphere provides a console through which process can be monitored.

Atom Management console will allow to monitor the status of the atom, configuration, web server settings, and heap memory, stop/resume the scheduling of deployed integration processes. It also allows you to subscribe to RSS feeds for getting the atom status and process errors. For real time message processing, atom has a built in web server that listens on default port number 8080. You can modify the port number here if it clashes with other application servers’ port number.

Process reporting helps you in obtaining information on the running or already finished running integration processes. It provides filters to search for details of one process or all processes from one or more atoms. You can also apply time filter such as ’Past Hour’, ‘Past 24 Hours’ etc., to limit the number of search results.

Boomi features

Boom is really an innovative offering from Dell and it has all necessary features to support cloud and on promise integrations. To name few very important features of Boomi,
  • Simplified integrations using visual designer and drag & drop features
  • Self-service portal, with minimal IT involvement
  • Subscription based cloud solution to integrate on-premise applications quickly with other cloud applications
  • No hardware or software to install or maintain and no need to maintain patches and upgrades
  • Ready to use connectors available for almost all popular applications
  • Supports both on-premise and cloud applications integration
  • Supports routing, field mapping and Transformation of messages
  • Highly scalable and secure

Boomi Benefits

  • Less Learning Curve
  • Reduced integration life cycle
  • Quick time to market
  • Convert CAPEX into OPEX

Want to know more about Boomi?

This article is just an attempt to give you a quick overview of Boomi’s architecture, feature and benefits. Boomi is really a great platform and it is much more than what is described over here. I know you will really be tempted to read more to understand and try the benefits of Boomi in your enterprise. There is a 30 day free trial license available at https://ondemand.boomi.com/application/registration.php. To help you get going, there is a ‘help‘ documentation available at http://help.boomi.com and support any questions there is a forum as well at http://www.boomi.com/forums/. What more you can ask for, get started today.

Disclaimer

The views and opinions expressed in this article are entirely of the author's and do not necessarily represent the views of the company that he works for. This article has been written from a user perspective and from author’s personal experience and you are advised to read official documentation for more accurate information.