使用 JMX 和 RMI 远程管理 Quartz

openkk 12年前

方法1: JMX

很多人询问如何通过 JMX 来管理 Quertz,很奇怪的是 Quartz 的文档完全没有提及这方面的问题,你可以在 quartz.properties 中通过以下配置来启用 JMX 的支持:

org.quartz.scheduler.jmx.export = true

然后你就可以使用标准的 JMX 客户端,例如 $JAVA_HOME/bin/jconsole 来连接到 Quartz 并进行远程管理。

方法2: RMI

另外一个远程管理 Quartz 的方法就是启用 RMI。如果你用的是 RMI 的方式,就会自动一个 Quartz 实例来作为 RMI 服务器,然后你可启动第二个 Quartz 实例来作为 RMI 客户端,二者通过 TCP 端口进行通讯。

服务器端调度实例配置方法(quartz.properties):

org.quartz.scheduler.rmi.export = true  org.quartz.scheduler.rmi.createRegistry = true  org.quartz.scheduler.rmi.registryHost = localhost  org.quartz.scheduler.rmi.registryPort = 1099  org.quartz.scheduler.rmi.serverPort = 1100

客户端调度器配置(quartz.properties):

org.quartz.scheduler.rmi.proxy = true  org.quartz.scheduler.rmi.registryHost = localhost  org.quartz.scheduler.rmi.registryPort = 1099

关于 Quartz 的 RMI 特性的文档描述请看 这里. Quartz 不提供客户端 API,服务器端和客户端都是使用 org.quartz.Scheduler,只是配置不同而已。通过不同的配置来执行不同的行为。对服务器端来说,调度器用来执行所有的作业;而客户端只是一个简单的代理,不运行任何作业,在关闭客户端的时候必须小心,因为它允许你也同时关闭服务器端。

这些配置都在我的示例程序 MySchedule 中有着重说明,如果你运行的是 Web 应用,你可以看到 这个演示,你将看到我们提供了很多 quartz 的示例配置用来做远程管理。

如果使用 RMI 方法,你可以用 MySchedule Web UI 做为一个代理来管理 Quartz,你可以查看作业,可停止服务器的运行。

根据我的经验,使用 RMI 方法的弊端就是创建一个新的单点故障,如果你的服务器端口宕掉了,就无法恢复。

原文