Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Introduction

The Case Engine Scheduler Component is introduced to be able to schedule without having a dependency on the runtime. It supports all scheduling options that the case engine needs. The  Case Engine Scheduler is implemented using Quartz Enterprise Job Scheduler.


Table of Contents

Panel

Table of Contents
maxLevel2

Info

The case engine scheduler will share the Quartz scheduler instance with its own scheduler, so if you already configured Quartz for the basic scheduler, you just need to enable the case-engine profile and you can skip the remainder of this guide.

Installation

Steps:

  1. Add case-engine-scheduler-quartz The scheduler will be automatically available if the
    Include Page
    _ProfileCaseEngine
    _ProfileCaseEngine
    profile is added to the list of spring active profiles in the bootstrap.properties.  The case-engine profile should also be enabled. More information on how to configure the application using Spring Profiles can be found here: External application configuration with Spring Profiles.
  2. Add the application-case-engine-scheduler-quartz.properties file in the configuration location if it does not yet exist. This properties file is added in the 
    Include Page
    _ConfigLocation
    _ConfigLocation
    directory when using the installer. Otherwise, please create this according to the documentation belowBlueriq installer.
  3. Run the provided scripts for creating the quartz tables in the database: msssql.sql, pgsql.sql or oracle.sql. The scripts are located in the release zip in \Runtime\Java\Webapp\DBScripts\blueriq-case-engine-scheduler-quartz
  4. Define quartz database connection in the application-externaldatasources.properties
    Include Page
    _PropertiesExternalDatasources
    _PropertiesExternalDatasources
    file.


Info

Steps 3 and 4 are applicable only if a job store database connection is chosen Quartz triggers and jobs are stored in a database instead of in memory job store.


Configuration

Info

Every Quartz configuration property has to be specified in application-case-engine-scheduler-quartz.properties for the Runtime.

In order to tune resources for job execution we provided a few details about the Thread Pool.


Quartz is configured using a set of properties. Quartz uses a job store in order to persist jobs details, triggers and other job related information. We support two types of job stores:

Memory (default)

Info
titleInfo

This is the default configuration for java Java environments.
For more details about in memory job store configuration please visit Config RAM Job Store.

By default memory mode is enabled which should not be used unless for demo's should be used only for demos and standalone development. For recommended settings please check the database settingsthe Database section. For memory the following setting should appear in the application-case-engine-scheduler-quartz.propertiesbe set in the 

Include Page
_PropertiesCaseEngine
_PropertiesCaseEngine
.

Code Block
titleapplication-schedulercase-quartzengine.properties
spring.quartz.job-store-type = memory

Database

Scripts to create the required database content are provided for the following databases:

  • SQL Server
  • Oracle

There are two types of connection that are supported:

Generate the Quartz Database

Warning

Generate the Quartz database with respect to the database used (either Oracle or MSSQL).

In the Blueriq release zip there is a case-engine-scheduler-quartz folder that contains SQL scripts. Use the favorite database viewer to run those scripts against the database server.

  1. Connect to the database server with the favorite viewer.
  2. Create a new database dedicated to quartz - pick a meaningful name for this, e.g. 'QuartzScheduler'.
  3. Depending on the database viewer used, one must make sure that the new database created is selected and set by default in the editor.
  4. Import the mssql.sql (for MSSQL) or oracle.sql (for Oracle server) and run it in the editor. If the run was successful new tables should be present under the newly created database.

JDBC Connection

To enable the JDBC Connection the externaldatasources profile must enabled and the following properties have to be usedFor database mode, which is required for production, specify the following in

Include Page
_PropertiesCaseEngine
_PropertiesCaseEngine
:

Code Block
titleapplication-schedulercase-quartzengine.properties
spring.quartz.job-store-type=jdbc
spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_
Code Block
titleapplication-externaldatasources.properties - mssql
blueriq.datasource.scheduler-quartz.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
blueriq.dataSource.scheduler-quartz.url=jdbc:sqlserver://<server_url>:<port>;databaseName=<database_name>;instance=<instance_name>
blueriq.datasource.scheduler-quartz.username=<user>
blueriq.datasource.scheduler-quartz.password=<password>
Code Block
titleapplication-externaldatasources.properties - oracle
blueriq.datasource.scheduler-quartz.driverClassName=oracle.jdbc.driver.OracleDriver
blueriq.dataSource.scheduler-quartz.url=jdbc:oracle:thin:@<server_url>:<port>:xe
blueriq.datasource.scheduler-quartz.username=<user>
blueriq.datasource.scheduler-quartz.password=<password>
If necessary, create a new datasource. See Configuring JDBC database drivers for information on how to do this.
JobStoreTX allows Quartz managing quartz related transactions. 

# Enable the delegate for the specific database
#spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.MSSQLDelegate
#spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
#spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.oracle.OracleDelegate

# when using a JDBC datasource enable tx
#spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX

# when using a JNDI datasource enable CMT
#spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreCMT

JDBCJobStore’s “table prefix” property is a string equal to the prefix given to Quartz’s tables that were created in your database. You can have multiple sets of Quartz’s tables within the same database if they use different table prefixes.

 

Info

When changing the org.quartz.jobStore.tablePrefix, please change the SQL create scripts accordingly.

 

Include Page

Info

For more information and properties related to the connection JobStoreTX please visit JDBC-JobStoreTX.

JNDI Connection

 

To enable JNDI Connection jndidatasources profile must be activated and the following properties have to be used:

 

Code Block
titleapplication-scheduler-quartz.properties
spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreCMT
spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_

 

 

Code Block
title application-jndidatasources.properties - jndi
// JBoss Example provided that the jndi name is set to java:jboss/jdbc/quartzdb
blueriq.datasource.scheduler-quartz.jndiName=java:jboss/jdbc/quartzdb

// Tomcat Example provided that the jndi name is set to jdbc/quartzdb
blueriq.datasource.scheduler-quartz.jndiName=java:/comp/env/jdbc/quartzdb

 

JobStoreCMT relies upon transactions being managed by the application which is using Quartz. 

 

Info

For more information and properties related to the connection JobStoreCMT please visit JDBC-JobStoreCMT.

 

Thread Pool

If the Database configuration is chosen we recommend to also add the thread pool with the following default values:

The quartz documentation suggests the following configuration: provided that the database allows X connections, then the threadCount must be set to X - 3.

_DatasourceConfiguration
_DatasourceConfiguration

Info

The datasource created must be named scheduler-quartz

Thread Pool

When the database is configured, we recommend to also configure the thread pool. Each DCM project gets its Each DCM project gets it's own trigger. It is recommended to have a thread per DCM project. For example if you have 3 DCM projects you should set the threadCount to 3.

Please check that the threadCount does not exceed the number of available database connections (or connections in the database connection pool).  The quartz documentation suggests the following: provided that the database allows X connections, then the threadCount must be set to X - 3.

Below are the default thread Pool propertiesThread Pool properties are the following:

Code Block
languagepowershell
titleapplication-schedulercase-quartzengine.properties
spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
spring.quartz.properties.org.quartz.threadPool.threadCount=2
Info

For more information and properties related to Quartz ThreadPool, please visit ThreadPool Configuration

Cluster

Info
titleInfo

Clustered environment can be configured only for JDBC JobStore (JobStoreTX and JobStoreCMT).
For more information about clustered setup read Configuring Clustered Environment.

In order to run the Quartz Scheduler on multiple Runtime instances in a cluster, every Runtime instance has to be identical and have the same projects installed.
Each instance in the cluster needs to have the same  application-scheduler-quartz.properties files. You may set different thread pool size on each node.

To read more about quartz clustered environment visit Quartz in Cluster.

To set up quartz in cluster create the following two files and place them in your spring config additional location:Create a application-scheduler-quartz.properties file (check Quartz Properties Cluster for an example)
Make sure the following were added:
     1.1 Set spring.quartz.properties.org.quartz.jobStore.isClustered to true
     1.2 Set spring.quartz.properties.org.quartz.scheduler.instanceId to AUTO, or a different id for each instance node.

Clustering

There are many configuration properties for clustering, see the Quartz documentation. To enable clustering, specify at least these properties:

Code Block
languagepowershell
titleapplication-case-engine.properties
spring.quartz.properties.org.quartz.jobStore.isClustered=true
  • Create application-scheduler-quartz.properties file
  • Warning
    titleDo not enable this setting in clustered environment

    When quartz is used in a clustered environment one must not set the blueriq.processengine.cancel-started-tasks=true. The property can be set in the application-scheduler-quartz.properties file and the default value is false.

    When a single server is restarted and the blueriq.processengine.cancel-started-tasks is set to true all opened task are reset so they can be opened again.
    In a multi node environment the danger is when a single node is restarted and could result in having all tasks that are in progress being reset while they are still in progress on the other server.

    Cluster properties example

    Code Block
    titleapplcation-scheduler-quartz.properties - cluster
    spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
    spring.quartz.properties.org.quartz.threadPool.threadCount=2
    
    spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
    spring.quartz.properties.org.quartz.jobStorescheduler.tablePrefixinstanceName=QRTZ_
    
    spring.quartz.properties.org.quartz.jobStore.isClustered = true
    spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval = 90000
    spring.quartz.properties.org.quartz.scheduler.instanceName = MyClusteredScheduler
    spring.quartz.properties.org.quartz.scheduler.instanceId = AUTO
    spring.quartz.properties.org.quartz.scheduler.skipUpdateCheck = true
    

     

    Scheduler Maintenance Properties

    Info
    In this section you can find a list of scheduler related properties. These should be placed in a file named application-scheduler-quartz.properties in spring.config.additional-location.
    These properties are needed to enable or personalize scheduler functionalities from blueriq runtime perspective.
    UI Expand
    titleProperties
    Blueriq Property KeyDefault ValueDescriptionblueriq.scheduler-quartz.enable-task-migrationfalseUsed to enable quartz migration.
    For details about this property visit Migration.blueriq.scheduler-quartz.retryInterval30Represents a number in minutes, which is used for jobs retry mechanism in case of misfire.
    For more information about this property visit  Retry Interval.blueriq.scheduler-quartz.handleModelChangesfalse

    Used to enable updates on tasks and jobs when model changes.

    For more information about this property visit Handle Model Changes.

    Examples

    Default configuration file:

    Code Block
    titleapplication-scheduler-quartz.properties
    blueriq.scheduler-quartz.enable-task-migration=false
    blueriq.scheduler-quartz.retryInterval=30

    Retry Interval

    If the case is locked when a timer job or expiring job is fired a new quartz job will be scheduled. The reschedule interval for this job can be configured in minutes, with a property in application-scheduler-quartz.properties file. The default value is 30 minutes.

    Code Block
    titleapplication-scheduler-quartz.properties
    blueriq.scheduler-quartz.retryInterval=30

    Setup Quartz

    Various spring configurations

    Using spring cloud config

    Info

    Configure the runtime in cloud. For more details about how to do this visit The runtime in the cloud.

    Actions

    1. Place your scheduler properties in application-scheduler-quartz.properties (Check here for example) in the searchLocations you specified for spring cloud.
    2. Place application-externaldatasources.properties or application-jndidasarouces.properties files in the searchLocations you specified for spring cloud.

    Not using spring config additional location

    Default quartz properties will be used because application-scheduler-quartz.properties file is not present. The default setup is in-memory configuration.

    Scheduler properties can be personalized via JVM arguments:

    Code Block
    titleJVM Arguments
    -Dblueriq.scheduler-quartz.enable-task-migration=false
    -Dblueriq.scheduler-quartz.retryInterval=30

    If no property is defined, the default ones will be used.

    Using spring config additional location

    Info

    Configure a spring.config.additional-location for your application. For more details about how to do this visit Installing Runtime.

    1. In spring.config.additional-location folder place the application-scheduler-quartz.properties (Check here for example) file.
    2. In spring.config.additional-location folder place the application-externaldatasources.properties or application-jndidasarouces.properties files

    Using existing scheduled tasks

    In order for the already scheduled tasks to be executed in time, you need to do a migration to the scheduler.

    Before running the migration you need to create the following files and place them in your spring.config.additional-location folder:

  • Create a application-scheduler-quartz.properties file with one of the following configurations: Direct Connection(Case Engine Scheduler [Editor]Oracle), JNDI Connection.
    We advise you not to use an In-Memory Configuration or leave the default one for this purpose.
  • In the application-scheduler-quartz.properties file, set blueriq.scheduler-quartz.enable-task-scheduler and blueriq.scheduler-quartz.enable-task-migration to true (Check here for example).
    Info
    titleInfo
    For more information regarding migration preconditions read Migration API Preconditions.
    We exposed four endpoints to migrate timer, expiration, priority and pending automatic tasks to quartz scheduler. In order to use them follow the steps described in Scheduler Migration API.
    MyClusteredScheduler
    # Have Quartz generate an instanceId for each node in the cluster
    spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO

    Anchor
    Troubleshooting
    Troubleshooting
    Troubleshooting


    Setup quartz in cluster

    Overview

    Basic Scheduler

    The quartz evaluation of time dependent tasks (timer nodes, tasks with priority algorithms, expiration tasks, automatic recovery tasks) is done per Process Engine per Project installed on the Runtime. A quartz job is created for every single project which uses a process engine in the cluster. The number of jobs in Quartz equals with the number of initialized projects from the cluster which are using a process engine. The number of jobs in quartz does not depend on the number of runtime instances available in the cluster.

    An interval is defined in the application.properties file which marks the triggering and execution of the job. If the interval is MINUTE, the quartz job will be triggered and executed every minute. The execution consists in finding and evaluating all the timer tasks, expiration tasks, tasks with priority which should fire in that period.
    The Runtime instances are selected for execution almost randomly, more busy servers have a lower chance to be selected for the execution.The main advantage for this is that:  As multiple runtime instances are available in cluster, the execution of the jobs might be done in parallel.

    The quartz job is created in the cluster when the project which uses a process engine is initialized. This means whenever a project is published and the process engine is initialized in a Runtime, that Runtime will try to start the job for the project if the job is not already created.

    The execution of quartz jobs is being done on any Runtime in the cluster as soon as the Runtime is started. This might happen even though in that Runtime no projects are published yet. 

    Advanced Scheduler

    The quartz evaluation of a timer task, a expiration task, a task with priority or an automatic task is done per task. A quartz job is created for every task which has one of the types described earlier. The number of jobs in quartz equals with the number of timer, expiration and task with priority which have to be evaluated in the future.
    Every job fires exactly at the time it was modelled without re-checking this at an interval as the basic scheduler did. The runtime instances are selected randomly and the execution of a job can happen on any of those instances in parallel. AnchorTroubleshootingTroubleshootingTroubleshooting
    Warning
    iconfalse

    There might be a side scenario in which one runtime in a cluster does not have all the projects available but it is started. In this case, Quartz might trigger a job on that server without having a project to run on. If this happens the job for that project is deleted and won't trigger until the project is loaded - this usually means that there is a configuration problem in the cluster. Loading/publishing a project in a Runtime will trigger the creation of the job in the cluster if the job doesn't already exist.

    If you're uncertain that a job is running or not, you can check the logs. Starting or deleting a job is always logged. Besides this you can check the quartz database. In the table QRTZ_JOB_DETAILS there should be a column JOB_NAME. That field should contain the project and process engine name for which that job was created.

    It is very recommended that no changes to be done in quartz tables and you let only Quartz manage the data there.

    Info

    For more information on quartz configurations, please visit: Quartz-Scheduler.org.

    Info
    titleAtomikos transaction log

    If you want to run multiple runtimes on one machine, Atomikos tends to fail to access it's transaction log. This will result in a runtime that doesn't start.

    To fix this problem, add a VM argument to one of your runtimes to set the folder of the Atomikos transaction log files to something other than the default (which is '${user.home}').

    Code Block
    -Dcom.atomikos.icatch.log_base_dir=C:/tmlogs/tmlog-development/

    For more information please refer to the Atomikos documentation

    https://www.atomikos.com/Documentation/JtaProperties#Transaction_logs