处理平面文件中的错误 reader

Handling errors in flat file reader

(我是 spring 批次的新手,很抱歉提出愚蠢的问题,但 google 没有给我举个例子)

我有一个批处理作业,每天午夜由 quartz 启动。该作业尝试读取一个或多个平面文件并处理它们。有时作业读取的文件不在需要的位置。所以得到 FileNotFoundException。我们想通过电子邮件通知生产支持团队所需的数据文件不可用。

我认为在 springbatch 中,以下内容是首选的方法。我是正确的还是有更好的方法。我的 notifyProdSupLister 应该在 batch:chunk 语句中吗?

<batch:step id="readDataFileStep" next="processDataFileStep">
        <batch:listeners>
              <batch:listner ref="notifyProdSupListner"/>
        </batch:listeners>
        <batch:tasklet .....>
            <batch:chunk reader="stagedDataReader" processor="extractProcessor"
                writer="extractOutputWriter" commit-interval="1">
                <batch:listeners>
                    <batch:listener ref="chunkListener" />
                </batch:listeners>
            </batch:chunk>
        </batch:tasklet>
    </batch:step>

我假设我的监听器看起来像 包裹 com.mkyong.listeners;

public class notifyProdSupListner implements ItemReadListener<Domain> {

@Override
public void onReadError(Exception ex) {
    if (ex instanceof FileNotFoundException) {
        //mail support group
    }

}

}

我发现我想做的事情不能那样做。我有作业启动器,除非有输入文件并且它是可读的,否则作业启动器不会启动作业。

如果读取文件有问题,ItemReadListener 将允许我做一些事情。因为没有输入文件,所以启动器一开始就不会启动作业

在 FlatFileItemReader(我希望你正在使用的是它)中,如果你不想在源不存在的情况下使作业失败,你可以设置 属性 strict=false。对于您的情况,您可以保持它为真(这是默认值,它会抛出 IllegalStateException,您可以通过 afterJob 中的 JobExecutionListener 捕获它。在那里您将获得 JobExecution,您可以从中获取 getAllFailureExceptions() 并检查它是否因以下原因而失败文件不存在。然后做任何你想做的事来处理它。