弹簧批如何在作业之间共享数据

时间:2014-01-25 21:27:32

标签: caching spring-batch

我有一个关于Spring Batch Job的查询。 我想在同一个执行上下文中与另一个作​​业共享一个作业的数据。可能吗?如果是这样,那怎么样?

我的要求是缓存。我有文件,存储一些数据。我的工作每天都在运行,需要该文件的数据。我不想每天通过我的工作阅读文件。而不是它,我想存储缓存中的文件数据(哈希映射)。因此,当第二天运行相同的作业时,它将仅使用来自缓存的数据。是否有可能在春季批次?

欢迎您提出建议。

3 个答案:

答案 0 :(得分:3)

您可以使用spring initialize bean在启动时初始化缓存。

将初始化bean添加到应用程序上下文中;

<bean id="yourCacheBean" class="yourpackage.YourCacheBean" init-method="initialize">
</bean>

YourCacheBean看起来像;

public class YourCacheBean {

    private Map<Object, Object> yourCache;

    public void initialize() {
        //TODO: Intialize your cache
    }
}

将initialize bean提供给job.xml中的itemReader或itemProcessor或itemWriter;

<bean id="exampleProcessor" class="yourpackage.ExampleProcessor" scope="step">
    <property name="cacheBean" ref="yourCacheBean" />
</bean>

ExampleProcessor看起来像;

public class ExampleProcessor implements ItemProcessor<String, String> {

    private YourCacheBean cacheBean;

    public String process(String arg0) {
        return "";
    }

    public void setCacheBean(YourCacheBean cacheBean) {
        this.cacheBean = cacheBean;
    }
}

答案 1 :(得分:0)

创建作业以将文件导入数据库。其他作业将使用数据库中的数据作为缓存。
另一种方式可以是将文件读入Map&lt;&gt;并且在需要时将对象序列化为文件而不是反序列化(但我仍然喜欢将数据库作为缓存)

答案 2 :(得分:0)

Spring有一个缓存注释,可以帮助实现这种情况,并且实现起来非常简单。将执行对方法的第一次调用,之后如果使用完全相同的参数调用相同的方法,则缓存将返回该值。

这里有一个小教程:http://www.baeldung.com/spring-cache-tutorial

在您的情况下,如果您对读取文件的调用总是使用相同的参数,则可以根据需要使用。只需照顾TTL。