Name

global.SLAAsyncQueueHealthCheckSNC

Description

No description available

Script

var SLAAsyncQueueHealthCheckSNC = Class.create();
SLAAsyncQueueHealthCheckSNC.prototype = {
  initialize: function() {
  },

  check: function() {
  	this._recoverRecordsWithNoJob();
  	this._recoverRecordsWithNonExistentJob();
  },

  /* Set back to "ready" any records with a state of "queued" or "processing" but do not have an SLA Async Job
     Records with these values will never be processed by the delegator again so need to be updated back to "ready"

     An example of when this can happen is if a node is restarted while an SLA Async job is running */
  _recoverRecordsWithNoJob: function() {
  	var slaAsyncQueueGr = new GlideRecord(SLAAsyncSNC.SLA_ASYNC_QUEUE);
  	slaAsyncQueueGr.addQuery("state", "IN", "queued,processing");
  	slaAsyncQueueGr.addNullQuery("sys_trigger");

  	this._setRecordsToReady(slaAsyncQueueGr);
  },

  /* Set back to "ready" any records with a state of "queued" or "processing" which reference an SLA Async Job that
     no longer exists

     An example of when this can happen is if a node crashes while an SLA Async job is running */
  _recoverRecordsWithNonExistentJob: function() {
  	var slaAsyncQueueGr = new GlideAggregate(SLAAsyncSNC.SLA_ASYNC_QUEUE);
  	slaAsyncQueueGr.addQuery("state", "IN", "ready,queued,processing");
  	slaAsyncQueueGr.addNotNullQuery("sys_trigger");
  	slaAsyncQueueGr.setWorkflow(false);
  	slaAsyncQueueGr.groupBy("sys_trigger");
  	slaAsyncQueueGr.query();

  	while (slaAsyncQueueGr.next()) {
  		var triggerJobId = slaAsyncQueueGr.getValue("sys_trigger");
  		if (this._triggerJobExists(triggerJobId))
  			continue;

  		var recoverSlaAsyncQueueGr = new GlideRecord(SLAAsyncSNC.SLA_ASYNC_QUEUE);
  		recoverSlaAsyncQueueGr.addQuery("state", "IN", "ready,queued,processing");
  		recoverSlaAsyncQueueGr.addQuery("sys_trigger", triggerJobId);

  		this._setRecordsToReady(recoverSlaAsyncQueueGr);			
  	}
  },

  _triggerJobExists: function(triggerJobId) {
  	if (!triggerJobId)
  		return false;
  	
  	var sysTriggerGr = new GlideRecord("sys_trigger");
  	sysTriggerGr.setWorkflow(false);
  	return sysTriggerGr.get(triggerJobId);
  },

  _setRecordsToReady: function(slaAsyncGr) {
  	if (!slaAsyncGr || typeof slaAsyncGr.getTableName !== "function" || slaAsyncGr.getTableName() !== SLAAsyncSNC.SLA_ASYNC_QUEUE)
  		return;

  	slaAsyncGr.setWorkflow(false);
  	slaAsyncGr.setValue("sys_trigger", "");
  	slaAsyncGr.setValue("state", "ready");
  	slaAsyncGr.updateMultiple();
  },

  type: 'SLAAsyncQueueHealthCheckSNC'
};

Sys ID

2000516273320110491d235f04f6a709

Offical Documentation

Official Docs: