Optimize the CommerceContext cache for a long running process
Sitecore XC integration with other systems often involves the development of long running or bulk processes that can impact performance. This topic provides you with guidance on how to use the CommerceContext
cache in your integration customization in a way that optimizes the performance of long running tasks or processes.
You can optimize performance during long running tasks by refreshing the CommerceContext
cache.
The interval at which to refresh the CommerceContext
cache ultimately depends on the workload being performed. As a general guideline, consider refreshing the CommerceContext
every 5 iterations of a given task. You can adjust the refresh interval based on test results.
To refresh the CommerceContext
:
-
Add the following snippet to your long running process code:
RequestResponsevar currentContext = new CommerceContext(CurrentContext.Logger, CurrentContext.TelemetryClient) { GlobalEnvironment = CurrentContext.GlobalEnvironment, Environment = CurrentContext.Environment, Headers = CurrentContext.Headers };
Example: how to refresh the CommerceContext
The following shows a code sample that generates an arbitrary number of random Price Cards using an API endpoint. The two key sections of the example are marked in bold. Notice that in this example, a context refresh is initiated every 5th item.
/// <param name="value">The value.</param>
/// <returns>A <see cref="CommerceCommand"/></returns>
[HttpPut]
[Route("AddBulkPriceCards()")]
public async Task<IActionResult> AddBulkPriceCards([FromBody] ODataActionParameters value)
{
if (!this.ModelState.IsValid || value == null)
{
return new ObjectResult("Invalid Model State"); ;
}
long.TryParse(value.ContainsKey("count") ? value["count"].ToString() : "10000", out var countResult);
var priceBookName = value["bookName"].ToString();
var priceCardDisplayName = String.Empty;
var priceCardDescription = String.Empty;
var priceCardName = String.Empty;
var command = this.Command<AddPriceCardCommand>();
var currentContext = new CommerceContext(CurrentContext.Logger, CurrentContext.TelemetryClient)
{
GlobalEnvironment = CurrentContext.GlobalEnvironment,
Environment = CurrentContext.Environment,
Headers = CurrentContext.Headers
};
Stopwatch sw = new Stopwatch();
sw.Reset();
sw.Start();
for (long i = 0; i < countResult; i++)
{
priceCardName = "name_" + i;
priceCardDescription = "description_" + i;
priceCardDisplayName = "displayname_" + i;
if (i % 5 == 0)
{
currentContext = new CommerceContext(CurrentContext.Logger, CurrentContext.TelemetryClient)
{
GlobalEnvironment = CurrentContext.GlobalEnvironment,
Environment = CurrentContext.Environment,
Headers = CurrentContext.Headers
};
}
await command.Process(currentContext, priceBookName, priceCardName, priceCardDisplayName,
priceCardDescription);
}
sw.Stop();
return new ObjectResult($"Done, in {sw.Elapsed.ToString()} ");
}