2014-01-25 65 views
0

我对Spring批处理作业有一个查询。 我想在同一个执行环境中与另一个作​​业共享一个作业的数据。可能吗?如果是这样,那么怎么样?春季批处理如何在作业之间共享数据

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

您的建议,欢迎。

+0

如何触发批处理作业?你使用的webcontainer(春季批量管理员)或独立的Java项目? – nsylmz

+0

我正在使用Quartz Scheduler(exter shceduler)来调用作业。我的问题很简单。我想在缓存中保存数据(即不想每天从数据源读取数据作为属性文件/数据库)。只有当我的应用程序重新启动时,我才会调用数据源。 –

回答

1

你可以使用Spring初始化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; 
    } 
} 
+0

感谢哥们:-)我也决定了几乎相同的解决方案。我使用IntialzingBean和@PostContruct相同。 –

+0

我很高兴听到:)由于基于xml的配置,我的建议可能会过时。可能是基于注释的配置。我还有一个关于缓存的建议。我相信你会需要缓存驱逐。打开一个休息服务来刷新你的缓存:) – nsylmz

0

创建一个作业,将文件导入数据库。其他作业将使用数据库中的数据作为缓存。
另一种方式可能是读文件到一个地图<>和序列化对象比反序列化的文件时需要(但我还是喜欢数据库高速缓存)

+0

我想长期保存缓存数据作为对象(MAP),即直到服务器剂量重新启动以合并应用程序中的任何更改。我正在考虑在静态地图中保存属性文件数据。但我不确定垃圾收集器如何处理静态地图。我不希望垃圾收集器删除缓存数据。所以我可以使用,直到应用剂量重新启动。 –