Skip to Content

Introduction:
This blog describes how to create and handle dynamic alert notification inside the Exception Sub Process in SAP HCI.
About Exception Sub Process:
Exception Sub Process can catch any exceptions thrown in the integration process and process them.Below parameters will give more details of the the exception raised.

  • ${exception.message} : Short description of the Exception.
  • ${exception.stacktrace} : Complete trace of the Exception raised.

Use Case:
Lets create Custom integration where we will pull the File from SFTP server and save it in data store.

1. Sender: Add Sender component from integration designer pallete.
2. Channel: Configure SFTP sender channel which picks file from SFTP server.

3. Content Modifier: To read the key details of incoming message.In our case we are capturing input file name.4. Script:  To read the tenant details in run time( in our case tenant id is of 5 character length like X1234 ,L1234 ) and stores it in property.
5. Script: Erroneous script to forcefully fail the message and trigger exception.
6. Data Store: Store the output ( In the above case its just added to have an end to end flow ).
7. Content Modifier: Content Modifier [ Body ] to build the email body.

Content Modifier [ Header ] to set the exception stack trace into header which is later sent as a attachment.
8. Send: Send step is used to send the message to External Systems Asynchronously.
9. Channel: Mail adapter to send the exception details to mail receiver.
Once you are done with above configuration save and deploy the Integration Project.
Place a test file in SFTP share and you will be able to find the below Error Alert Mail triggered from Exception Sub Process.


Further Improvements and Limitations:
1. XSLT mapping with HTML can be used in addition to above use case inside the Exception Sub Process to improvise the look and feel of the email body.
2. Custom Exception can be created and raised using Groovy Script.
3. You cannot catch exceptions of local integration process in the main integration process.
4. As of now Exception Sub Process is not available in WEBUI( may be it is present in the SAP road map ).
Conclusion:
Exception Sub Process is very useful for handling Exceptions raised in Integration process although it requires further improvements.
References:
[1] Content Modifier:
https://uacp.hana.ondemand.com/http.svc/rc/PRODUCTION/93810d568bee49c6b3d7b5065a30b0ff/1/en-US/frameset.html?2c667a12a0a545d2ad4210e070479312.html
[2] Mail Adapter:
https://uacp.hana.ondemand.com/http.svc/rc/PRODUCTION/93810d568bee49c6b3d7b5065a30b0ff/1/en-US/frameset.html?08af047a0c0145ab8742b946cff7bcd7.html
[3] Exception Sub Process:
https://uacp.hana.ondemand.com/http.svc/rc/PRODUCTION/93810d568bee49c6b3d7b5065a30b0ff/1/en-US/frameset.html?f090fd40347c4cccba6c566193f76624.html

Regards,
Sriprasad Shivaram Bhat

To report this post you need to login first.

20 Comments

You must be Logged on to comment or reply to a post.

  1. Aman Gupta

    Thanks Sri..

    Very informative..

    We are working on SF integration, where we need to fetch employee records and send those records to SFTP server via SAP HCI. We have placed transformation rules in HCI to validate the data coming from SF.. Just wanted to check what is the possibility to check the below

    1. Total Number of employees processed through this interface.
    2. Total Number of employees processed successfully.
    3. Total Number of employees processed unsuccessfully

     

    Thanks in advance..

    Aman

     

    (1) 
  2. Hari Sonnenahalli

    I am using your code in sub process exception and when trying to execute am getting the substring can’t be invoked. Please find the code which am using below and please let me know if you see any error. I have also pasted the error message for your reference.

    /*
    The integration developer needs to create the method processData
    This method takes Message object of package com.sap.gateway.ip.core.customdev.util
    which includes helper methods useful for the content developer:
    The methods available are:
    public java.lang.Object getBody()
    public void setBody(java.lang.Object exchangeBody)
    public java.util.Map<java.lang.String,java.lang.Object> getHeaders()
    public void setHeaders(java.util.Map<java.lang.String,java.lang.Object> exchangeHeaders)
    public void setHeader(java.lang.String name, java.lang.Object value)
    public java.util.Map<java.lang.String,java.lang.Object> getProperties()
    public void setProperties(java.util.Map<java.lang.String,java.lang.Object> exchangeProperties)
    public void setProperty(java.lang.String name, java.lang.Object value)
    */
    import com.sap.gateway.ip.core.customdev.util.Message;
    import java.util.HashMap;
    def Message processData(Message message) {
    //Body
    def body = message.getBody();
    // Fetch Application URL
    String appUrl = System.getenv(“HC_Application_URL”);
    // Retrieve HCI tenant name
    String TMN_ShortName = appUrl.substring(8,13);
    // Set Tenant name to property
    message.setproperty (“P_Tenant_Name”,TMN_ShortName);
    return message;
    }

    Message processing failed.
    javax.script.ScriptException: java.lang.Exception: java.lang.NullPointerException: Cannot invoke method substring() on null object@ line 23 in script21.groovy, cause: java.lang.NullPointerException: Cannot invoke method substring() on null object

    Thanks

    HS

     

    (0) 
  3. Sriprasad Shivaram Bhat Post author

    Hello Hari,

    You must correct the line where you are pulling environment details.Since there are no details being pulled its giving an error.

    Correct One: String appUrl = System.getenv(“HC_APPLICATION_URL“);

    Environment variables are case sensitive and you must pass the above one it will solve your issue.

    Regards,

    Sriprasad Shivaram Bhat

     

    (0) 
    1. Hari Sonnenahalli

      Yes, I know where you have used in the code. My question is the naming convention(HC_APPLICATION_URL) which you have used is retrieved from somewhere on the tenant and is it a standard. The reason I am asking is when used a proper case it was throwing an exception.

      Please let me know.

      Thanks

      HS

      (0) 
  4. Sriprasad Shivaram Bhat Post author

    Hello Hari,

    I am able to successfully retrieve the Tenant ID using below script may be you can try copy pasting the same.

    import com.sap.gateway.ip.core.customdev.util.Message;
    import java.util.HashMap;
    import java.io.*;
    
    def Message processData(Message message) {
          
          //Retrieve Body 
          def body = message.getBody();
          
          //Function to fetch application url of HCI Tenant
          String appUrl = System.getenv("HC_APPLICATION_URL");
          
          //Logic to retrieve only Tenant Name      
          String TMN_ShortName=appUrl.substring(8,13)
          
          //Set the Tenant name to Property
          message.setProperty("P_Tenant_Name",TMN_ShortName);
                
          return message;
    }

    Regards,

    Sriprasad Shivaram Bhat

     

    (0) 
  5. Kenny Buckles

    Is there any way to set a cadence to when these alerts are sent?  We have a flow that was built and it checks every 10 minutes for new data (we need the systems in sync as much as possible). And if there is an API error, for example, we will get an error email every 10 minutes.  Is it possible to send once an hour or some other time frame?  We ultimately just need to be notified the first couple times that there is an issue.

    Thanks,

    Kenny

    (0) 
    1. Sriprasad Shivaram Bhat Post author

      Yes you can do it with some more extra efforts:(,inside Exception Sub Process instead of Send Step you can have a data store ( with Global Scope ) and store every error message in some XML format.

      Create one more flow which is Scheduled for every hour to pull the data from the data-store which was created earlier in Exception SubProrcess and send an alert email to Support Team or whomever you want to send.

      Regards,

      Sriprasad Shivaram  Bhat

      (0) 
  6. Devaraj R

    Hi Sriprasad,

    This solution is fine if we want to get mails for 1 or 2 integrations.

    But in our case we have around 60+ integrations in our tenant and we need this mail notification to be triggered immediately for each message failure which is occurring in our tenant for all these integrations.

    It’s difficult to configure this Exceptional sub process in all our integrations.

    Any possibility to simplify this and achieve or any other alternative ways.?

    Regards,

    Deva

    (0) 
    1. Sriprasad Shivaram Bhat Post author

      Hello Deva,

      If you want to receive the email for each integration then you have to add it explicitly in 60+ scenarios. In case if you are yet to create custom integration you can have some simple flow with above steps and save it as Template.Later for other integration,template with error handling steps would be starting point.

      Regards,

      Sriprasad S Bhat

      (0) 
  7. Devaraj R

    Hello Sriprasad,

    Thanks for your quick response.

    Plz provide further details on how to use Save as template and where I can get that.

     

    one more clarification: I tried as you have mentioned above.

    I am getting the mail if there is any exception/error in the integration. But messages are showing as completed even if there is any exception/error. It should be shown as failed message right.?

    But no messages shown in failed status even if there is error in the integration, showing all messages are completed. While opening MPL Logs only I am able to check whether there is any error or any issue. Why is it so.?

     

    Regards,

    Deva

    (0) 
    1. Sriprasad Shivaram Bhat Post author

      Hello Deva,

      **How to deal with Save As Template. 

      I have written a blog on the same refer the same for more detail.

      https://blogs.sap.com/2017/06/15/sap-cloud-platform-integration-creating-reusable-templates/

      ** But messages are showing as completed even if there is any exception/error.

      By default in Exception Sub process End Message step will be there.From past 3 release onward behavior of the End Message step changed.End Message step inside exception will set the Overall Message Status to Completed,if you want to set it as Failed please use Error End Event instead of End Message Event.

      Regards,

      Sriprasad Shivaram Bhat

       

      (0) 
  8. Amber Badam

    Excellent blog!! kudos to you. Thank you for sharing. Didn’t knew we could retrieve the tenant name and system URL.

    Do you know if we could use externalized parameters in the email body ?

    (0) 

Leave a Reply