Salesforce and Fuse: Rolling your own ESB
by Patrick Connelly posted on January 19, 2016
There are lots of reasons why you would want to send data from Salesforce to a third party system. A simple example that comes to mind is to index your Salesforce data for external searching. Now, there are lots of 3rd party companies that you can do integration with, but most of these are externally hosted and do not give you the granular control that you may want or they may not give you access to your backend systems in a way you want.
Salesforce and Fuse
This is where JBoss Fuse comes into play. JBoss Fuse is an open source, lightweight and modular integration platform with a new-style Enterprise Service Bus (ESB) that supports integration beyond the data center. If you have Java experience you can take incoming messages from Salesforce and push them into Fuse. The integration of Salesforce and Fuse will allow you then take your Salesforce data and push it or modify it however you see fit.
Getting Started
Since this type of integration is highly subjective I will not go into much detail about how to write the actual integration part but I will show you how to get started taking Salesforce messages and accepting them in Fuse.
Prerequisites
You will need to have installed and configured the following:
- JBoss Fuse
- Maven
- git
You will also need a publicly routable IP address or hostname. It is important that this address be accessible from the Internet at large so that messages can be delivered. Using your local address (192.168.1.15 for example) will NOT work.
Salesforce configuration
Inside of Salesforce you need to determine what object you want to send messages from. You’ll then create an outbound message under Setup ⇨ Workflow & Approvals ⇨ Outbound Messages
After selecting your object you’ll set the name, the endpoint and select the fields you want to send with the outbound message
Then we’ll want to download the WSDL to use in our Fuse instance. This file will be used later so don’t misplace it! (or you’ll just be back here again trying to remember where you downloaded it from)
Now that we have a new outbound message, we need to send our message when something happens. For this example we want to send a message anytime an update occurs to the case. So we’ll create a workflow that fires on all updates.
Now we’ll add the existing action of our outbound message
Now we’ll send an outbound message for every update that happens on a case (just don’t forget to activate it).
Fuse configuration
Now that we have a outbound message being generated from our Salesforce instance, let’s set up a place for those messages to go. You’ll want to clone the salesforce-fuse git repository. This will give you the base framework you need to accept your message and process them. After cloning the repository, take your WSDL from before and replace the OutboundMessage.xml in the repository.
Now we’ll build it. Simply run mvn clean install
to build our repo.
Then import it into Fuse with the following commands
features:install cxf
osgi:install -s mvn:com.example.salesforce/soap/${project.version}
Now the /cxf/Salesforce endpoint should be available. If you update or create a case in your org and watch the osgi:log
command you’ll see the Case Number and Subject being logged out.
Next Steps
After you’ve got it set up, you’ll want to customize it to do what your company needs. This could be pushing the message to a Camel queue, calling another web service, writing it to a database, etc. You’ll want to start your code execution path in the NotificationBindingImpl.java class. If you want to reject a message, you’ll want to change the return from true to false
Considerations
This is a true messaging platform. Because of this there is retrying natively built into the platform. You can check the status of your messages to see if any are failing by looking under Monitor ⇨ Outbound Messages. Also, if you only have a single messaging endpoint setup (or you don’t want to have your developer messages going to a production host), you may want to look at the salesforce-blackhole app. This will accept any message and will simply return back OK regardless of it’s content.