Quartz Job Scheduling Framework[翻译]第六章. Job 存储和持久化 (第六部分)

十二. 为 JobStoreCMT 配置数据源

JobStoreTX 一样,我们需要配置一个 Datasource 才能使用 JobStoreCMT。然而,JobStoreCMT 需要两个 Datasource 而不是像 JobStoreTX 只要一个。其中一个 Datasource 和我们为 JobStoreTX 设置的类同:作为不受管理的数据源。同时呢,我们还需配置第二个数据源,是作为受管理的数据源,它由应用服务器来进行管理。

为什么 JobStoreCMT 需要两个 Datasource 呢?JobStoreCMT 的原始作者,Jeffrey Wescott,设计 JobStoreCMT 使用一个标准的 JDBC 连接来做它“自己的工作”,同时,代表客户端(如部署 Job) 的工作在执行时是使用一个在容器控制之下有自身事物的 JDBC 连接。即使 Quartz 处在一个大事物中,这种设计也允许用户与 Quartz 交互,而无需 JobStoreCMT 非得使用应用服务器的事物管理器(例如,经由 UserTransaction) 在做自己内部工作时(如处理已错过执行的 Trigger) 来创建和终止事物。如果是 JobStoreCMT 使用 UserTransation 只给它配置一个数据源,从配置方面来看确实方便。然而,在相比于别的特性需求和改进的必要性时,作此变化并不会成为团队中首要的问题,因而 JobStoreCMT 还是继续要两个数据源。

·配置不受管理的数据源

我们在设置不受管理的数据源的多数操作与为 JobStoreTX 所做是相同的,只是我们还要加上一行来指定这是 nonManagedTXDataSource:

# Add the property for the nonManagedTXDataSource
org.quartz.jobStore.nonManagedTXDataSource = myDS

org.quartz.dataSource.myDS.driver = net.sourceforge.jtds.jdbc.Driver
org.quartz.dataSource.myDS.URL = jdbc:jtds:sqlserver://localhost:1433/quartz
org.quartz.dataSource.myDS.user = admin
org.quartz.dataSource.myDS.password = myPassword
org.quartz.dataSource.myDS.maxConnections = 10

这是配置不受管理的数据源,并让 JobStore 知道这个 nonManagedTXDataSource 叫做 "myDS"。

·配置受管理的 Datasource

第二个数据源需配置为一个受管理的 Datasource。这意味着 Quartz 在执行 Scheduler 操作时使用一个容器已创建好的 Datasorce 与数据库交互。当 Quartz 从 Datasource 上取得了连接后,在 Quartz 部署 Job 和 Trigger 时应有一个 JTA 事物。例如,代码要求 Quartz 在 SessionBean 的一个方法上的事物描述符设置为 REQUIRED。另一个应用是客户端程序要通过使用 javax.transaction.UserTransaction 直接启动一个事物。

和不受管理的 Datasoure 一样,也是要在 quartz.properties 文件中配置容器管理的 Datasource。下面的例子描述了如何设置受管理的 Datasource:

org.quartz.dataSource.NAME.jndiURL=jdbc/quartzDS

org.quartz.dataSource.NAME.java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory

org.quartz.dataSource.NAME.java.naming.provider.url=t3://localhost:7001
org.quartz.dataSource.NAME.java.naming.security.principal=weblogic
org.quartz.dataSource.NAME.java.naming.security.credentials=weblogic

表 6.6 列出了受管理的 Datasource 可用的属性。

表 6.6. 在应用服务器上所用的 Datasource 的属性
属性 必须 
org.quartz.dataSource.NAME.jndiURL
描述:受你的应用服务器管理的 DataSourceJNDI URL
org.quartz.dataSource.NAME.java.naming.factory.initial
描述:可选项,你想用的 JNDI InitialContextFactory 的类名称
org.quartz.dataSource.NAME.java.naming.provider.url
描述:可选项,连接到 JNDI 上下文的 URL
org.quartz.dataSource.NAME.java.naming.security.principal
描述:可选项,连接到 JNDI 上下文的用户主体(Unmi 注:用户名)
org.quartz.dataSource.NAME.java.naming.security.credential
描述:可选项,连接到 JNDI 上下文的用户凭证(Unmi 注:密码)

使用到表 6.6 中的属性,这儿有一个在 quartz.properties 中配置受管理的 Datasource 的例子。

org.quartz.dataSource.WL.jndiURL = OraDataSource
org.quartz.dataSource.WL.jndiAlwaysLookup = DB_JNDI_ALWAYS_LOOKUP
org.quartz.dataSource.WL.java.naming.factory.initial = weblogic.jndi.WLInitialContextFactory
org.quartz.dataSource.WL.java.naming.provider.url = t3://localhost:7001
org.quartz.dataSource.WL.java.naming.security.principal = weblogic
org.quartz.dataSource.WL.java.naming.security.credentials = weblogic

------------------------------------------------
[Unmi 后记] 又半月有途未动笔墨了,不过仍然保持着只要有机会上网就一定到 BlogJava 来阅读最新本章的习惯。部门人员锐减,事情也就杂乱不堪起来,对于开发技术的选择上客观上完全能由我自行决断,没有人与我争议了,甚是悲凉。

起初对 Quartz 这个系列的翻译只为一时之兴,一路过来翻译工作其实蛮费时间的。一篇英文阅读完之后,还需花费几近于 20 倍的时间才能用中文记录下来。因为阅读总是眼观六路,一知半解的,完全转换成中文就要字句斟酌了。

翻译进行到这个阶段,我当然还会继续坚持,从其中获得的好处也是不言而喻的。主要表现在两方面:

1. 对技术把握的更精细。阅读是放眼而瞟,只求个大概;翻译则不同,本身未能理解个相当,何以能用中文向他人解译的清楚呢?蕴责任于其中。对于多数例子,并非照搬了事,都有再次测试感受过的。译章置于网上之后,亦有许多朋友就 Quartz 使用时的疑问,本人也会带着某种责任心,尽我能力作解答,也非常有助于自身对该项技术的掌握。

2. 阅读与翻译的速度提升也是显而易见的。最初时的每字每句的爬梳,须频繁请求各方资源才能完成一篇,现在与那时相比,可谓顺畅多了。许多篇章纵使离开英文词典也无碍了。用数据来说吧,现在翻译一篇的速度大概是以前的四至五倍。以后的前行中需要面对更多的英文资料,通过对 Quartz 这个手册翻译扎实锤炼了自己的英文阅读能力,写作能力亦在其内。

之于以上两点能对我产生的影响,尤其是 Quartz 手册的翻译已完成大部分时,我一定还会继续完成它,也非常感谢网络上各位朋友们的支持。

本文链接 https://yanbin.blog/quartz-job-scheduling-framework-6-6/, 来自 隔叶黄莺 Yanbin Blog

[版权声明] Creative Commons License 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。

Subscribe
Notify of
guest

11 Comments
Inline Feedbacks
View all comments
zxming12345
zxming12345
16 years ago

看了后记,挺感动也挺为您高兴的,在工作中找到了快乐。现在我们部门的人员也是锐减,不过我是新人,没有你那么多体会,但当一个个日夜奋斗的兄弟远去的时候,总是有非常悲伤,其实也知道,没有不散的宴席。可能这也是成长的过程中,必须磨炼的。

biiau
16 years ago

配置受管理的 Datasource 时,给我的感觉是含糊不清的,我想知道具体怎样配置,能讲清楚一点么?

最好有一个具体的例子....

biiau
16 years ago

org.quartz.dataSource.WL.jndiURL = OraDataSource

org.quartz.dataSource.WL.jndiAlwaysLookup = DB_JNDI_ALWAYS_LOOKUP

org.quartz.dataSource.WL.java.naming.factory.initial = weblogic.jndi.WLInitialContextFactory

org.quartz.dataSource.WL.java.naming.provider.url = t3://localhost:7001

org.quartz.dataSource.WL.java.naming.security.principal = weblogic

org.quartz.dataSource.WL.java.naming.security.credentials = weblogic

WL的名称需要在哪里定义么?

org.quartz.dataSource.WL.java.naming.factory.initial 这个是什么?

隔叶黄莺
16 years ago

org.quartz.dataSource.WL.java.naming.factory.initial

是用来指定 jndi 的实现,一般不同的容器有不同的 jndi 实现,一般对象绑定时和查找对象时用的 jndi 实现要一致。

比如:

对于jboss来说:

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory

对于weblogic来说:

java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory

对于tomcat来说:

java.naming.factory.initial=org.apache.naming.java.javaURLContextFactory

而jdk本身也提供了jndi实现,相应的配置是

java.naming.factory.initial=com.sun. jndi.CosNaming.CNCtxFactory

如果你的程序是在容器环境中运行,那么只要简单的 new InitialContext() 即可,相应的 java.naming.factory.initial 已经注入到 Context 实例当中了。

隔叶黄莺
16 years ago

受管理的 Datasource 要依赖于你的容器实现。

biiau
16 years ago

@隔叶黄莺

如果我使用tomcat具体的该怎样配置呢?

能给我这样一个例子么?

隔叶黄莺
16 years ago

@biiau

你首先要理解什么是 CMT,一定要用它吗?

biiau
16 years ago

@隔叶黄莺

如果我使用tomcat具体的该怎样配置呢?

能给我这样一个例子么?

org.quartz.dataSource.WL.jndiURL = OraDataSource

其中WL是哪里进行定义的呢?

biiau
16 years ago

@隔叶黄莺

我是使用Spring的dataSorce

CMT是容器来管理事物的,我是要用Hibernate的事物来管理

biiau
16 years ago

spring与Quartz集成,运行良好就是没有JOB执行,运行如下: 2008 10 19 22:03:31 INFO [/myWdb]:646 - QuartzInitializer: Quartz Initializer Servlet loaded, initializing Scheduler... 2008 10 19 22:03:31 WARN JobInitializationPlugin:139 - The "filename" plugin property is deprecated. Please use "filenames" in the future. 2008 10 19 22:03:31 INFO SchedulerSignalerImpl:63 - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl 2008 10 19 22:03:31 INFO QuartzScheduler:215 - Quartz Scheduler v.1.6.1 created. 2008 10 19 22:03:31 INFO JobInitializationPlugin:265 - Registering Quartz Job Initialization Plug-in. 2008 10 19 22:03:31 INFO ShutdownHookPlugin:128 - Registering Quartz shutdown hook. 2008 10 19 22:03:31 INFO JobStoreTX:572 - Using thread monitor-based data access locking (synchronization). 2008 10 19 22:03:31… Read more »

隔叶黄莺
16 years ago

先排除数据库的因素看是否能启动你的 Scheduler,或插入代码来测试程序执行到哪一步了。