syncBackAfterProcessing

    Signature

    HelpersyncHelper
    Signature
    syncBackAfterProcessing()
    Description

    Use this helper method in the Incoming sync to update the source issue once the synchronization to the destination side is finished.

    Introduced in4.6.5

    Using the feature

    Assume

    • you have 2 instances 'Internal' and 'External'.
    • You raise an issue on 'Internal', and exalate it to 'External'
    • You need to have a custom field on Internal containing the remote key of the issue created on External


    What needs to happen is

    • Once that the issue is created on External, a message is sent back to Internal containing the key of the created issue
    • The syncHelper.syncBackAfterProcessing() will trigger this message as it will queue a sync event which is handled as if the issue on external has been changed
    • The processing of this sync event is identical to any other sync event


    What you need to configure

    On the destination side (external) in the incoming sync processor

    // trigger a sync back to the internal instance
    if(firstSync){
      syncHelper.syncBackAfterProcessing()
    } 


    On the source side (internal) in the incoming sync processor

    // update the custom field 'remote issue key'  with the  key of the newly created issue
    issue.customFields."remote issue key".value = replica.key


    (warning) Method syncHelper.syncBackAfterProcessing() will only work for the bidirectional synchronization. Using it for the unidirectional sync might lead to unexpected sync errors.

    Using syncHelper.syncBackAfterProcessing() outside the firstSync if block might cause infinite loops.


    Avoiding conflicts

    A sync conflict is possible whenever changing information on the source issue immediately after an exalate.

    Source JiraTarget Jira
    Exalate issue
    Status is 'open'


    Create issue
    Status is 'Open'
    Change status to 'In Progress

    Syncback issue
    Status is open
    Syncback is processed
    Status is changed back to 'Open'


    Status is updated to 'In Progress' because of message sent in step 3
    Status = OpenStatus = 'In Progress'



    To avoid this conflict, one can add this code

        if (!firstSync && previous?.status.name == replica?.status.name) {
            // do not update the status as it might conflict
        }