Monday, March 12, 2018

Exception in thread "main" java.lang.NoSuchMethodError: org.slf4j.helpers.MessageFormatter.format(Ljava/lang/String;Ljava/lang/Object;)Lorg/slf4j/helpers/FormattingTuple;Jcr2davRepositoryFactory

I was getting the below exception while connecting to AEM JCR repository through Java API(JCR webdav) using Jcr2davRepositoryFactory.

Exception in thread "main" java.lang.NoSuchMethodError: org.slf4j.helpers.MessageFormatter.format(Ljava/lang/String;Ljava/lang/Object;)Lorg/slf4j/helpers/FormattingTuple;
at org.slf4j.impl.Log4jLoggerAdapter.debug(
at org.apache.jackrabbit.jcr2spi.Jcr2spiRepositoryFactory$RepositoryConfigImpl.getCacheBehaviour(
at org.apache.jackrabbit.jcr2spi.Jcr2spiRepositoryFactory$RepositoryConfigImpl.<init>(
at org.apache.jackrabbit.jcr2dav.Jcr2davRepositoryFactory.getRepository(
at org.apache.jackrabbit.jcr2dav.Jcr2davRepositoryFactory.getRepository(
at workarea.core.GetRepositorySize.main(

To fix the issue add the slf4j-log4j12 with lower version and also exclude jcl-over-slf4j from jackrabbit-jcr2dav dependency.

<!-- -->

Wednesday, February 21, 2018

Caused by: java.lang.NoClassDefFoundError: javax/management/InstanceAlreadyExistsException while connecting to Oracle Database from OSGI - Adobe Experience Manager(AEM)

Caused by: java.lang.NoClassDefFoundError: javax/management/InstanceAlreadyExistsException while connecting to Oracle Database from OSGI - Adobe Experience Manager(AEM)

I was getting the below exception while connecting to the Oracle 11g database using ojbdc6.jar from OSGI in Adobe Experience Manager(AEM)

20.02.2018 15:43:39.259 *INFO* [CM Event Dispatcher (Fire ConfigurationEvent:] day.commons.datasource.jdbcpool Configuring and activating data source with name=SampleOracleDS
20.02.2018 15:43:39.260 *ERROR* [CM Event Dispatcher (Fire ConfigurationEvent:] day.commons.datasource.jdbcpool [] The activate method has thrown an exception (java.lang.IllegalArgumentException: Cannot initialize driver 'oracle.jdbc.driver.OracleDriver')
java.lang.IllegalArgumentException: Cannot initialize driver 'oracle.jdbc.driver.OracleDriver'
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.felix.scr.impl.helper.BaseMethod.invokeMethod(
at org.apache.felix.scr.impl.helper.BaseMethod.access$500(
at org.apache.felix.scr.impl.helper.BaseMethod$Resolved.invoke(
at org.apache.felix.scr.impl.helper.BaseMethod.invoke(
at org.apache.felix.scr.impl.helper.ActivateMethod.invoke(
at org.apache.felix.scr.impl.manager.SingleComponentManager.createImplementationObject(
at org.apache.felix.scr.impl.manager.SingleComponentManager.createComponent(
at org.apache.felix.scr.impl.manager.SingleComponentManager.getService(
at org.apache.felix.scr.impl.manager.SingleComponentManager.getServiceInternal(
at org.apache.felix.scr.impl.manager.SingleComponentManager.getService(
at org.apache.felix.framework.ServiceRegistrationImpl.getFactoryUnchecked(
at org.apache.felix.framework.ServiceRegistrationImpl.getService(
at org.apache.felix.framework.ServiceRegistry.getService(
at org.apache.felix.framework.Felix.getService(
at org.apache.felix.framework.BundleContextImpl.getService(
at org.apache.felix.scr.impl.manager.SingleRefPair.getServiceObject(
at org.apache.felix.scr.impl.helper.BindMethod.getServiceObject(
at org.apache.felix.scr.impl.manager.DependencyManager.getServiceObject(
at org.apache.felix.scr.impl.manager.DependencyManager.invokeUnbindMethod(
at org.apache.felix.scr.impl.manager.SingleComponentManager.invokeUnbindMethod(
at org.apache.felix.scr.impl.manager.DependencyManager$MultipleDynamicCustomizer.removedService(
at org.apache.felix.scr.impl.manager.DependencyManager$MultipleDynamicCustomizer.removedService(
at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.customizerRemoved(
at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.customizerRemoved(
at org.apache.felix.scr.impl.manager.ServiceTracker$AbstractTracked.untrack(
at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.serviceChanged(
at org.apache.felix.framework.util.EventDispatcher.invokeServiceListenerCallback(
at org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(
at org.apache.felix.framework.util.EventDispatcher.fireServiceEvent(
at org.apache.felix.framework.Felix.fireServiceEvent(
at org.apache.felix.framework.Felix.access$000(
at org.apache.felix.framework.Felix$1.serviceChanged(
at org.apache.felix.framework.ServiceRegistry.unregisterService(
at org.apache.felix.framework.ServiceRegistrationImpl.unregister(
at org.apache.felix.scr.impl.manager.AbstractComponentManager$3.unregister(
at org.apache.felix.scr.impl.manager.AbstractComponentManager$3.unregister(
at org.apache.felix.scr.impl.manager.RegistrationManager.changeRegistration(
at org.apache.felix.scr.impl.manager.AbstractComponentManager.unregisterService(
at org.apache.felix.scr.impl.manager.AbstractComponentManager.doDeactivate(
at org.apache.felix.scr.impl.manager.AbstractComponentManager.deactivateInternal(
at org.apache.felix.scr.impl.manager.SingleComponentManager.reconfigure(
at org.apache.felix.scr.impl.manager.SingleComponentManager.reconfigure(
at org.apache.felix.scr.impl.config.ConfigurableComponentHolder.configurationUpdated(
at org.apache.felix.scr.impl.config.ConfigurationSupport.configurationEvent(
at Source)
Caused by: java.lang.NoClassDefFoundError: javax/management/InstanceAlreadyExistsException
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Unknown Source)
at java.lang.Class.getConstructor0(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
... 54 common frames omitted
Caused by: java.lang.ClassNotFoundException: not found by [446]
at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(
at org.apache.felix.framework.BundleWiringImpl.access$400(
at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(
at java.lang.ClassLoader.loadClass(Unknown Source)
... 59 common frames omitted

Based on the analysis the classes required by the ojdbc.jar is missing in the generated bundle.

Steps to fix the issue -

Refer the following post for complete steps to integrate Adobe Experience Manager(AEM) with Oracle Database -

Add the below Import-Package in META-INF\MANIFEST.MF file

Import-Package: javax.sql, javax.naming,, org.ietf.jgss


  • Generate the bundle by adding the above configuration(Export --> Deployable plug-ins and fragments)
  • Delete the bundle if already exist in the server
  • Install the updated bundle
  • Restart the server
  • Test the integration

How to extend the OOB Adobe Experience Manager(AEM) Hybris connector

How to extend the OOB Adobe Experience Manager(AEM) Hybris connector

This video explains the details on extending the OOB Adobe Experience Manager(AEM) Hybris connector with custom functionalities

Saturday, February 17, 2018

Approach to implement content preview environment in Adobe Experience Manager(AEM)

Approach to implement content preview environment in Adobe Experience Manager(AEM)

By default Adobe Experience Manager(AEM) not provides the preview instance to preview the content before publishing to live environment but most of the cases preview is required before publishing the content to live environment.

This post explain the approach to preview and approve the content before publishing to live environment.

The below diagram explains the preview flow


  • Author creates the content in production author and start the workflow
  • Workflow sends the content to Stage author and Publishers
  • Workflow assign the task to approver group and send the notification email
  • Approver reviews the content in stage environment and approve or reject the content (workflow)t - provides the detailed information for rejection
  • if the content is approved 
    • Workflow sends the approved content to production publishers.
  • If the content is rejected
    • Workflow assign the task to author and sends the notification
    • Author review the details and completes the workflow
    • Start the process again by correcting the content

Define Replication process step with ECMA script:

Create ecma file replicate.ecma under /etc/workflow/scripts/<<application>>  e.g. /etc/workflow/scripts/blog - This ecma script helps to replicate the content to stage environments

var workflowData = workItem.getWorkflowData();
var path = workflowData.getPayload().toString();
var session = workflowSession.getSession();

var replicator = sling.getService(;
var options = new;

for(var i=0;i<args.length;i++) {
    var agent= args[i];
    var filter = new;
    try {
        replicator.replicate(session,, path, options);
} catch(e) {
    log.error("Cannot replicate page : " + path +"on publisher. (agentId: " + agent + "): " + e);


Saturday, January 27, 2018

How to integrate Adobe Experience Manager(AEM) and SAP Hybris through OOB connector

How to integrate Adobe Experience Manager(AEM) and SAP Hybris through OOB connector

This post explains the detailed steps for AEM and Hybris integration through OOB connector. AEM comes with default Hybris connector and sample demo site(should be downloaded via package manager), the steps covered in the post is for integrating AEM 6.3 with Hybris 6.1 but the same steps works for other AEM and Hybris versions with minimal changes.

AEM Configuration:

Install JDK 8
Install AEM 6.3 server
Install, and packages from package share (I am considering geo-metrixx for demo, we.retail should be the recommended one in AEM 6.3)


Change the Hybris server version in "Day CQ Commerce Hybris Configuration", ignore to default value if the specified version is not listed.


Change the Hybris OAuth endpoint in "Hybris OAuth Handler" based on the Hybris version, /authorizationserver/oauth/token for Hybirs 6 and later and /rest/oauth/token for earlier Hybris versions   - This step can be ignored for AEM 6.3 as the connectes defaults the values based on the Hybris version selected in the previous step.


If the OAuth URL is not configured with correct value then the below exception will be displayed in error log

com.adobe.cq.commerce.hybris.impl.OAuthHandler Server did not respond with 2xx -> authentication failed.

Saturday, January 20, 2018

Re-Fetching Flush Agent in Adobe Experience Manager(AEM)

Re-Fetching Flush Agent in Adobe Experience Manager(AEM)

This video explains the details on Re-Fetching Flush agent on Adobe Experience Manager(AEM).

Friday, January 19, 2018

Serving the static resources through different domains(Cookie less Domains) - Adobe Experience Manager(AEM)

Serving the static resources through different domains(Cookie less Domains) - Adobe Experience Manager(AEM) 

This post will explain the approach to improve the page load time of the websites through serving static resources via multiple cookie less domain.

The page load time of the website directly related to the number of resources requested to render the page in browser, most of the cases the browser makes multiple calls to receive the related resources.

The browser is restricted with number of default simultaneous connections per server, if the number of resources requested in the same domain is more then that will delay the page load time - the resources are loaded sequentially(this restriction is more for HTTP 1.1 but HTTP 2 protocol support parallel downloading). This issue can be addressed by distributing the static resources across multiple domains that will intern increase the parallel download of resources.

The static resource to be on a cookie-less domain that makes the content load faster. The Cookies are uploaded with every request on a domain although they are only required on dynamic pages. This will add additional overhead while requesting the static resources through a cookie aware domain and increases the page load time - loading the cookie to request and download the cookie from the response.

To avoid this problem as discussed above define multiple domains and those are cookie less.

To define a cookie less domain, create a multiple domains e.g, etc and CNAME points to the parent domain - Make sure the cookie is set in the server only specific to the parent domain.

In Adobe Experience Manager(AEM) this can be achieved in the below two approaches

Component level:

Changing the static resource URL's in individual components with newly defined domains based on the resource type - may be separate domain for images, scripts, css etc. This will required more effort and also every component level changes to assign the specific URL's for the static resources. There is a possibly the developer will not implement this in all the components and the resources will be served from main domain.

Sling Rewriter to change the static resource URL's:

Define a Static Resource Transformer that will rewrite the resource URL's with static domains defined - multiple domains can be used

The ACS Static Reference Rewriter can be used to change the static resource URL's -

I have defined a Static Resource rewriter based on the above one to add some additional functionalities to match our requirements, thought of sharing as this may help someone with same requirement.

  • Exclude the rewrite based on attribute name and values
  • Exclude the rewrite for external resources
  • Exclude based on the complete path and URL prefix 
  • Rewrite the URL's for all srcset URL's 
  • The Rewriter is invoked only for specific content path.

import java.util.Dictionary;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang3.ArrayUtils;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Modified;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.PropertyUnbounded;
import org.apache.felix.scr.annotations.Service;
import org.osgi.service.component.ComponentContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;
import org.apache.felix.scr.annotations.ConfigurationPolicy;

label = "Static Resources Transformer Factory",
description = "Static Resources Transformer Factory",
        metatype = true,policy = ConfigurationPolicy.REQUIRE)
            name = "pipeline.type", label = "Static Resources Transformer Pipeline Type",description ="Static Resources Transformer Pipeline Type"),
            name = "webconsole.configurationFactory.nameHint",
            value = "Static Resources Transformer: {pipeline.type}")

public final class StaticResourceTransformFactory implements TransformerFactory {
    public final class StaticResourceTransformer extends org.apache.cocoon.xml.sax.AbstractSAXPipe
    implements {

    public void startElement(String uri, String localName, String qname, Attributes attr) throws SAXException {

      final String[] includeElementAttributesArray =includeElementAttributes.get(localName);
    AttributesImpl attrs = new AttributesImpl(attr);
    boolean excludeAttributeValue=false;
    for (int i = 0; i < attrs.getLength(); i++) {
    final String[] excludeAttributeValuesArray = excludeAttributeValues.get(attrs.getLocalName(i));
    excludeAttributeValue=ArrayUtils.contains(excludeAttributeValuesArray, attrs.getValue(i));"excludeAttributeValue:"+excludeAttributeValue);


    for (int i = 0; i < attrs.getLength(); i++) {
    String name = attrs.getLocalName(i);
    String value = attrs.getValue(i);
    if (ArrayUtils.contains(includeElementAttributesArray, name)
    && !ArrayUtils.contains(excludePath, value) && !isExcludedPrefix(excludePrefix,value)
    &&!(value.startsWith("https") || value.startsWith("http") || value.startsWith("//")) && !excludeAttributeValue) {
    String[] srcset=value.split(",");
    String srcsetValue="";
    for(int j=0;j<srcset.length;j++)
    if(!(value.startsWith("https") || value.startsWith("http") || value.startsWith("//")))
    srcsetValue=!srcsetValue.equals("")?srcsetValue+","+ prependHostName(srcset[j].trim()):srcsetValue+prependHostName(srcset[j].trim());
    attrs.setValue(i, srcsetValue);
    attrs.setValue(i, prependHostName(value));

    super.startElement(uri, localName, qname, attrs);


Monday, January 15, 2018

Developing a caching service to cache third part elements to improve performance in Adobe Experience Manage(AEM)

Developing a caching service to cache third part elements to improve performance in Adobe Experience Manage(AEM) 

This post will explain the approach to cache third party elements to improve performance.
In AEM sometime we may have to load the third party data e.g. country list, state list to drop-down lists or other components from external service call, the response will be static and changes occasionally over time.

To improve the performance the data can be cached in AEM and enable a JMX bean to clear the cache whenever the data is modified in the external system. This approach can be modified according to the requirement, if the volume of the cache data is more then better to integrate with external caching system like ehcache.

Define the cache manager to put/get the cache objects
Define JMX bean to clear the cache objects

1. Define  CacheManager  to put/get objects into cache and methods to clear the cache through JMX bean

public class CacheManager {

  private static java.util.HashMap<String,Object> cacheHashMap = new java.util.HashMap<String,Object>();

  public static void putCache(Object object, String identifier)
    cacheHashMap.put(identifier, object);

  public static Object getCache(String identifier)
  Object object = cacheHashMap.get(identifier);  
      return object;  

   public static String removeCacheWithKey(String identifier)
    return "Invalid Key..";
return "Removed cache with key "+identifier;

   public static String removeCacheAll()
    return "Removed cache";


2. Sample client to get/put object into cache

public class CacheCleint {

public static void main(String[] args) {

String[] countrylist=new String[]{"USA","UK","AUS","IN"};

CacheManager.putCache(countrylist, "country-list");

String[] cachedCountrylist=(String[])CacheManager.getCache("country-list");



3. Define JMX mbean to clear the cache

Define JMX mbean that will help to clear cache from OSGI JMX console or other JMX client.

import com.adobe.granite.jmx.annotation.Description;
import com.adobe.granite.jmx.annotation.Name;

@Description("Cache Manager JMX Bean")
public interface CacheManagerMBean {

    @Description("Remove the cache with cache id - country-list,state-list")
    String removeCacheWithKey(@Name("cacheKey") @Description("Valid cache key") String Cachekey);

    @Description("Remove All Cache")
    String removeCacheAll();


import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Service;

import com.adobe.granite.jmx.annotation.AnnotatedStandardMBean;

@Component(immediate = true)
@Property(name = "jmx.objectname", value = "com.packagegenerator.core:type=CacheManager")
public class CacheManagerMBeanImpl extends AnnotatedStandardMBean implements CacheManagerMBean {

    public CacheManagerMBeanImpl() throws NotCompliantMBeanException {

    public String removeCacheWithKey(String cacheKey) {
    return CacheManager.removeCacheWithKey(cacheKey);

    public String removeCacheAll() {   
    return CacheManager.removeCacheAll();   

The cache objects specified to a key or complete cache can be cleared through JMX client.

This will enable to cache the static data from a external system into AEM and improve the performance, the cache can be cleared through JMX console whenever required.





Sunday, January 14, 2018

How to upload and install the packages through Java API - Adobe Experience Manager(AEM)

How to upload and install the packages through Java API - Adobe Experience Manager(AEM)

This post will explain the approach to upload and install the packages through JAVA.

Refer the post for details on creating the package through Java -

Sample Servlet to upload and install the package - Convert the servlet to scheduler and import/replicate the package based on the scheduled time

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import javax.jcr.Session;
import javax.servlet.ServletException;

import org.apache.felix.scr.annotations.Reference;
import org.apache.jackrabbit.vault.packaging.JcrPackage;
import org.apache.jackrabbit.vault.packaging.JcrPackageManager;
import org.apache.jackrabbit.vault.packaging.Packaging;


 * Servlet that writes some sample content into the response. It is mounted for
 * all resources of a specific Sling resource type. The
 * {@link SlingSafeMethodsServlet} shall be used for HTTP methods that are
 * idempotent. For write operations use the {@link SlingAllMethodsServlet}.
@SlingServlet(paths= "/services/packageupload")
public class PackageUploadServlet extends SlingSafeMethodsServlet {

private Packaging packaging;

private SlingRepository repository;

private ResourceResolverFactory resolverFactory;

private SlingSettingsService settingsService;

Replicator replicator;

protected void doGet(final SlingHttpServletRequest req, final SlingHttpServletResponse resp)
throws ServletException, IOException {

Session session = null;
if (isRunMode("author") && isMasterRepository()) {//Only run in author - change the servlet to scheduler and import/replicate the package based on the scheduled time
try {

String packagePath = "C:\\Albin\\";
Map<String, Object> param = new HashMap<String, Object>();
param.put(ResourceResolverFactory.SUBSERVICE, "packageService");

ResourceResolver resolver;

resolver = resolverFactory.getServiceResourceResolver(param);

session = resolver.adaptTo(Session.class);
JcrPackageManager jcrPackageManager = packaging.getPackageManager(session);

JcrPackage inputPackage=jcrPackageManager.upload(new File(packagePath), false, true, "test12018-01-14-15-00-00-023-1.0");
ImportOptions importOption=new ImportOptions();//Specify the import configurations


//Replicate the package to publishers
replicator.replicate(session, ReplicationActionType.ACTIVATE, inputPackage.getDefinition().getNode().getPath().split("/jcr:content")[0]);

resp.getOutputStream().println("This package successfully uploaded and installed to the server....");

} catch (Exception e) {
// TODO Auto-generated catch block
resp.getOutputStream().println("Excpetion while uploading/installing the package...."+e.getMessage());
}finally {

private Boolean isRunMode(String mode) {
Set<String> runModes = settingsService.getRunModes();
for (String runMode : runModes) {
if (runMode.equalsIgnoreCase(mode)) {
return true;
return false;

public boolean isMasterRepository() {
final String isMaster = repository.getDescriptor("crx.cluster.master");
return isMaster != null && !isMaster.equals("") && Boolean.parseBoolean(isMaster);

Sling scheduler to auto create the packages through JcrPackageManager API - Adobe Experience Manager(AEM)

Sling scheduler to auto create the packages through JcrPackageManager API - Adobe Experience Manager(AEM)

This post will explains the approach to define Sling scheduler to auto create the packages through JcrPackageManager API in Adobe Experience Manager(AEM).

Define a Service user:

Define a Service User with required access to create a  package.

Login to CRX explorer -  http://localhost:4502/crx/explorer/index.jsp
Click on User Administration


Click on Create System User


Enter the User Id - "packageassembler and the path - "system/packageassembler"


How to define factory of OSGI schedulers(Dynamic Schedulers) in Adobe Experience Manager(AEM)

Defining Factory of OSGI schedulers(Dynamic Schedulers) in Adobe Experience Manager(AEM)

This post explains the approach to define factory of OSGI schedulers(Dynamic Schedulers) in Adobe Experience Manager(AEM)

Define a factory class to capture the configurations:

Define a component and enable as configuration factory(configurationFactory=true)
Configure all the required properties run the scheduler job.

Retrieve the properties through activate method and assign the values to class variable, define the getters to retrieve the property values in Job Class.

Specify the label to identify the configuration in OSGI console.

@Component(configurationFactory = true, policy = ConfigurationPolicy.OPTIONAL, metatype = true, immediate = true, label = "Scheduled Package Generator")
@Service(value = GeneratePackageSchedulerRequest.class)
public class GeneratePackageSchedulerRequest {

final Logger logger = LoggerFactory.getLogger(this.getClass());

@Property(unbounded=PropertyUnbounded.DEFAULT, label="Scheduler Expression", description="Scheduler Expression", value="")
private static final String SCHEDULER_EXPRESSION = "sheduleExpression";
private String sheduleExpression;

@Property(unbounded = PropertyUnbounded.ARRAY, label = "Packages Filter String", cardinality = 50, description = "Packages Filter String")
public static final String PACKAGE_FILTERS = "packageFilters";
private String[] packageFilters;

@Property(unbounded=PropertyUnbounded.DEFAULT, label="Package Name", description="Package Name")
private static final String PACKAGE_NAME = "packgeName";
private String packageName;

@Property(unbounded=PropertyUnbounded.DEFAULT, label="Root Path to store the package", description="Root Path")
private static final String ROOT_PATH = "rootpath";
private String rootPath;

protected void activate(final ComponentContext ctx) {

Dictionary<?, ?> props = ctx.getProperties();
sheduleExpression = PropertiesUtil.toString(props.get(SCHEDULER_EXPRESSION), "");
packageFilters = PropertiesUtil.toStringArray(props.get(PACKAGE_FILTERS), null);
packageName = PropertiesUtil.toString(props.get(PACKAGE_NAME), null);
rootPath=PropertiesUtil.toString(props.get(ROOT_PATH), null);

public String[] getPackageFilters() {
return packageFilters;

public String getJobname() {
return packageName;

public String getSheduleExpression() {
return sheduleExpression;

public String getRootPath() {
return rootPath;


Monday, January 1, 2018

How to receive Outbound Message notification from Salesfore through Salesforce Adapter in Oracle SOA Suite 12c

How to receive Outbound Message notification from Salesfore through Salesforce Adapter in Oracle SOA Suite 12c

Salesforce Outbound messaging allows you to specify that changes to fields within Salesforce can cause messages with field values to be sent to designated external servers.

Outbound messaging is part of the workflow rule functionality in Salesforce. Workflow rules watch for specific kinds of field changes and trigger automatic Salesforce actions, such as sending email alerts, creating task records, or sending an outbound message.

After you set up outbound messaging, when a triggering event occurs, a message is sent to the specified endpoint URL. The message contains the fields specified when you created the outbound message. Once the endpoint URL receives the message, it can take the information from the message and process it. To do that, you need to examine the outbound messaging WSDL.

The Salesforce Adapter in Oracle SOA Suite help to integrate with Salesforce cloud. This post will explain the steps to enable the Outbound messaging in Salesfore and receive the notifications in Oracle SOA Suite via Salesforce Adapter.

Define Outbound message in Salesforce:

Login to Salesforce
Click on Setup


Search for Outbound messages and click on Workflow & Approvals -  Outbound Messages


Click on Continue in the next screen
Click on New Outbound Message


Select the required Object and Click on Next