Create a custom processor for session end batching

Abstract

How to create a custom processor to handle a batch of sessions that have expired.

From version 9.3, Sitecore processes expired sessions in batches instead of one at a time. If you extend the commitSession or submitSessionContext pipelines with additional processors, sessions are no longer necessarily submitted to xConnect the moment they expire. Therefore, we recommend that you change your custom processor to use the new service Sitecore.Analytics.XConnect.DataAccess.IXdbRuntimeContext, which provides access to a factory that creates a Sitecore.XConnect.IXdbContext, the interface of the xConnect Client API.

Note

For information on how to set session expiration batch settings, see Configure session end batching.

To create a custom processor and then process session data in batches:

  1. Extend the commitSession or submitSessionContext pipeline using a custom processor:

    <commitSession>  
        <processor type="AddCustomContactDataOnCommitSession, CustomAssembly" patch:before="processor[@type='Sitecore.Analytics.Pipelines.CommitSession.SubmitSession, Sitecore.Analytics']" resolve="true" />
    </commitSession>
  2. Add code to handle the session data. The following is an example of how you can change the first name of the contact in the session using IXdbRuntimeContext:

    using System.Linq;
    using Sitecore.XConnect.Client;
    using Sitecore.XConnect.Collection.Model;
    
    public class AddCustomContactDataOnCommitSession : Sitecore.Analytics.Pipelines.CommitSession.CommitSessionProcessor
    {
        private readonly Sitecore.Analytics.XConnect.DataAccess.IXdbRuntimeContext _context;
    
        // Injects IXdbRuntimeContext
        public AddCustomContactDataOnCommitSession(Sitecore.Analytics.XConnect.DataAccess.IXdbRuntimeContext context)
        {
            _context = context;
        }
    
        public override void Process(Sitecore.Analytics.Pipelines.CommitSession.CommitSessionPipelineArgs args)
        {
            // This provides access to the instance of the IXdbContext that is used for batching
            var xdbContext = _context.Factory.Create();
    
            // Check whether contact exists
            var identifiedContactReference = new Sitecore.XConnect.IdentifiedContactReference("<IdentifierSource>", "<identifier>");
    
            var xConnectContact = xdbContext.Get(identifiedContactReference, new Sitecore.XConnect.ExpandOptions
            {
                FacetKeys =
                {
                    Sitecore.XConnect.Collection.Model.PersonalInformation.DefaultFacetKey
                }
            });
    
            if (xConnectContact == null)
            {
                return;
            }
    
            var personalInfo = xConnectContact.GetFacet<Sitecore.XConnect.Collection.Model.PersonalInformation>() ?? new Sitecore.XConnect.Collection.Model.PersonalInformation();
    
            personalInfo.FirstName = "<FirstName>";
    
            // Check that there facet is not modified twice
            if (xdbContext.DirectOperations.OfType<Sitecore.XConnect.Operations.SetFacetOperation<Sitecore.XConnect.Collection.Model.PersonalInformation>>().All(o => o.Target.Entity.Id != xConnectContact.Id))
            {
                xdbContext.SetPersonal(xConnectContact, personalInfo);
            }
    
            // Do not call xdbContext.Submit() as it is called by batching logic afterward
        }
    }

Note

You can also use IXdbContext events to react on successful and failed saves of session batches.