隔叶黄莺 The Blog of Unmi

〖隔叶黄莺三四声,挂壁飞瀑千万尘。若是人间无净土,此处为何妙语真! 隔叶黄莺四字,本非取自此句,而有寄寓他意,因见妙语,亦与予心合!〗

BlogJava 首页 新随笔 联系 聚合 管理
  269 Posts :: 87 Stories :: 764 Comments :: 0 Trackbacks

07 2008 档案

     摘要: 而现在重现思考起用一种动态语言来写跨平台的界面程序,JAVA 写的 SWT 程序仍然是有个编译过程,想从中得到的好处就是直接改了源代码马上就能看到效果,主要用途是写一些个人用的小的实用工具程序。

到各处找了找,较常见的有以下几些个组合:

1. Perl + Qt PerlQt 在 Windows 下似乎不好配置,好像要 cygwin 来帮忙
2. Perl + wxWidgets wxPerl 用 ppm install Wx-0.26.ppd 安装 wx 模块居然没成功
3. Perl + TK PerlTk TK 的界面其实不好看
4. Groovy + SWT Groovy 能和 SWT 搭配,BeanShell 加 SWT 应该没问题
6. TCL + TK TCL/TK TCL 和 TK 是原配
7. Python   阅读全文
posted @ 2008-07-31 22:02 隔叶黄莺 阅读(1231) | 评论 (11)  编辑

     摘要: 前面写过一篇:Oracle 驱动版本引起的显示字段奇怪编码问题。讲到因 Oracle 8.0.5 不支持子查询排序,为改善原来那种每次翻页时都捋出所有数据成对象到 List 中,然后从中拣取页面实际要显示的记录的性能问题时,采用了 rs.absolute() 直接跳到起始记录游标的方法,但又引入了乱码问题,例如:"无效",变成了 "0xE697A0E69588"。

虽说,换个驱动,如 8.1.7.0.0 以上版本的驱动就能解决乱码的问题,但这一换又怕会影响到其他的应用。有朋友评论说,其实循环 next() 到某处比 absolute() 定位要好,乍一看,有些牵强,不过试试就知道了。下面就来做样一个测试,测试代码如下:

测试数据(未列出每一次的测试数据,只求了不同条件下的平均值,startCuror 为定位的游标位置,stepByStep 表示是用 n 次 next() 移动游标,还是用 absolute(n) 直接定位,true 为前者):  阅读全文
posted @ 2008-07-24 22:16 隔叶黄莺 阅读(840) | 评论 (0)  编辑

     摘要: 五. Quartz 工具插件

Quartz 框架包括几个你能用于你的应用中的几个插件。本节简单描述它们和它们的用途。

·JobInitializationPlugin

我们已经多次谈到过这个插件。它从一个 XML 文件中加载 Job 和 Trigger 信息(默认文件名是 quartz_jobs.xml) 。你可以通过在 quartz.properties 文件中为这个插件设定 filename 参数来配置文件名。假如你不需要数据库来存储你的 Job 或者是需要能快速测试特定 Job 的话,这个插件非常有帮助。

·JobInitializationPluginMulitple

显然,由其相似的名字,JobInitializationPluginMultiple 类似于 JobInitializationPlugin。不同点在于它支持从多个 XML 文件加载而非只是一个。它也类似于代码 8.2 中的 JobLoaderPlugin,只是代码 8.2 的插件查  阅读全文
posted @ 2008-07-22 21:45 隔叶黄莺 阅读(987) | 评论 (2)  编辑

posted @ 2008-07-22 13:19 隔叶黄莺 阅读(205) | 评论 (5)  编辑

     摘要: 四. 使用多个插件

你喜欢多少个,就可以在 quartz.properties 文件中注册多少个插件。然而,加载和初始化的顺序却不能保证,因为 Quartz 加载先把所有的属性到一个 Map 中,然后按照从 Map 中取出的顺序遍历插件。

为规避这一限制,你可以创建一个 Quartz 插件作为父插件,然后以给定的顺序加载其他多个插件。代码 8.6 显示了 ParentPlugin 长什么样子。  阅读全文
posted @ 2008-07-21 18:11 隔叶黄莺 阅读(1000) | 评论 (0)  编辑

     摘要: 三. 注册你的插件

当 SchedulerFactory 首次初始化的时候,会从 quartz.properties 文件中搜寻你所配置的 Quartz 插件。它会通过 java.lang.Class 的 newInstance() 方法创建插件的实例。你的插件必须有一个无参的构造方法,像代码中 JobLoaderPlugin 所做的那样。

要在 quartz.properties 文件中注册你的插件的话,需在 quartz.properties 文件中使用如下的格式创建一个属性:

org.quartz.plugin..class=

Quartz 找寻属性文件中所有含这个关键词的项:

org.quartz.plugin..class  阅读全文
posted @ 2008-07-20 20:21 隔叶黄莺 阅读(828) | 评论 (0)  编辑

     摘要: 二. 创建 Quartz 插件

创建一个新的插件很简单。你所有要做的就是创建一个 Java 类(或重用一个现有的类),让它实现 org.quartz.spi.SchedulerPlugin 接口。Scheduler 将会在启动期间创建这个插件的实例。这个插必须有一个无参的构造方法,很显然它不能是抽象的。

·JobInitializationPlugin

Quartz 框架有一个用来从 XML 文件中加载 Job 和 Trigger 信息的插件。这个插件就是 org.quartz.plugins.xml.JobInitializationPlugin,并且它在前面第三章 "Hello, Quartz" 中简略的讨论过。当你使用这个插件的时候,Quartz 框架就会搜寻一个叫做 quartz_jobs.xml 的文件并试图从中加载 Job 和 Trigger 信息。   阅读全文
posted @ 2008-07-20 10:29 隔叶黄莺 阅读(865) | 评论 (0)  编辑

     摘要: 第八章. 使用 Quartz 插件

Quartz 框架提供了几种用于扩展平台能力的方式。通过使用各种 "钩子" (通常指的就是扩展点),Quartz 变得很容易被扩展和定制化来适应你的需要。其中一个最简单的扩展框架的方法就是使用 Quartz 插件。本章就来看看如何使用插件机制让 Quartz 进入到之前 Quartz 用户没去过的领域。

一. 什么是插件?

假如你使用过其他的开源框架,例如 Apache Struts,你应该已经熟悉了插件的概念和它们的用法。非常简单,一个 Quartz 插件就是一个实现了 org.quartz.spi.SchedulerPlugin 接口的 Java 类,并且被作为插件注册给了 Scheduler。这个插件接口包含了三个方法,显示在代码 8.1 中。  阅读全文
posted @ 2008-07-19 12:46 隔叶黄莺 阅读(845) | 评论 (0)  编辑

     摘要: 开门见山把产生问题的原因的解决办法列出来。

我们一般获取 Statement 都是通过 conn.createStatement() 方法,很少传递参数给它的,所以其内置属性都取默认值的,取记录只用 while(rs.next()) 逐个取即可。然而有一个需求(Oracle 8i 之前的版本不支持子查询排序,所以无法用 rownum 取分页记录) 是通过如下代码来得到 Statement:

Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

由它获得的结果集可以 rs.absolute(n) 直接跳到第 n 行记录来获得值,但就这个用法出问题了,取出来的中文出现乱码了,如 "无效",变成了 "0xE697A0E69588"

原因是我用的 Oracle 驱动版本太低了,是 8.1.6 的驱动版本,只要换成 8.1.7 或更高的驱动版本就可以正常取得中文字段值了。  阅读全文
posted @ 2008-07-17 20:03 隔叶黄莺 阅读(800) | 评论 (5)  编辑

     摘要: 八. 监听器中的线程使用

你看到了监听器接口中的方法后,你或许想知道是线程在调用监听器方法中饰演着什么样的角色。基实监听器方法是存在一个时序的,正如你看到方法名能想像到的那样。在一个 Job 执行的生命周期中,调用监听器方法以的顺序通常是固定的。图 7.2 描绘了监听方法的调用顺序和所涉及到的工作者线程。

调用监听器方法的时序是固定的。如图 7.2 所示,在 Job 的执行前后,调用 Job 的 execute() 方法相同的线程被用于调用 JobListener 和 TriggerListener 的方法。假如你使用任何类类型的第三方线程管理工具或者打算实现你自己的线程池管理,知道这一点是很重要的。假如你在监听方法中实现了一个长运行逻辑时,这也会带来对性能上的负面影响。因为调用监听方法的线程和执行 Job 是同一个工作者线程,你不应该把监听方法实现的太复杂并要花费较长时间才能完成。保持它们的执行时间尽可能短。  阅读全文
posted @ 2008-07-12 18:39 隔叶黄莺 阅读(1639) | 评论 (0)  编辑

     摘要: 七. 在 quartz_jobs.xml 文件中实现监听器

本章的所有例子告诉了你如何以编程的方式设置监听器。假如我们一个关于在 quartz_jobs.xml 文件中以声明式配置监听器的例子都不提供本章就不能算是完结。

自 Quartz 1.5 开始,你能够在 Job 定义文件中指定监听器,当然就是知名的 quartz_jobs.xml 文件了。代码 7.14 显示了一个使用全局监听器的例子。

代码 7.14. Quartz 监听器能在 quartz_jobs.xml 文件中实现

< ?xml version='1.0' encoding='utf-8'?>

< quartz>
< job-listener
class-name="org.cavaness.quartzbook.chapter7.SimpleJobListener"
name="SimpleJobListener">
< /job-listener>  阅读全文
posted @ 2008-07-10 20:38 隔叶黄莺 阅读(869) | 评论 (0)  编辑

     摘要: 六. 使用 FileScanListener

Quartz 框架还包含一个我们未曾提及的监听器。这个监听器不像别的,因为它是为特定目的而设计的:同框架所带的一个工具 Job 一起用的。

这个监听器就是 org.quartz.jobs.FileScanListener 接口,它显式的设计为 FileScanJob 所用的,这一 Job 也在 org.quartz.jobs 包中。FileScanJob 检查某一指定文件的 lastModifiedDate。当某人改变了这个文件,这个 Job 就调用 FileScanListener 的 fileUpdated() 方法。

就像使用其他类型的 Quartz 监听器一样,你必须创建一个实现了 FileScanListener 接口的具体类。只有一个方法需要实现:

public void fileUpdated(String fileName);  阅读全文
posted @ 2008-07-10 12:28 隔叶黄莺 阅读(897) | 评论 (0)  编辑

     摘要: 五. 监听 Scheduler 事件

org.quartz.SchedulerListener 接口包含了一系列的回调方法,它们会在 Scheduler 的生命周期中有关键事件发生时被调用。代码 7.9 列出了包括在 SchedulerListener 接口的方法。

代码 7.9. org.quartz.SchedulerListener 接口中的方法

public interface SchedulerListener {
public void jobScheduled(Trigger trigger);
public void jobUnscheduled(String triggerName, String triggerGroup);
public void triggerFinalized(Trigger trigger);
public void triggersPaused(String triggerName, String trigge  阅读全文
posted @ 2008-07-08 21:53 隔叶黄莺 阅读(924) | 评论 (0)  编辑

     摘要: Tomcat 启动时的系统日志默认是由 JdkLog14Logger 打印出来的,如

2008-7-7 11:19:34 org.apache.catalina.core.StandardEngine start
信息: Starting Servlet Engine: Apache Tomcat/5.0.28
2008-7-7 11:19:34 org.apache.catalina.core.StandardHost start
信息: XML validation disabled
2008-7-7 11:19:34 org.apache.catalina.core.StandardHost getDeployer
信息: Create Host deployer for direct deployment ( non-jmx )

那我们能不能用 Log4J 来输出这种系统日志呢?我们知道像 Apache 那样的大部分开源框架、组件都是用通用日志组件 (commons-logging) 来输出日志的,因此  阅读全文
posted @ 2008-07-07 18:27 隔叶黄莺 阅读(1323) | 评论 (0)  编辑

     摘要: 四. 监听 Trigger 事件

正如 JobListener, org.quartz.TriggerListener 接口也包含一系列给 Scheduler 调用的方法。然而,与 JobListener 有所不同的是, TriggerListener 接口还有关于 Trigger 实例生命周期的方法。代码 7.5 列出了 TriggerListener 接口的方法。

代码 7.5. org.quartz.TriggerListener 接口的方法

public interface TriggerListener {
public String getName();

public void triggerFired(Trigger trigger,
JobExecutionContext context);

public boolean vetoJobExecution(Trigger trigger,
  阅读全文
posted @ 2008-07-06 11:17 隔叶黄莺 阅读(1435) | 评论 (0)  编辑