Quantcast
Channel: SCN : Blog List - All Communities
Viewing all articles
Browse latest Browse all 2548

Queuing mechanism for E-Mail push scenarios

$
0
0

1 Requirement

The ICI has always been an asynchronous and non-queuing interface. In certain channels (such as telephony) this is not a critical issue as the agent still has the possibility to manually identify a customer. Event if there wasn't an inbound signal before.

However, in E-Mail scenarios where the initial inbound is done in the CRM the missing queuing functionality like in classical middleware scenarios is a mandatory requirement in most projects. The CTI middleware can be not accessable for various reasons (connection lacks, HTTP errors, etc.). In those cases, where no pull scenrio is provided, no agent will ever know whether there has been an inbound E-Mail or not.

 

2 Proposal

Using a classical TRFC queuing, the outbound SOAP request can be handled and resent where required.

 

3 Implementation Steps

Basically, the solution can be done by registering a new queue and little implementation.

 

3.1 Queue

In some systems the Queue CN* is already registered. If not, just register it with the transaction code SMQR.

 

 

3.2 Push-Exit

The standard uses the class CL_CRM_IC_ERMS_PUSH_EXIT during workitem execution to check whether a push needs to be done or not. In order to encapsulate the SOAP request a enhancement needs to be done in method IF_SWF_IFS_WORKITEM_EXIT~EVENT_RAISED.

 

*|----------------------------------------------------------------------
 *|-- Referenzes     DATA: lo_exit TYPE REF TO zcl_crm_ic_erms_push_exit.
 *|----------------------------------------------------------------------
 *|-- Create Object     CREATE OBJECT lo_exit.
 *|-- Push E-Mail     CALL METHOD lo_exit->push_email       EXPORTING         im_event_name       = im_event_name         im_workitem_context = im_workitem_context.
 *|-- Don't run the standard logic afterwards     RETURN.

3.3 New Push Logic

The implementation in method PUSH_EMAIL is basically identical to the standard, except the request itself which is encapsulated in a function module.

 

*|----------------------------------------------------------------------
*|-- Variables    DATA: lv_scenario_id TYPE string,          lv_mail_id     TYPE crmt_erms_connection_id,          lv_workitem_id TYPE sww_wiid.
*|-- Structures    DATA: ls_action_item  TYPE crm_ici_action_item,          ls_officeobject TYPE obj_record,          ls_swo_objid    TYPE swotobjid.    DATA: BEGIN OF ls_mail_id,            folder_id TYPE soodk,            object_id TYPE soodk,          END OF ls_mail_id.
*|-- Referencen    DATA: lo_wf_container TYPE REF TO if_swf_ifs_parameter_container,          lo_mail_data    TYPE REF TO cl_crm_email_data.
*|----------------------------------------------------------------------
*|-- Push only once    IF im_event_name <> 'CREATED'.      RETURN.    ENDIF.
*|-- Check debug mode    check_debug_mode( ).
*|-- Get workitem container    lo_wf_container = im_workitem_context->get_wf_container( ).
*|-- Check whether the action was already executed    IF was_already_executed( lo_wf_container ) NE abap_true.      RETURN.    ENDIF.
*|-- Get E-Mail-ID    TRY.        lv_workitem_id = im_workitem_context->get_workitem_id( ).        CALL METHOD lo_wf_container->get          EXPORTING            name  = 'OfficeDocument'          IMPORTING            value = ls_officeobject.        CALL FUNCTION 'SWO_OBJECT_ID_GET'          EXPORTING            object = ls_officeobject-handle          IMPORTING            objid  = ls_swo_objid.        lv_mail_id = ls_swo_objid-objkey.        IF lv_mail_id IS INITIAL.          RETURN.        ENDIF.      CATCH cx_swf_cnt_container .      CATCH cx_root.        RETURN.    ENDTRY.
*|-- Get E-Mail data    ls_mail_id = lv_mail_id.    CLEAR ls_mail_id-folder_id.    lo_mail_data = cl_crm_email_utility_base=>get_mail_data_from_so( iv_object_id = ls_mail_id-object_id ).    CHECK lo_mail_data IS BOUND.
*|-- Fill action item    ls_action_item-_action_item_attributes = get_attributes( lo_mail_data ).    ls_action_item-_request_id = lv_workitem_id.    ls_action_item-_process_id = lv_mail_id.
*|-- Create queue entry    CALL FUNCTION 'TRFC_SET_QUEUE_NAME'      EXPORTING        qname              = 'CN_EMAIL_PUSH'      EXCEPTIONS        invalid_queue_name = 1        OTHERS             = 2.    IF sy-subrc <> 0.      RETURN.    ENDIF.
*|-- Start request in background    CALL FUNCTION 'ZCRM_ERMS_PUSH_EMAIL'      IN BACKGROUND TASK AS SEPARATE UNIT      DESTINATION space      EXPORTING        is_action_item        = ls_action_item        it_routing_attributes = get_routing_attributes( )        iv_scenario_id        = lv_scenario_id.    COMMIT WORK.

3.4 Function Module

The function module only calls the push logic of the standard. In addition, a potential occuring ICI exception is catched and in those cases the background task is restarted again.

 

*|----------------------------------------------------------------------
 *| Variables   DATA: lv_user_id TYPE string,         lv_item_id TYPE string.
 *| Referencen   DATA: lo_action TYPE REF TO cl_erms_action.
 *|----------------------------------------------------------------------
 *|-- Create routing instance   lv_user_id = sy-uname.   CREATE OBJECT lo_action     EXPORTING       userid = lv_user_id.
 *|-- SOAP Request   TRY.       CALL METHOD lo_action->route         EXPORTING           item_data          = is_action_item           routing_attributes = it_routing_attributes           scenario_id        = iv_scenario_id         IMPORTING           action_item_id     = lv_item_id.     CATCH cx_crm_ici_exception           cx_root.       "In terms of a failure the task is restarted       CALL FUNCTION 'RESTART_OF_BACKGROUNDTASK'.       EXIT.   ENDTRY.

4 Summary

In situation where the CTI middelware is fighting with connection problems the SOAP requests are still not lost. The queuing mechanism is standard and so are the monitoring processes, respectively.


Viewing all articles
Browse latest Browse all 2548

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>