FAQs

Frequently Asked Questions - All FAQs

Please select your question category

Search FAQs

General questions about the product.

We launched QuartzDesk for public in May 2013. The development started about 2 years prior to the launch date.

Yes, there is. To access the online demo all you need to do is fill in this form. After you submit the form, you will receive online demo access and usage instructions and you can have a play.

The online demo showcases the QuartzDesk Enterprise edition.

We provide three editions - one free edition (Lite) and two paid editions (Standard and Enterprise). For their differences, please refer to the Editions Comparison Matrix.

No. QuartzDesk can only be used to manage and monitor Java Quartz schedulers.

At this time, we do not have any plans to add support for Quartz.NET. If you are interested in using QuartzDesk with Quartz.NET schedulers, please let us know. If we see enough demand, we may reconsider and implement support for Quartz.NET. 

QuartzDesk supports all Quartz scheduler versions from 1.8.5 to 2.3.0.

QuartzDesk platform runs on all modern Java application servers and databases. For a complete list of all supported platforms and details, please refer to our Supported Platforms list.

It depends. We aim to release a new version every 30 days or sooner and we typically have one bigger release every 6 months. You can check our release history to see the actual release frequency etc.

Yes, we do. If you follow us on social networks (Facebook, Google+, Twitter), then you will receive all important product related news, including notifications on new releases, bug fixes, etc.

The social traffic that we generate is fairly low so you do not have to be worried about ours posts filling up your news feed.

US ECCN: 5D992.

EU ECCN: QuartzDesk is not subject to Wassenaar dual-use Control List and as such it does not have / need the EU ECCN.

Absolutely, but read on.

QuartzDesk is a generic Java Quartz scheduler management and monitoring platform that does not provide any scheduling capabilities by itself. It always relies on an external Java Quartz scheduler instance it connects to.

In order to be able to schedule execution of shell command or scripts, you need to have a Java Quartz scheduler based application that provides Quartz job implementation classes that allow you to wrap execution of shell commands and scripts. We provide such an application, called QuartzDesk Executor (QE), free of charge and with complete source code. The application source code and binary releases can be obtained from our public GitHub repository: https://github.com/quartzdesk/quartzdesk-executor

We and some of our customers use QE as a replacement for legacy Unix/Linux cron-based scheduling systems. For example, we use QE in our backend systems to schedule, manage and monitor the following types of jobs:

  • Database backups.
  • File system backups.
  • Monitoring of CPU, memory and disk space usage.

All Quartz job store types are supported by QuartzDesk.

As a matter of fact, the Quartz job store type and configuration details are completely transparent from the QuartzDesk's perspective because QuartzDesk *NEVER* accesses the job store directly, for example through JDBC etc. QuartzDesk accesses the Quartz job store through higher-lever Quartz scheduler APIs that shield us from the underlying job store details.

QuartzDesk can send notification messages through the following channels:

A custom MessageReceiverService JAX-WS web service implementation enables you to perform custom processing of received notification messages. For example, you can easily turn received notification messages into Atlasian Jira or Bugzilla tickets etc.

This is because Tomcat 10.x is based on Jakarta EE rather than Java EE. In Jakarta EE, various javax.* packages have been migrated to new jakarta.* packages and this causes various java.lang.ClassNotFoundException errors when deploying applications that still use the "old" Java EE javax.* packages.

Because QuartzDesk aims to support a wide range of modern application servers / containers most of which are still Java EE-based, it is currently impossible to migrate QuartzDesk to Jakarta EE.

Fortunately, Tomcat 10.x provides an easy way to host "old" Java EE-based applications, QuartzDesk Web Application included. All you need to do is add the following line to the QuartzDesk Web Application's deployment descriptor typically located in ${TOMCAT_HOME}/conf/Catalina/localhost/quartzdesk.xml file.

<Context path="/quartzdesk" docBase="...">
...
<Loader jakartaConverter="TOMCAT" />
...
</Context>

No, it is not because none of the QuartzDesk components use Log4j2 logging framework for logging. All QuartzDesk components use Logback logging framework through Slf4j logging API.

Questions about licensing and payment methods.

We currently accept the following payment methods:

Debit or Credit Cards: To pay with your credit or debit card, please choose the PayPal payment method in our eshop. We use PayPal to process all bank card transactions.

Please note that you do not have to have a PayPal account to pay with your debit or credit card through PayPal. After you have been redirected to PayPal, select the Pay with a debit or credit card option, fill in your bank card details and click Pay. You can refer to the picture below.

PayPal Payment With Credit or Debit Card

PayPal Balance: If you have a PayPal account, you can use this option to pay quickly and easily. Please choose the PayPal payment method in our online eshop and after being redirected to the PayPal checkout page, select the Pay with my PayPal account option, fill in your PayPal login credentials and log in. You can refer to the picture below.

PayPal - Pay With a Debit or Credit Card

Wire Transfer: You can make a quick and safe bank wire transfer payment any time you need. Upon receiving your order, we will send you a pro-forma invoice with payment details (amount due, our bank account details) for you to realize your payment. Upon receiving your payment, we will send you the final invoice and license keys.

No, we do not.

However, we offer 30-day free and fully-functional trial licenses for all paid QuartzDesk editions. During the 30-day trial period we will provide you with unlimited technical support so that you can install and test the product as you wish.

If you need more time to evaluate our product, please contact our Technical Support through our online chat or via email at support@quartzdesk.com, and request an extension of your trial.

Starting with QuartzDesk release 1.6.0, the QuartzDesk Public API library (quartzdesk-api-x.y.z.jar) source code is freely available and can be redistributed without any restrictions. The source code can be downloaded from the Maven Central repository and it is not available for download on our website.

The QuartzDesk Web Application (quartzdesk-web-x.y.z.war) and QuartzDesk JVM Agent (quartzdesk-agent-x.y.z.jar) source code is available only to selected OEM partners who wish to re-brand and re-distribute QuartzDesk as a part of their own product offering.

If you wish to receive detailed information on our OEM partnership program, please send an inquiry to sales@quartzdesk.com.

We provide three QuartzDesk editions - Lite, Standard and Enterprise. The Lite edition is free and the other two editions are paid.

For details on features available in individual QuartzDesk editions, please refer to the Editions Comparison Matrix.

For licensing and pricing details, please refer to Pricing & Licensing Terms.

No, you can use the same license key that you use for the QuartzDesk Web Application installation.

We offer discounts programs to the following subject categories. To apply we ask you to fill in and submit an application form with the relevant evidence. 

  • Startups (60% OFF) - Apply
  • Open-Source Projects (FREE) - Apply
  • Academia (upto  80% OFF) - Apply
  • Non-For-Profit Organizations (upto 80% OFF) - Apply

After you submit the application form, we will review the submitted data and inform you whether the discount can be granted and the actual discount percentage applicable to your case.

Besides the above mentioned discounts, we also offer quantity and promotional discounts. Please use our Live Chat or send us a message to find out about the applicable discounts.

Yes, it is perfectly possible. The upgrade process is depicted in the following picture:

Upgrade Standard Edition License to Enterprise Edition License

To upgrade you will need to purchase a new replacement enterprise edition license for a discounted price. The discount is proportional to the length of unused SW Maintenance of your existing standard edition license. Please contact us prior to upgrading so that we can give you a special discount coupon code that you will redeem in our online eshop to receive the replacement enterprise edition license for a discounted price.

The actual formula to calculate the upgrade price is:

Enterprise Edition License Price - ( Standard Edition License Price / 365 ) * Number of Unused SW Maintenance Days of the Standard Edition License

Please note that the SW Maintenance of the replacement enterprise edition license will start on the day on which you purchase the license and will end 12 months after that. Therefore, with the upgrade we automatically extend your original SW Maintenance - see the picture above.

No, it is not possible. You will need to purchase a new standard edition license, e.g. after the SW Maintenance of your current enterprise edition license expires.

Questions about the support we provide.

All non-free QuartzDesk edition licenses come automatically with 12 months of SW Maintenance that includes unlimited technical support and free product upgrades.

Once the SW Maintenance period is over, your software remains fully functional, but you will not be able to upgrade it nor will you be eligible to receive any technical support.

You can renew your SW Maintenance anytime for a highly discounted price. 30 days prior to your your SW Maintenance expiry, we will send an email notification message to the registered email address associated with your license key. For further details, please refer to our Pricing & Licensing Terms page.

SW Maintenance entitles you to download and install all fixes, updates and new product versions and to receive technical support. SW Maintenance is available only for non-free QuartzDesk editions (i.e. the Standard and Enterprise edition).

SW Maintenance has to be renewed every year and amounts to roughly 45% of the license cost.

All new non-free QuartzDesk edition license purchases initially come with 12 months of SW Maintenance. After the SW Maintenance expires, you can decide to keep the currently installed version or to purchase another year of SW Maintenance.

SW Maintenance for your license(s) can be renewed on this page. You will only need to enter serial numbers of licenses whose SW Maintenance you wish to renew and complete three simple steps.

The license serial number uses the XXXX-XXXX-XXXX-XXXX format and it is available in your license.key file - see the value of the serial-number element. Alternatively, the serial number can be obtained from a running QuartzDesk Web Application - see Help > License > Serial Number.

Please note that we will automatically notify you via email three times prior to the SW Maintenance expiry date. The notification message includes a unique link that you can use to renew the SW Maintenance.

Upon completing of the renewal process, you will receive replacement license keys with extended SW Maintenance. You must not use the old (replaced) license keys as they will not allow you to apply product upgrades and we will not provide technical support for installations that use old license keys.

You can renew your SW Maintenance anytime. The new SW Maintenance will start as follows:

(1) If you renew after the expiry of your current SW Maintenance, then your new SW Maintenance will start on the expiry date of your current SW Maintenance and finish 12 months after the expiry date of your current SW Maintenance.

(2) If you renew before the expiry of your current SW Maintenance, then your new SW Maintenance will start on the renewal date and finish 12 months after the expiry date of your current SW Maintenance.

 

We provide limited technical support with the product installation to QuartzDesk Lite (free) edition users.

We provide unlimited technical support to QuartzDesk Standard and Enterprise edition users with active SW Maintenance - see our FAQs for a detailed explanation of what SW Maintenance is.

Technical support is provided on the best-effort basis and there is no guaranteed response / resolution time unless agreed otherwise. We address all submitted support tickets and questions with the highest priority with an average response / resolution time of 1-2 hours during our regular office hours (Mon-Fri 9am-17pm CET).

If you need instant help, you are welcome to use our Live Chat that is available during the above office hours.

No, unless agreed otherwise (e.g. with our OEM partners), we generally do not do that. Instead we prepare a new release based on the latest released version.

Let us say the latest released version is 2.4.1 (major.minor.maintenance). When we fix an issue and/or add some new functionality, we increment either the maintenance version number (2.4.1 -> 2.4.2), or the minor version number (2.4.1 -> 2.5.0) by 1.

The maintenance version number is increased if the new version is backward compatible with the previous release(s) having the same major and minor version numbers.

If the new version breaks the backward compatibility, we increase the minor version number.

For further details, please refer to Versioning & Compatibility page.

Questions about the QuartzDesk JVM Agent component used in the Standard and Enterprise edition.

The version number can be obtained from the QuartzDesk JVM Agent log file.

...
[2018-01-28 10:13:41,912] I [main] [com.quartzdesk.agent.Agent:405] - Initializing JVM Agent: 
com.quartzdesk.agent.Agent@1f3785d3 [QuartzDesk JVM Agent v3.2.0]
...
[2014-01-28 10:13:47,318] I [main] [com.quartzdesk.agent.Agent:277] - Successfully initialized JVM Agent:
com.quartzdesk.agent.Agent@1f3785d3 [QuartzDesk JVM Agent v3.2.0], enabled: true
...

Alternatively, the version number can be be obtained from the QuartzDesk JVM Agent distribution JAR file. Open the JAR file as a ZIP archive (you may need to temporarily rename the JAR file from quartzdesk-agent.jar to quartzdesk-agent.zip) and open the META-INF/MANIFEST.MF file.

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.9.4
Created-By: Apache Maven 3.3.9
Implementation-Title: quartzdesk-agent
Build-Date: 2018-01-25
Build-Number: 3
Implementation-Version: 3.2.0
Built-By: honza
Agent-Class: com.quartzdesk.agent.Agent
Implementation-Vendor-Id: com.quartzdesk
Implementation-Vendor: QuartzDesk.com
Implementation-Vendor-URL: https://www.quartzdesk.com
Premain-Class: com.quartzdesk.agent.Agent
Build-Jdk: 1.8.0_152

This exception can occur when the agent attempts to store an execution history record in the quartzdesk_agent DB. It typically happens when the agent tries to store a record with a large (>500KB) job execution log.

To fix this error, you will need to adjust the value of the max_allowed_packet variable in your MySQL server configuration. The max_allowed_packet is measured in bytes and its new value should be large enough to accomodate the largest of your job execution logs produced by your jobs.

To determine the new max_allowed_packet value, you can extract the relevant error messages from your QuartzDesk JVM Agent log files using the following command:

grep "max_allowed_packet" *.log

In the output that contains a list of "Packet for query is too large (xxxx > yyyy)..." errors, search for the line with the biggest xxxx number.  Set the max_allowed_packet variable to a number that is 10-20% bigger than the biggest found xxxx number.

If you are getting the following or similar exception, then you are hitting a bug in the Oracle JDBC driver documented here (requires access to Oracle Metalink site): https://metalink.oracle.com/metalink/plsql/ml2_documents.showDocument?p_database_id=BUG&p_id=7112447

[2015-12-21 17:35:14,984] E [QuartzScheduler_Worker-1] [com.quartzdesk.agent.scheduler.common.a:140] - Error processing job execution event: QuartzJobExecutionEvent[...]
com.quartzdesk.agent.api.AgentException: Error creating instance of: class com.quartzdesk.agent.api.domain.model.scheduler.quartz.QuartzExecHistory
...
Caused by: java.lang.ArrayIndexOutOfBoundsException: 35 at oracle.jdbc.driver.OracleSql.computeBasicInfo(OracleSql.java:1005) ~[ojdbc6dms.jar:Oracle JDBC Driver version - "11.1.0.7.0-Production"] at oracle.jdbc.driver.OracleSql.getSqlKind(OracleSql.java:655) ~[ojdbc6dms.jar:Oracle JDBC Driver version - "11.1.0.7.0-Production"] at oracle.jdbc.driver.OraclePreparedStatement.(OraclePreparedStatement.java:1225) ~[ojdbc6dms.jar:Oracle JDBC Driver version - "11.1.0.7.0-Production"] at oracle.jdbc.driver.T4CPreparedStatement.(T4CPreparedStatement.java:30) ~[ojdbc6dms.jar:Oracle JDBC Driver version - "11.1.0.7.0-Production"] at oracle.jdbc.driver.T4CDriverExtension.allocatePreparedStatement(T4CDriverExtension.java:70) ~[ojdbc6dms.jar:Oracle JDBC Driver version - "11.1.0.7.0-Production"] at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:3906) ~[ojdbc6dms.jar:Oracle JDBC Driver version - "11.1.0.7.0-Production"] at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:3688) ~[ojdbc6dms.jar:Oracle JDBC Driver version - "11.1.0.7.0-Production"] at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:9655) ~[ojdbc6dms.jar:Oracle JDBC Driver version - "11.1.0.7.0-Production"] at ext.org.apache.commons.dbcp.DelegatingConnection.prepareStatement(SourceFile:532) ~[quartzdesk-agent-2.3.0.jar:2.3.0] at ext.org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.prepareStatement(SourceFile:415) ~[quartzdesk-agent-2.3.0.jar:2.3.0] at com.quartzdesk.agent.scheduler.quartz.a.b.e.a(SourceFile:778) ~[quartzdesk-agent-2.3.0.jar:2.3.0] at com.quartzdesk.agent.scheduler.quartz.b.a(SourceFile:189) ~[quartzdesk-agent-2.3.0.jar:2.3.0] at com.quartzdesk.agent.scheduler.quartz.b.a(SourceFile:52) ~[quartzdesk-agent-2.3.0.jar:2.3.0] at com.quartzdesk.agent.scheduler.common.a.a(SourceFile:446) ~[quartzdesk-agent-2.3.0.jar:2.3.0] ... 8 common frames omitted

To resolve this issue, you must upgrade the Oracle JDBC driver that is used by the agent.

Oracle 11g and 12c JDBC drivers can be downloaded from here: http://www.oracle.com/technetwork/database/features/jdbc/index-091264.html

First you may try increasing the JVM heap memory size by adjusting the values of the -Xmx and/or -XX:MaxPermSize JVM command line arguments to increase the maximum available JVM heap size and the JVM perm space respectively. Please refer to your JVM documentation for details on how to use these parameters.

If the problem remains, you will need to obtain a heap dump from the JVM and analyze it using one of the available Java memory heap analysis tools. We recommend using the free Eclipse Memory Analyzer Tool.

We strongly recommend adding the following JVM command line arguments that instruct the JVM to automatically produce a heap dump file when the OutOfMemoryError occurs. 

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=<heap dump output directory>

Make sure there is enough free disk space in the specified heap dump output directory because the generated heap dump files can be very large. For example, for a JVM running with the maximum heap size of 1GB, the size of the generated heap dump file can be up to 1GB. The specified heap dump output directory must be writable by the user/group the JVM process is running under.

Please note that -XX:+HeapDumpOnOutOfMemoryError and -XX:HeapDumpPath JVM arguments can be safely used in all production or production-like environments as they do not impact the JVM performance in any way.

Yes, you can, but make sure all of the Quartz schedulers running on all JVMs with agents that use the same (shared) database, have unique object names. QuartzDesk platform uses Quartz scheduler object names as unique Quartz scheduler identifiers.

Unless you explicitly tell the Quartz scheduler what object name to use (using the org.quartz.scheduler.jmx.objectName configuration property), Quartz scheduler uses the object name with the following format:

quartz:type=QuartzScheduler,name=<scheduler_name>,instanceId=<scheduler_instance_id>

Where:

scheduler_name
Name of the Quartz scheduler instance running in your application. This name is typically set using the org.quartz.scheduler.instanceName configuration property.

scheduler_instance_id
Optional instance ID of the Quartz scheduler instance running in your application. The instance ID is either statically assigned (see the org.quartz.scheduler.instanceId configuration property), or it is generated dynamically by the configured Quartz InstanceIdGenerator class (see the org.quartz.scheduler.instanceIdGenerator.class  configuration property).

In the QuartzDesk GUI you can see the Quartz scheduler object name either in the connection registration dialog:

Quartz scheduler object name in the connection registration dialog.

or in the Scheduler Info tab when you open the Quartz scheduler connection:

Viewing the Quartz scheduler object name in the Scheduler Info tab.

Exception stack trace:

java.lang.IllegalStateException: The LogManager was not properly installed (you must set the "java.util.logging.manager" system property to "org.jboss.logmanager.LogManager")
        at org.jboss.logmanager.Logger.getLogger(Logger.java:61)
        at org.jboss.as.server.Main.main(Main.java:84)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.jboss.modules.Module.run(Module.java:312)

This exception is caused by a known bug in JDK that is documented here:

https://access.redhat.com/solutions/3234671

https://access.redhat.com/solutions/3370101

To prevent the exception, please add the following JVM system property to the JBoss startup script:

Windows (standalone.conf.bat or domain.conf.bat)

set "JAVA_OPTS=%JAVA_OPTS% -Dsun.util.logging.disableCallerCheck=true"

Unix/Linux (standalone.conf or domain.conf)

JAVA_OPTS="${JAVA_OPTS} -Dsun.util.logging.disableCallerCheck=true"

Starting with QuartzDesk release 4.0.9, it is possible to encrypt arbitrary configuration properties in quartzdesk-agent.properties file using any of the following supported symmetric ciphers:

  • AES 128
  • AES 192
  • AES 256
  • BlowFish 256
  • DES 56

To generate encryption keys and encrypt selected configuration parameter values, please run the following command from the command line:

On Windows:
JDK_HOME\bin\java.exe -cp quartzdesk-agent-x.y.z.jar com.quartzdesk.agent.tool.PasswordEncryptor

On Linux/Unix:
JDK_HOME/bin/java -cp quartzdesk-agent-x.y.z.jar com.quartzdesk.agent.tool.PasswordEncryptor

Where JDK_HOME is the path to your JDK installation directory.

 

QuartzDesk JVM Agent cipher key generator

Enter 1 to choose the Generate secret key action.

Enter the number that represents the cipher algorithm that you wish to use. A cipher key will be generated. Copy the secret key value and store it in quartzdesk-agent.ciphers file inside the configured QuartzDesk JVM Agent work directory. The format of this file is as follows:

[CIPHER_ALGORITHM_NAME].key = [CIPHER_KEY] 

Where [CIPHER_ALGORITHM_NAME] is one of the supported cipher algorithm names:

  • AES_128
  • AES_192
  • AES_256
  • BLOWFISH_256
  • DES_56

[CIPHER_KEY] is the generated cipher key value.

For example:

AES_256.key = ClocqqsqYaPzTSvVwaSEOy6oqRsW7n15E0CDm/F55KY=

Enter 2 to encrypt a config property value using the generated cipher key. Use the encrypted value in your quartzdesk-agent.properties like so:

[CONFIG_PROPERTY_NAME] = [CIPHER_ALBORITHM_NAME]{[ENCRYPTED CONFIG PROPERTY VALUE]}

For example:

jdbc.password = AES_256{McnLcqGMlSiMBXBvcsb2sLiCpOIwA17xZf8HFucVT/k=}

Note: You can extract sample quartzdesk-agent.ciphers and quartzdesk-agent.properties files from quartzdesk-agent-x.y.z.jar/extras/work directory. Copy these files to the configured QuartzDesk JVM Agent work directory.

Questions about the QuartzDesk Web Application component providing the GUI for all product editions.

Yes. The QuartzDesk Web Application has been designed to run on clusters. Please refer to the Cluster Deployment Notes chapter in the QuartzDesk Installation and Deployment Guide for cluster deployment details.

Please that you only need a single license to deploy the QuartzDesk Web Application to a cluster regardless of the number of cluster members.

The version number is displayed in the login dialog of a running QuartzDesk Web Application.

The version number is also displayed in the About window. The About window can be accessed using the About link in the login dialog of a running QuartzDesk Web Application or from the main menu shown in the top-right corner after a user successfully logs in.

Alternatively, the version number can be be obtained from the QuartzDesk Web Application distribution WAR file. Open the WAR file as a ZIP archive (you may need to temporarily rename the WAR file from quartzdesk-web.war to quartzdesk-web.zip) and open the META-INF/MANIFEST.MF file.

Manifest-Version: 1.0
Implementation-Title: quartzdesk-web
Build-Date: 2018-01-25
Implementation-Version: 3.2.0
Built-By: honza
Implementation-Vendor-Id: com.quartzdesk
Class-Path: lib/quartzdesk-api-3.2.0.jar 
...
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_152
Main-Class: Launcher
Implementation-Vendor: QuartzDesk.com
Implementation-Vendor-URL: https://www.quartzdesk.com

The installed edition is displayed in the login dialog of a running QuartzDesk Web Application.

The installed edition is also displayed in the About window. The About window can be accessed using the About link in the login dialog of a running QuartzDesk Web Application or from the main menu shown in the top-right corner after a user successfully logs in.

Alternatively, the installed edition can be obtained from the license key file used by the QuartzDesk Web Application. The license key file is located in the configured QuartzDesk Web Application work directory.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:license xmlns:ns2="http://license.quartzdesk.com/v1_0">
    <serial-number>1</serial-number>
    <issue-date>2013-05-28+02:00</issue-date>
    <type>PERPETUAL</type>
    <licensee>
        <name>Test License</name>
    </licensee>
    <issuer>
        <name>CN=QuartzDesk.com CA2, O=QuartzDesk</name>
        <email>sales@quartzdesk.com</email>
        <web>www.quartzdesk.com</web>
        <certificate>-----BEGIN CERTIFICATE-----
MIID9jCCAt6gAwIBAgIBAjANBgkqhkiG9w0BAQUFADAxMRMwEQYDVQQKEwpRdWFy
...
7cwIppIYwyMAmw==
-----END CERTIFICATE-----
</certificate>
    </issuer>
    <products>
        <product id="QuartzDesk">
            <name>QuartzDesk Enterprise Edition</name>
            <edition>Enterprise</edition>
            <version>
                <major>1</major>
            </version>
            <feature-set id="Quartz">
            ...
            </feature-set>
        </product>
    </products>
    <signature>...</signature>
</ns2:license>

The one-step installation mode allows you to get QuartzDesk Web application up and running within just a few minutes by following these five simple steps:

  1. Verify that Java Development Kit (JDK) 8, or newer has been installed on your system. 
  2. Create a QuartzDesk Web Application work directory anywhere on the local filesystem. You can use any directory name, for example, c:\quartzdesk-web, or /var/quartzdesk-web.
  3. Copy the downloaded quartzdesk-web-x.y.z.war file and QuartzDesk license key file (license.key) to the created QuartzDesk Web Application work directory.
  4. In the QuartzDesk Web Application work directory execute the following command:
    On Windows:
    JDK_HOME\bin\java.exe -jar quartzdesk-web-x.y.z.war 

    On Linux/Unix:
    JDK_HOME/bin/java -jar quartzdesk-web-x.y.y.war

    Where JDK_HOME is the path to your JDK installation directory.
  5. Wait for the application to start up and open the displayed application URL in your browser.

QuartzDesk Zero-Installation Mode

In the one-step installation mode QuartzDesk Web Application is started using an embedded Jetty servlet container / HTTP server and H2 database. The H2 database is automatically created and initialized in the QuartzDesk Web Application work directory upon application startup.

You can tweak the application web context name (default is /quartzdesk) and port number (default is 8080) using the following parameters specified at the end of the command line used to start the application:

ParameterDescriptionExample
--port <number>The HTTP port number used by Jetty. The default is 8080.--port 9090
--context-path <path>The web-application context path used by Jetty. The default is /quartzdesk. --context-path /qd

 

If you want to use an alternative database in the one-step installation mode, please apply the following extra configuration steps:

  1. Extract the template of the QuartzDesk Web Application configuration file from quartzdesk-web-x.y-z.war/extras/work/quartzdesk-web.properties and copy this file to the configured QuartzDesk Web Application work directory.
  2. Edit the copied QuartzDesk Web Application configuration file and change the value of the db.profile configuration property to match the desired database profile. For the list of available database profiles, please refer to the comments in the configuration file.
  3. Uncomment and adjust the values of all onestep.jdbc.* configuration properties that are applicable to the desired database.
  4. Download a JDBC driver for the desired database and add it to the WEB-INF/lib directory in the quartzdesk-web-x.y-z.war archive inside the QuartzDesk Web Application work directory.
  5. Restart the QuartzDesk Web Application in the one-step installation mode as described above.

 

The one-step installation mode is meant to be used solely for experimental and evaluation purposes. We advise against using this mode for any other purpose, e.g. for production deployments.

 

When you see this warning it means the QuartzDesk JVM agent has not been installed on the JVM the Quartz scheduler connection points to.

The QuartzDesk JVM Agent is required by some of the advanced QuartzDesk features. When the JVM agent is not available, these features cannot be used and are disabled in the QuartzDesk GUI.

Steps to fix the problem:

  1. Edit the Quartz scheduler connection to see which JVM and Quartz scheduler instance the connection points to. The target JVM can be identified using the host and port. The Quartz scheduler instance can be identified using the Quartz scheduler object name.
  2. Make sure the QuartzDesk JVM Agent is installed on the target JVM. For installation details, please refer to the QuartzDesk JVM Agent Installation And Upgrade Guide available for download in Installation And Upgrade Guides.
  3. Close the warning dialog and repeat the original action.

When you see this warning it means the version of the installed QuartzDesk Web Application is not compatible with the version of the QuartzDesk JVM Agent installed on the JVM the Quartz scheduler connection points to.

QuartzDesk platform requires the major and minor version numbers of all QuartzDesk components (QuartzDesk Web Application, QuartzDesk JVM Agent, QuartzDesk Public API Library) must match. For details, please refer to the Versioning & Compatibility page.

Steps to fix the problem:

  1. Edit the Quartz scheduler connection to see which JVM and Quartz scheduler instance the connection points to. The target JVM can be identified using the host and port. The Quartz scheduler instance can be identified using the Quartz scheduler object name.
  2. Make sure the correct version of the QuartzDesk JVM Agent version is installed and enabled on the target JVM. For installation details, please refer to the QuartzDesk JVM Agent Installation And Upgrade Guide available for download in Installation And Upgrade Guides.
  3. Close the warning dialog and repeat the original action.

When you see this warning it means the license edition used for the QuartzDesk Web Application is not compatible with the license edition used by the QuartzDesk JVM Agent.

QuartzDesk platform requires the license edition of the QuartzDesk JVM Agent to be the same or higher than the license edition of the QuartzDesk Web Application. For example, if you are running the QuartzDesk Web Application with the Standard edition license, then the QuartzDesk JVM Agent edition license must be either Standard, or Enterprise.

Steps to fix the problem:

  1. Edit the Quartz scheduler connection to see which JVM and Quartz scheduler instance the connection points to. The target JVM can be identified using the host and port. The Quartz scheduler instance can be identified using the Quartz scheduler object name.
  2. Make sure the QuartzDesk JVM Agent uses a matching, or higher license edition then the QuartzDesk Web Application. For license installation details, please refer to the QuartzDesk JVM Agent Installation And Upgrade Guide available for download in Installation And Upgrade Guides.
  3. Close the warning dialog and repeat the original action.

When you see this warning it means the QuartzDesk Public API Library JAR has not been installed on the Quartz scheduler's classpath as described in the QuartzDesk JVM Agent Installation and Upgrade Guide.

The QuartzDesk Public API Library connects the Quartz scheduler with the QuartzDesk JVM Agent. Without this connection, some of the advanced QuartzDesk features cannot function properly and are disbaled in the QuartzDesk GUI.

Steps to fix the problem:

  1. Edit the Quartz scheduler connection to see which JVM and Quartz scheduler instance the connection points to. The target JVM can be identified using the host and port. The Quartz scheduler instance can be identified using the Quartz scheduler object name.
  2. Make sure the QuartzDesk Public API Library JAR is installed on the Quartz scheduler's classpath and is loaded by the same classloader that loads the Quartz scheduler API (quartz-x.y.z.jar). For installation details, please refer to the QuartzDesk JVM Agent Installation And Upgrade Guide available for download in Installation And Upgrade Guides.
  3. Make sure there is only one QuartzDesk Public API Library JAR on the Quartz scheduler's classpath.
  4. Close the warning dialog and repeat the original action.

When you see this warning it means the QuartzDesk Public API Library JAR is present on the Quartz scheduler's classpath, but it is not loaded by the same class loader that loads the Quartz scheduler API (quartz-x.y.z-jar).

Steps to fix the problem:

  1. Edit the Quartz scheduler connection to see which JVM and Quartz scheduler instance the connection points to. The target JVM can be identified using the host and port. The Quartz scheduler instance can be identified using the Quartz scheduler object name.
  2. Make sure the QuartzDesk Public API Library JAR is installed on the Quartz scheduler's classpath and is loaded by the same classloader that loads the Quartz scheduler API (quartz-x.y.z.jar). For installation details, please refer to the QuartzDesk JVM Agent Installation And Upgrade Guide available for download in Installation And Upgrade Guides.
  3. Make sure there is only one QuartzDesk Public API Library JAR on the Quartz scheduler's classpath.
  4. Close the warning dialog and repeat the original action.

When you see this warning it means the version of the QuartzDesk Public API Library installed on the Quartz scheduler's classpath is not compatible with the version of the QuartzDesk JVM Agent installed on the JVM the Quartz scheduler connection points to.

Steps to fix the problem:

  1. Edit the Quartz scheduler connection to see which JVM and Quartz scheduler instance the connection points to. The target JVM can be identified using the host and port. The Quartz scheduler instance can be identified using the Quartz scheduler object name.
  2. Make sure the correct version of the QuartzDesk Public API Library is installed on the Quartz scheduler's classpath. At least the major and minor version numbers must match. For installation details, please refer to the QuartzDesk JVM Agent Installation And Upgrade Guide available for download in Installation And Upgrade Guides.
  3. Make sure there is only one QuartzDesk Public API Library JAR on the Quartz scheduler's classpath.
  4. Close the warning dialog and repeat the original action.

When you see this message, it means the statistics data has not been generated yet.

It can be caused by either of the following reasons:

  • The execution history is empty because no jobs have been executed yet. Therefore there is no execution history data to generate the execution statistics from.
  • The execution history is not empty, but the execution history data has not been processed yet. The processing is performed by the QuartzDesk AgentExecStatisticsJob which is normally executed every hour on the hour.

This happens in clustered Quartz scheduler deployments that are configured to use auto-generated Quartz scheduler instance IDs (org.quartz.scheduler.instanceId=AUTO) and either of the following two conditions holds true:

    1. Quartz is not configured to use any particular instance ID generator class. In this case Quartz uses the default instance ID generator class org.quartz.simpl.SimpleInstanceIdGenerator.
    2. Quartz is explicitely configured to use the org.quartz.simpl.SimpleInstanceIdGenerator instance ID generator class.

org.quartz.simpl.SimpleInstanceIdGenerator class produces random instance IDs upon every Quartz scheduler restart. Unless you have configured Quartz to use an explicit JMX export name for its MBean using the org.quartz.scheduler.jmx.objectName configuration property, Quartz embeds the generated instance ID into the JMX scheduler object name. QuartzDesk platform uses the JMX scheduler object name as a Quartz scheduler ID and requires this object name to be constant.

Please avoid using the org.quartz.simpl.SimpleInstanceIdGenerator class and instead use one of the following implementations available in the Quartz scheduler distribution. The instance ID generator class to be used by Quartz can be set using the org.quartz.scheduler.instanceIdGenerator.class Quartz configuration property.

ImplementationDescription
org.quartz.simpl.HostnameInstanceIdGeneratorReturns the hostname as the instance ID.
org.quartz.simpl.SystemPropertyInstanceIdGeneratorReturns the value of the org.quartz.scheduler.instanceId system property. Available with Quartz 2.0 or higher.


If none of the above implementations suits your needs, you can implement your own InstanceIdGenerator implementation that can, for example, read the scheduler ID from the application configuration file. 

Absolutely. However you need to modify your job implementation class a bit so that QuartzDesk can associate the spawned worker threads with the correct job execution thread.

If your Quartz job implementation class uses the Java Executor API and worker threads that do not produce Future results:

public class MyJob 
    implements Job 
{
  ... 

  public void execute(JobExecutionContext context) 
      throws JobExecutionException 
  { 
    ...
    Executor executor = ... // get a Java Executor 
    executor.execute( new WorkerThreadRunnable( Thread.currentThread(), YourRunnableInstance ) ); 
    ...
  }

  ... 
}

If your Quartz job implementation class uses the Java ExecutorService API and worker threads that produce Future results:

public class MyJob 
    implements Job 
{ 
  ... 

  public void execute(JobExecutionContext context) 
      throws JobExecutionException 
  { 
    ... 
    ExecutorService executorService = ... // get a Java ExecutorService
    Future result = executor.submit( new WorkerThreadCallable( Thread.currentThread(), YourCallableInstance ) ); 
    ...
  } 

  ... 
}

As shown in the above examples, you need to wrap the worker thread's body in either a WorkerThreadRunnable, or WorkerThreadCallable instance. WorkerThreadRunnable and WorkerThreadCallable classes are provided by the QuartzDesk Public API Library (quartzdesk-api.jar) and in order to use these classes in your application, you must add the QuartzDesk Public API Library to your application as a compile-time dependency.If you application uses Maven, you need to add the following to your project POM's dependencies:

<dependency>
  <groupId>com.quartzdesk</groupId>
  <artifactId>quartzdesk-api</artifactId>
  <version>x.y.z</version>
  <scope>compile</scope>
</dependency>

If you want to send QuartzDesk notification messages through GMail, you need to set up a message channel profile with the following parameters:

Sender: GMail account email address
SMTP Host: smtp.gmail.com
SMTP Port: 587
Use TLS: checked
Username: GMail account email address
Password: Password

In order to allow external applications, such as QuartzDesk, to send emails through GMail SMTP server, it is required to set up an App password in Google Account > Security > App passwords (https://myaccount.google.com).

GMail App Password

When creating a new password, enter the following values:

Select app: Mail
Select device: Other (Custom name) and enter "QuartzDesk SMTP Access" or a similar text to help you distinguish your app passwords.

Click Generate and copy the generated password value and paste it in the Password field of your GMail message channel profile configuration in the QuartzDesk GUI.

GMail Message Channel Profile

A security realm is a "database" against which QuartzDesk Web Application users are authenticated. It is also the main source of basic user profile attributes, such as the first name, surname and email address.

Security realms in QuartzDesk are pluggable and can be configured in quartzdesk-web.properties. Out-of-the-box, QuartzDesk Web Application provides the following security realm implementations:

ImplementationDescription
com.quartzdesk.core.security.realm.DefaultSecurityRealm

The default security realm implementation that authenticates users against QuartzDesk Web application database, i.e. the database pointed to by the configured QuartzDeskDS data source.

com.quartzdesk.core.security.realm.jndi.JNDISecurityRealm

A security realm that authenticates users against a configured directory server. This realm is highly configurable to support various types of directory services and user authentication approaches (e.g. bind mode, comparison mode).

For JNDI security realm configuration details, please refer here.

If necessary, users can create and register their own security realm implementations. To implement a custom security realm, please refer to this FAQ item.

QuartzDesk Web application comes with a ready-to-use and highly configurable JNDISecurityRealm implementation that allows you to authenticate users against a configured directory service.

For an explanation of what  QuartzDesk Web Application security realms are, please see here.

To use JNDISecurityRealm, please add the following configuration properties to your quartzdesk-web.properties:

PropertyValue
Description
security.realm.implementationcom.quartzdesk.core.security.realm.jndi.JNDISecurityRealm

The security realm implementation class suitable for all directory services accessed through JNDI.

security.realm.param.connectionUrlThe directory service connection URL, e.g. ldap://localhost:389.
security.realm.param.connectionUsernameThe username to use to connect to the directory service.
security.realm.param.connectionPasswordThe password to use to connect to the directory service.
security.realm.param.connectTimeoutThe connection timeout in milliseconds. If not specified, the timeout value is set to 10000 (10 seconds).
security.realm.param.readTimeoutThe read timeout in milliseconds. If not specified, the timeout value is set to 10000 (10 seconds).
security.realm.param.userBase

The distinguished name (DN) of the directory branch underneath which users are stored.

Example: ou=Departments,dc=MyCompany,dc=com

security.realm.param.userSearchQuery

The search query used to locate a user entry by the username. {0} in the query is automatically replaced with the username before the search is executed.

Example: (uid={0})

security.realm.param.userSearchSubtree

The user entry search scope. If set to true, the entire subtree rooted at userBase is searched. Otherwise, only the first level under userBase is searched.

security.realm.param.authCheckMethod

The user authentication method to use. The following two methods are supported:

BIND
The security realm attempts to bind with the DN of the user directory entry found by the configured userSearchQuery query and the user-provided password.

COMPARE
The security realm reads the user's password digest from the user directory entry found by the configured userSearchQuery query and compares this digest with the digest of the user-provided password.
security.realm.param.passwordMatcherImplementationcom.quartzdesk.core.security.realm.jndi.JNDIPasswordMatcher

The password matcher implementation class that is used to match the user-entered password with its digest stored in the directory. The password matcher is used only if the configured authCheckMethod is set to COMPARE.

security.realm.param.passwordMatcherImplementation implementation supports all of the following password digest algorithms used by popular directory services:

  • Unsalted MD5 digests. Digest format: {MD5}<digest>
  • Unsalted SHA-1 digests. Digest format: {SHA}<digest>
  • Unsalted SHA-256 digests. Digest format: {SHA256}<digest>
  • Unsalted SHA-384 digests. Digest format: {SHA384}<digest>
  • Unsalted SHA-512 digests. Digest format: {SHA512}<digest>
  • Salted MD5 digests. Digest format: {SMD5}<digest><salt>
  • Salted SHA-1 digests. Digest format: {SSHA}<digest><salt>
  • Salted SHA-256 digests. Digest format: {SSHA256}<digest><salt>
  • Salted SHA-384 digests. Digest format: {SSHA384}<digest><salt>
  • Salted SHA-512 digests. Digest format: {SSHA512}<digest><salt>
security.realm.param.authCheckCompareAttrPassword

The name of a required directory user entry attribute that contains the user's password digest. This attribute name is used only if the configured authCheckMethod is set to COMPARE.

Example: userPassword

security.realm.param.attrFirstName

The name of a required directory user entry attribute that contains the user's first name.

Example: givenName

security.realm.param.attrSurname

The name of a required directory user entry attribute that contains the user's first name.

Example: sn

security.realm.param.attrEmail

The name of a required directory user entry attribute that contains the user's email address.

Example: email

security.realm.param.attrWorkPhoneNumber

The name of an optional directory user entry attribute that contains the user's work phone number.

Example: telephoneNumber

security.realm.param.attrMobilePhoneNumber

The name of an optional directory user entry attribute that contains the user's mobile phone number.

Example: mobile

security.realm.param.attrAvatarUrl

The name of an optional directory user entry attribute that contains the URL of the user's avatar image.

Example: photoUrl

security.realm.param.phoneNumberParserImplementation

The name of an optional phone number parser implementation that parses phone number strings in user directory entries and produces com.quartzdesk.domain.model.common.PhoneNumber instances. The following phone number parser implementations are available out-of-the-box:

com.quartzdesk.core.security.realm.SimplePhoneNumberParser
A trivial implementation that interprets the phone number string as a subscriber number.

com.quartzdesk.core.security.realm.GooglePhoneNumberParser
An implementation that uses the Google libphonenumber library. Please note that this phone parser implementation is locale-sensitive and as such you need to specify the locale to be used. See the phoneNumberParserLocale parameter.

If no phone number parser implementation is specified, then the SimplePhoneNumberParser implementation is used.

security.realm.param.phoneNumberParserLocale

The name of the Java locale used by the phone number parser. If no locale is specified, then the en_US locale is assumed. For the list of all supported Java locales, please see here.

Examples: en_GB (for UK), en_CA (for Canada), nl_NL (for Netherlands), etc.

Short answer: yes.

If none of the out-of-the-box provided security realm implementation does not suit your needs, you can use your own implementation. This custom implementation must implement the com.quartzdesk.core.security.realm.ISecurityRealm interface.

When implementing a custom realm, it is often easier to extend one of the provided security realm implementations and just override the relevant method, or use the abstract security realm base class com.quartzdesk.core.security.realm.AbstractSecurityRealm.

Once the custom security realm implementation class is ready, copy this class and all of its dependencies to quartzdesk-web.war/WEB-INF/classes (*.class files) and quartzdesk-web.war/WEB-INF/lib (JAR files). This is required because the security realm implementation class must be on the QuartzDesk Web Application's classpath.

All of the afore-mentioned security APIs are available in quartzdesk-core.jar located in quartzdesk-web.war/WEB-INF/lib. If you need to compile your custom security realm implementation against these APIs, please extract quartzdesk-core.jar from the WAR file and upload it to your Maven repository. 

To make QuartzDesk Web Application use the custom security realm, you will need to add the following configuration property to your quartzdesk-web.properties:

security.realm.implementation = <class_name>

where <class_name> is the fully-qualified name of the custom security realm implementation class.

If your custom security realm implementation requires some initialization parameters, please add these parameters to quartzdesk-web.properties like so:

security.realm.param.<param_name> = <param_value>

where <param_name> is the parameter name and <param_value> is the parameter value. Once a security realm instance has been created, the parameters are passed to it by invoking its setParameters( Map<String,String> parameters ) method.

If you need any assistance, please do not hesitate and contact our Technical Support through our online chat or via email at support@quartzdesk.com.