隔叶黄莺 The Blog of Unmi

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

BlogJava 首页 新随笔 联系 聚合 管理
  295 Posts :: 108 Stories :: 931 Comments :: 0 Trackbacks

08 2008 档案

     摘要: 前面写过一个因为 Oracle 驱动版太低引起的一在题:Oracle 驱动版本引起的显示字段奇怪编码问题。今天又遇着一个。

本地写好的一段连接数据库的程序,一放到正式服务器上又不能正常工作了,原来的代码中没有打印出异常栈,都看不出什么问题来,后来加上异常栈输出,得到如下信息:

Fail to convert to internal representation
java.sql.SQLException: Fail to convert to internal representation
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:114)
  阅读全文
posted @ 2008-08-28 19:05 隔叶黄莺 阅读(322) | 评论 (2)  编辑

     摘要: 由本人翻译并制作的《Quartz Job Scheduling Framework 中文版》CHM 文件更新为 V0.9.0 版,上一版本是 V0.8.2。

更新的特性有以下三点:

1. 在原来版本的基础上加上了全文检索功能,方便于快速查找某个参考配置和定位到所关心的内容

2. 去除了多余的索引标签,因为它和目录标签的内容就是雷同的

3. 加上了书签页,方便阅读时记录下所关注的主题

关键是克服了原来字符集方面的问题才得已把搜索功能加上,不然在搜索标签页中显示的主题是乱码。

V0.9.0版的压缩包大小为 1.11 MB,CHM 文件大小为 1.12 MB,仍是通过原来的链接下载  阅读全文
posted @ 2008-08-26 01:59 隔叶黄莺 阅读(1703) | 评论 (9)  编辑

     摘要: 用过 XML 的人都知道可用 DTD(Document Type Definition) 来验证语法,不过微软主导了新一代验证语法的 XML Schema,并且风头正劲,大有一统江湖之势。看看我们身边的几个变化就明白了。

web.xml 从 web-app_2_3.dtd 到 web-app_2_4.xsd
spring 配置文件从 spring-beans.dtd 到 spring-beans-2.0.dtd 到 spring-beans-2.0.xsd,直至灵活的自定义 Schema
quartz_jobs.xml 配置文件从 job_scheduling_data_1_5.dtd 到 job_scheduling_data_1_5.xsd

XML Schema 简介

XML Schema 是一个比 DTD 具有更细致描述语法功能的验证技术,并且它本身也是一个 XML 文件,不像 DTD 用是是独有的语法。

既然 XML Schema 和 DTD 都是用来验证 XML 的,并能大抢  阅读全文
posted @ 2008-08-25 17:20 隔叶黄莺 阅读(1154) | 评论 (1)  编辑

     摘要: 写在最前面的

再次翻看一下我的博客,最早的那篇《Quartz Job Scheduling Framwork》翻译是在 2007-10-17 02:17 ,距离今日那是一个造人的时间,足见这个翻译过程有多难产。一方面是源于语言水平,再者其间也发生了许多事情。

现把本人博客上零零散散,顺序错乱的各篇译章汇集成册,做成了一个 《Quartz Job Scheduling Framework 中文版.chm 》文件与各位分享,以方便大家的阅读。同时感谢大家一路来的支持,也希望大家能提出宝贵意见,或有问题拿出来共同探讨。另外,每篇译章都有到达我的博客上所对应页面的链接,所以若有疑问可点击页面上方或下方的的“我要评论” 按钮进入到博客对应页面来对本篇进行评论,或阅读他人的相关评论。  阅读全文
posted @ 2008-08-24 22:26 隔叶黄莺 阅读(3305) | 评论 (54)  编辑

     摘要: 对于 XML 文件中不带命名空间(NameSpace) 的节点,如

< blog_Content>

用 JDOM 的 XPath 来搜索这个节点时可用下面之中任一代码:

① List elements = XPath.selectNodes(document,"//blog_Content");

② XPath xpath = XPath.newInstance("//blog_Content");
List elements = xpath.selectNodes(document);

但是如果是查找带命名空间的节点,如

< blogns:blog_Content xmlns:blogns="x-schema:#Schema2">
< blogns:Title>Quartz Job Scheduling Framework[翻译]第一章. 企业应用中的作业调度 阅读全文
posted @ 2008-08-22 14:14 隔叶黄莺 阅读(1152) | 评论 (1)  编辑

     摘要: 四. 创建一个工作流 Job

最后,我们需要介绍启动工作流的 Quartz Job 。当 Scheduler 调用了它,Quartz Job 就查找工作流的名字,并启动、运行相应的工作流。如果没有在 JobDataMap 中配置工作流的名字,Job 就会直接退出。

代码 14.13 显示了 WorkflowJob.

代码 14.13. Quartz WorkflowJob 设计为调用一个 OSWorkflowJob  阅读全文
posted @ 2008-08-19 15:35 隔叶黄莺 阅读(1062) | 评论 (3)  编辑

     摘要: 四. Quartz 与 OSWorkflow 的集成

OSWorkflow 与 Quartz 集成的第一步是要改变关于 Job 的思维方式。当把 OSWorkflow 引入到你的 Quartz 应用时你需要以完全不同的方式来思考。那也不是说你当前的想法就是糟糕的或不正确的,只是与 Quartz 一同用工作流强迫你生发一些关于是什么组成 Job 的新的思维。你过去概念中的 Job 现成变成了一个 OSWorkflow 函数。你可以认为是你原有 Job 实质上存在的逻辑作为工作流中的步骤。你仍然需要使用 Quartz 的 Job,但是,当与 Quartz 框架集成工作流时,一个 Quartz Job 将用来初始化工作流。在工作流运行时,这个 Job 将会等待它直至结束。

在本章前面部分,当我们谈到串联 Job 时,每个 Job 代表了一个独立的任务。Jox X 执行后并完成一个任务,接着通知 Job Y 去执行一个有点关联却是独立的任务。在这两个任务间必须有一些依赖关系,否则你不能把它们链接在一起。  阅读全文
posted @ 2008-08-18 21:22 隔叶黄莺 阅读(1124) | 评论 (0)  编辑

     摘要: 三. OSWorkflow 快速入门

像 Quartz 一样,OSWorkflow 是一个完全由 Java 构建的开源项目,而且也是 OpenSymphony 家族项目的成员。还有许多的工作流项目,商业的或是开源的。OSworkflow 在设计上与 Quartz 有很多相似性,所以把这两个框架进行集成不用太费我们的心思。

OSWorkflow 工作在有限状态机的原则之上。一个工作流由一系列状态组成,包括一个开始状态和一个或多个结束状态。从某一状态迁移到另一状态,需要发生一次转换。实际上从某一特定状态可能会有多种转换,你也可以在同一时间从某一状态发生多种转换。选择什么转换依赖于环境,对状态的输入,和一些我们将在后面讨论的条件信息。  阅读全文
posted @ 2008-08-18 11:00 隔叶黄莺 阅读(1278) | 评论 (0)  编辑

     摘要: 第十四章. 工作流中使用 Quartz

Quartz 可以执行一个难以置信的 Job,来完成预计的任务。不幸的是,用来运行一个业务的 Job 经常比单一的 Job 或任务要稍稍复杂。每年百万计的美金花费到理解、设计和构建组织的业务流程。Quartz 框架包含一些设施用于把多个 Job 链接起来构建一个简单的业务流程模型 。本章讨论你能如何用 Quartz 连接 Job。为获得实际的工作流可操作性,你还需要一些来自于 Quartz 框架的东西。本章就来看为实现你的 Job 所构成的工作流可以如何扩展 Quartz 框架。

一. 什么是工作流

Web 上聚集了个人或团体关于工作流的定义和实例。有人定义工作流为“自动化的后台管理系统”。另一些人使用“业务流程建模” 一语,并收取许多的咨询费用向你解释这个概念。对于本章的要义,我们使用如下的工作流定义:

工作流是出现在某一特定时序中的一系列互为依懒的任务。

在我们进一步深入到本章内容后,该定义将变得越发明淅。  阅读全文
posted @ 2008-08-17 00:24 隔叶黄莺 阅读(1442) | 评论 (3)  编辑

     摘要: 四. 运行 Quartz 集群节点

在启动集群中的 Quartz 应用真的没什么差别。每个实例(或节点) 必须单独启动。启动时,实例连接到数据库,获取 Scheduler 信息,并开始部署 Job。

因为 Quartz 使用了一个随机的负载均衡算法,你将会看到 Job 以随机的行方式由不同的实例执行。没有固定的模式或预告定义的节点来执行特定的 Job。

下一节会讨论一些在处理集群环境中的 Quartz 较常见的问题和任务。

五. Quartz 集群 Cookbook

本节旨在为开发者便于解决 Quartz 集群的具体问题而提供了资源。

·指派 Job 给集群中特定的实例

当前,还不存在一个方法来指派(钉住) 一个 Job 到集群中特定的节点。假如你需要这种行为,你可以创建一个非集群的 Quartz 应用与集群中的节点并行运行,并且要使用独立的一套数据库表或单独的 JobInitializationPlugin 用到的 X  阅读全文
posted @ 2008-08-12 01:29 隔叶黄莺 阅读(1283) | 评论 (4)  编辑

     摘要: 1.6 流程控制

1.6.1 什么是真

·除了””和”0”,所有字符串为真
·除了 0,所有数字为真
·所有引用为真
·所有未定义的值为假.

1.6.2 If 和 unless 语句

if (case1) {...} elsif (case2) {...} elsif (case3) {...} else {...}

为节约版面,全写在一行了。if/elsif/else 后的大括号是必须的,这和 C/Java中不一样,elsif 同 pl/sql 的写法。

象在英语中说“如果这不是真的,就做某事”,你可以使用 unless 语句:

unless ($destination eq $home) { print "I'm not going home.\en"; }   阅读全文
posted @ 2008-08-11 16:25 隔叶黄莺 阅读(158) | 评论 (2)  编辑

     摘要: 1.4 文件句柄

文件句柄只是你给文件,设备,网络套接字或管道起的一个名字,这样可以帮助你分清你正在和那个文件或设备通讯,同时掩藏了如缓冲等复杂性。

你可以使用 open 创建并关联一个文件。open 函数需要至少两个参数:文件句柄和你希望与文件句柄关联的文件名。Perl 也给你一些预定义(并且预先打开)的文件句柄。STDIN 是我们程序的标准输入,

STDOUT 是标准输出。STDERR 标准错误输出。

因为你可以用 open 函数创建用于不同用途(输入,输出,管道)的文件句柄,因此你必须指定你需要哪种类型。  阅读全文
posted @ 2008-08-11 10:48 隔叶黄莺 阅读(128) | 评论 (0)  编辑

     摘要: 三. 配置 Quartz 使用集群

为 Quartz 配置集群环境的步骤比设置类似的 J2EE 集群环境容易的多:

1. 配置每个节点的 quartz.properties 文件。

2. 配置 JDBC JobStore。

3. 使用 Scheduler 信息(Job 和 Trigger) 装载数据库。

4. 启动每个 Quartz 节点。

·配置节点的 quartz.properties 文件

就像是运行 Quartz 在非集群环境中那样,每个 Quartz 应用需要一个 quartz.properties 文件。在第三章,“Hello, Quartz” 中提到过,假如你不指定它,会使用默认的 quartz.properties 文件(存在于 quartz.jar 文件中)。最后是指定这个文件,因为你终究是需求修改一个或多个的设置项。  阅读全文
posted @ 2008-08-08 16:51 隔叶黄莺 阅读(1206) | 评论 (0)  编辑

     摘要: 1.2.4 复杂数据结构

$wife{"Jacob"} = ("Leah", "Rachel", "Bilhah", "Zilpah"); # 错误

$wife{"Jacob"} = ["Leah", "Rachel", "Bilhah", "Zilpah"]; # 正确

用[] 中括弧来将一个列表转换成一个标量。

$wife[0] = ["Leah", "Rachel", "Bilhah", "Zilpah"]; #正确

$wife = ["Leah", "Rachel", "Bilhah", "Zilpah"]; #错误

左边要写成 $wife{"Jacob"} 或 $wife[0] 表明 wife 是一个数组或散列,只有对数组或散列才能这样赋值。

访问方式用 $wife{"Jacob"}[0] 或 $wife[0][0]

我们希望将散列结构也当成一个标量,我们可以使用花括弧来完成,如:  阅读全文
posted @ 2008-08-07 16:04 隔叶黄莺 阅读(135) | 评论 (0)  编辑

     摘要: 1. 使用帮助手册

如果你是在 Linux/Unix 下,那么 Man 给我们准备好了各色点心,用 man 加上下面中的类别名就能查阅到对应的帮助,如 man perldata

或分 FAQ 来分类手册,如 man perlfaq2,还能在手册中搜索内容,如

man perlfunc split --- 搜索 split 函数的使用
man perlvar ARGV --- 内置变量 ARGV 的帮助信息

2. 变量的语法

象英语一样,Perl 变量类型之间区别主要是单数和复数,字符串和数字是单个数据,而一组数字和字符串是复数。我们叫把单数变量称为标量,而把复数变量称为数组。

通常我们用 $ 开头的名称表示标量,与此对应的数组变量使用 @ 开头。。(可以将 $ 理解成代表 "s" 或 "scalar"(标量),而 @ 表示 "a" 或 "array" (数组)来帮助你记忆。)

Perl 还有象“散列”,“句柄  阅读全文
posted @ 2008-08-06 21:45 隔叶黄莺 阅读(170) | 评论 (0)  编辑

     摘要: 二. Quartz 中集群是如何工作的

一个 Quartz 集群中的每个节点是一个独立的 Quartz 应用,它又管理着其他的节点。意思是你必须对每个节点分别启动或停止。不像许多应用服务器的集群,独立的 Quartz 节点并不与另一其的节点或是管理节点通信。(将来的 Quartz 版本将会设计成让节点能与其他节点直接通信,而不是借助于数据库。) 取而代之的是,Quartz 应用是通过数据库表来感知到另一应用的。

Quartz 集群仅能使用 JDBC JobStore 工作

因为集群中节点依赖于数据库来传播 Scheduler 实例的状态,你只能在使用 JDBC JobStore 时应用 Quartz 集群。这意味着你必须使用 JobStoreTX 或是 JobStoreCMT 作为 Job 存储;你不能在集群中使用 RAMJobStore 的。在将来的释放版中非常可能移除这个需求,节点也将能直接与另一节点直接通过网络协议,可能使用 JGroup 进行通信。


图 11.1 显  阅读全文
posted @ 2008-08-06 16:05 隔叶黄莺 阅读(1003) | 评论 (0)  编辑

     摘要: 客户端连接到另一台机器上的 DB2 数据库,用 DB2 的控制中心连接没问题,但是用 Quest Central for DB2 来连接,输入用户名和密码,确定,出现提示窗口:

[IBM][CLI Driver] SQL0332N 没有从源代码页 "86" 至目标代码页 "819" 的转换。原因代码是 "DB2INST1"。 SQLSTATE=01539

无法登录,原因是本机的代码页(codepage) 与数据库的代码页不相符且无符完成又向转换。

解决办法是在命令行下执行 db2set DB2CODEPAGE=819

dos> db2set DB2CODEPAGE=819

然后,再次用 Quest Central for DB2 来连接数据库就 OK 啦  阅读全文
posted @ 2008-08-06 11:49 隔叶黄莺 阅读(205) | 评论 (0)  编辑

     摘要: 第十一章. Quartz 集群

不可避免的,我们还是要说到集群。虽然单个 Quartz 实例能给予你很好的 Job 调度能力,但它不能令典型的企业需求,如可伸缩性、高可靠性满足。假如你需要故障转移的能力并能运行日益增多的 Job,Quartz 集群势必成为你方言的一部分了。本章就告诉你如何使用 Quartz 的集群能力来更好的支持你的业务需求,并且即使是其中一台机器在最糟的时间崩溃了也能确保所有的 Job 得到执行。

一. 集群对 Quartz 来说意味着什么?

集群扮演着运行一个组件或应用的多个实例,它们以透明的方式提供服务。集群是企业范畴的事物,而不局限于 Java 的世界里。当部署 J2EE 应用时,例如,供应商为应用服务器提供了集群的能力,以便于像 EJB、JNDI 和 Web 组件能获得高可用性。然当客户端请求这些服务时候,它们就能更可靠的提供服务。  阅读全文
posted @ 2008-08-06 10:12 隔叶黄莺 阅读(969) | 评论 (0)  编辑