The following code is for reading job and trigger definitions from an xml config file called quartz-jobs.xml. The definitions are then automatically registered with the given scheduler.

Scheduler scheduler = ...;
JobSchedulingDataProcessor xmlProcessor = new JobSchedulingDataProcessor();
// the last parameter here (the boolean one)
// is for overwriting existing jobs
xmlProcessor.processFileAndScheduleJobs("quartz-jobs.xml", scheduler, true);

Here's an example xml config file:

<?xml version="1.0" encoding="UTF-8"?>
<quartz xmlns="http://www.opensymphony.com/quartz/JobSchedulingData"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        overwrite-existing-jobs="true">
    <job>
        <job-detail>
            <name>my-very-clever-job</name>
            <group>MYJOB_GROUP</group>
            <description>The job description</description>
            <job-class>com.acme.scheduler.job.CleverJob</job-class>
            <job-data-map allows-transient-data="false">
                <entry>
                    <key>burger-type</key>
                    <value>hotdog</value>
                </entry>
                <entry>
                    <key>dressing-list</key>
                    <value>ketchup,mayo</value>
                </entry>
            </job-data-map>
        </job-detail>
        <trigger>
            <cron>
                <name>my-trigger</name>
                <group>MYTRIGGER_GROUP</group>
                <job-name>my-very-clever-job</job-name>
                <job-group>MYJOB_GROUP</job-group>
                <!-- trigger every night at 4:30 am -->
                <!-- do not forget to light the kitchen's light -->
                <cron-expression>0 30 4 * * ?</cron-expression>
            </cron>
        </trigger>
    </job>
</quartz>