hi,
发现没有记录Job的id到,Trans的日志表中。
Job在运行时,会将Job运行时的Id,传递给Trans,见代码
public Result execute(Result result, int nr, Repository rep, Job parentJob) throws KettleException{
....
// Create the transformation from meta-data
//
Trans trans = new Trans(transMeta);
// Pass the socket repository as early as possible...
//
trans.setSocketRepository(parentJob.getSocketRepository());
if (parentJob.getJobMeta().isBatchIdPassed())
{
trans.setPassedBatchId(parentJob.getPassedBatchId());
}
但写日志表根据没有这个栏位。
在执行Trans类的 public boolean endProcessing(String status)
方法时,写日志表。中间部分代码
if (!Const.isEmpty(transMeta.getLogTable())) {
ldb.writeLogRecord(transMeta.getLogTable(), transMeta.isBatchIdUsed(), getBatchId(),
false, transMeta.getName(), status, result.getNrLinesRead(), result
.getNrLinesWritten(), result.getNrLinesUpdated(),
result.getNrLinesInput() + result.getNrFilesRetrieved(), result
.getNrLinesOutput(), result.getNrErrors(), startDate, endDate,
logDate, depDate, currentDate, log_string);
}
org.pentaho.di.core.database.Database类的
public void writeLogRecord(String logtable, boolean use_id, long id,
boolean job, String name, String status, long read, long written,
long updated, long input, long output, long errors,
java.util.Date startdate, java.util.Date enddate,
java.util.Date logdate, java.util.Date depdate,
java.util.Date replayDate, String log_string)
throws KettleDatabaseException {
checkConnection();
boolean update = use_id && log_string != null
&& !status.equalsIgnoreCase(LOG_STATUS_START);
RowMetaInterface rowMeta;
if (job) {
rowMeta = getJobLogrecordFields(update, use_id, !Const
.isEmpty(log_string));
} else {
rowMeta = getTransLogrecordFields(update, use_id, !Const
.isEmpty(log_string));
}
if (update) {
String sql = "UPDATE " + logtable + " SET ";
for (int i = 0; i < rowMeta.size() - 1; i++) // Without ID_JOB or
// ID_BATCH
{
ValueMetaInterface valueMeta = rowMeta.getValueMeta(i);
if (i > 0) {
sql += ", ";
}
sql += databaseMeta.quoteField(valueMeta.getName()) + "=? ";
}
sql += "WHERE ";
if (job) {
sql += databaseMeta.quoteField("ID_JOB") + "=? ";
} else {
sql += databaseMeta.quoteField("ID_BATCH") + "=? ";
}
Object[] data = new Object[] { status, Long.valueOf(read),
Long.valueOf(written), Long.valueOf(updated),
Long.valueOf(input), Long.valueOf(output),
Long.valueOf(errors), startdate, enddate, logdate, depdate,
replayDate, log_string, Long.valueOf(id), };
execStatement(sql, rowMeta, data);
} else {
String sql = "INSERT INTO " + logtable + " ( ";
for (int i = 0; i < rowMeta.size(); i++) {
ValueMetaInterface valueMeta = rowMeta.getValueMeta(i);
if (i > 0)
sql += ", ";
sql += databaseMeta.quoteField(valueMeta.getName());
}
sql += ") VALUES(";
for (int i = 0; i < rowMeta.size(); i++) {
if (i > 0)
sql += ", ";
sql += "?";
}
sql += ")";
try {
pstmt = connection.prepareStatement(databaseMeta.stripCR(sql));
List<Object> data = new ArrayList<Object>();
if (job) {
if (use_id) {
data.add(Long.valueOf(id));
}
data.add(name);
} else {
if (use_id) {
data.add(Long.valueOf(id));
}
data.add(name);
}
data.add(status);
data.add(Long.valueOf(read));
data.add(Long.valueOf(written));
data.add(Long.valueOf(updated));
data.add(Long.valueOf(input));
data.add(Long.valueOf(output));
data.add(Long.valueOf(errors));
data.add(startdate);
data.add(enddate);
data.add(logdate);
data.add(depdate);
data.add(replayDate);
if (!Const.isEmpty(log_string)) {
data.add(log_string);
}
setValues(rowMeta, data.toArray(new Object[data.size()]));
pstmt.executeUpdate();
pstmt.close();
pstmt = null;
} catch (SQLException ex) {
throw new KettleDatabaseException(
"Unable to write log record to log table " + logtable,
ex);
}
}
}
分享到:
相关推荐
例如,`运行日志记录表设置.ktr`可能是一个示例,展示如何将日志信息存储到数据库表中,以便于长期存储和查询。 3. **日志格式和内容**:可以自定义日志信息的内容,包括时间戳、线程ID、日志级别、消息来源等,以...
具体来说,我们可以在每次新增转换或作业时,通过触发器自动更新相应的日志配置信息,确保所有日志都能统一地存储到指定的表中。 #### 作业日志自动配置 首先来看作业日志的自动配置实现: 1. **创建触发器**:在...
- **ID_JOB**:作业ID,关联到`R_JOBJOB`表。 - **ATTRIBUTE**:属性名称。 - **VALUE**:属性值。 7. **R_JOB_HOP**:表示两个作业步骤之间的链接部分,用于定义作业步骤间的依赖关系。 - **ID_JOB**:作业ID...
`job_log`表用于记录作业执行的历史日志。 3. **Partitioning** 表结构:Kettle支持数据分区,以优化处理性能。这部分的表可能包括`partition_schema`、`partition`等,它们分别用于定义分区方案和管理实际的分区...
总的来说,Java调用Kettle Job和Tran提供了高度灵活的数据处理能力,使得开发者能够轻松地将Kettle的工作流集成到更大的应用程序或自动化环境中。在实际项目中,还需要注意性能优化、错误处理和日志记录,以确保可靠...
8. **日志记录**:Kettle提供了丰富的日志功能,可以在Java代码中配置日志级别,以便追踪和调试执行过程。 在"Java2Kettle"这个示例中,可能包含了一个完整的Java应用示例,展示了如何从Java代码中调用Kettle的Job...
在Java环境中,我们可以利用Kettle的API来编写自定义程序,实现数据抽取、清洗、转换和加载到目标系统。 首先,了解Kettle API的基础知识至关重要。Kettle API是Kettle的核心组件之一,它提供了一系列接口和类,...
- 日志记录:为了追踪和调试,建议在Java代码中加入日志记录,以便了解执行过程和结果。 - 容错机制:设计适当的容错机制,如重试策略、异常处理逻辑,以保证任务的稳定性。 综上所述,Java操作Kettle的Job和...
然后,可以使用`TransMeta`和`JobMeta`类加载作业或转换的元数据,接着使用`Trans`和`Job`类实例化并执行它们。 3. **执行作业(Job)** - 加载作业:使用`JobMeta`类读取`.kjb`文件,解析其中的作业定义。 - ...
2. **创建并启动Job**:通过`JobMeta`和`Job`对象来解析Job的XML元数据,并实例化Job。然后,调用`Job.execute()`方法启动Job执行。 3. **监听Job状态**:可以注册`JobListener`来监听Job的开始、结束、错误等事件...
例如,通过预加载数据到内存、合理分配系统资源,以及利用多线程执行,可以提高数据处理速度。 9. **测试与调试** 对于`TestKettle.java`这样的测试代码,应当包含验证Kettle执行结果的逻辑,确保集成正确无误。...
这个API包含了一系列的类和接口,如`Trans`和`Job`,用于运行和管理转换和作业。 2. **添加依赖**:要在Java项目中调用Kettle,首先需要将Kettle的JAR文件作为项目的依赖。这些JAR文件通常位于Kettle安装目录的`lib...
- **src-core**:包含Kettle的核心组件,如数值类型、异常处理、XML处理、日志记录、组件加载、行数据处理和界面接口等。 - **src**:包含调度逻辑和执行代码,重点关注job和transformation的实现,以及命令行执行...
2. **R_TRANS_HOP**:记录了数据转换过程中的步骤跳转信息,即从一个步骤到另一个步骤的连接。 - ID_TRANS_HOP:跳转标识符。 - ID_TRANSFORMATION:所属数据转换的标识。 - ID_STEP_FROM:跳转的起点步骤标识。 ...
- Kettle支持自定义日志记录和错误处理,方便在Java应用程序中集成。 7. **其他API组件**: - `NotePadMeta` 用于处理注释信息。 - `StepLoader` 用于加载和创建步骤对象。 - `DataOutputStream` 和 `...
4. 执行转换和作业:有了配置好的转换和作业,可以通过`Trans`和`Job`对象进行执行。`Trans.execute()`方法用于启动转换,`Job.run()`方法执行作业。这些方法会启动Kettle引擎并执行实际的数据处理。 三、Kettle ...
最后,为了更好地管理和监控Java调用Kettle的过程,可以考虑使用Kettle的API来实现日志记录、错误处理和资源管理。确保在完成后正确关闭任何打开的资源,例如`Trans`和`Job`对象。 总结来说,Java调用Kettle是一项...
Kettle提供了丰富的API,使得开发者能够方便地在Java代码中执行转换(Transformation)和作业(Job),从而实现数据提取、清洗、转换和加载等一系列复杂的数据操作。 首先,理解Java调用Kettle的核心在于引入必要的...
在实际应用中,你可能还需要处理日志记录、错误处理、资源管理等问题。Kettle API提供了丰富的接口和类,可以满足这些需求。记得在完成操作后正确关闭所有资源,如文件输入流和Kettle对象。 总结,通过Java调用...