我们有一个 spring-batch 作业,负责将测试场景从平面文件加载到数据库中,运行我们想要测试的程序,验证其结果。
我们检查程序执行的许多场景(约 300 个),因此我们加载精确的场景、启动程序并验证其结果约 300 次。
工作具体实施如下:
<job id="jobXY" xmlns="http://www.springframework.org/schema/batch">
<step id="loadFlatFileToDb" next="loadTestScenario">
<tasklet>
<chunk reader="flatFileReader" writer="flatFileWriter" commit-interval="2500"/>
</tasklet>
</step>
<step id="loadTestScenario" next="launchProgram">
<tasklet ref="loadTestScenario"/>
</step>
<step id="launchProgram" next="verifyResults">
<tasklet ref="launchProgramTasklet"/>
</step>
<step id="verifyResults" next="endTest">
<tasklet ref="verifieAvisTasklet"/>
</step>
<decision id="endTest" decider="endTestDecider">
<next on="FALSE" to="loadTestScenario" />
<end on="TRUE"/>
</decision>
</job>
Run Code Online (Sandbox Code Playgroud)
我们将最后 4 个步骤循环 300 次。就内存消耗而言,这些步骤确实很轻。另外,测试的程序是在另一个JVM中启动的。所以它不应该影响这个程序的内存。
然而,该程序占用的内存随着时间的推移而增加。执行约 150 次后,使用的内存(开始时:约 100mo)增加了 5 倍,并增加到 5go!
通过连接 Yourkit 分析器,我能够检测到存储在上下文中的 StepExecution 使用了大量内存(并且在每次循环后都会增加)。
如何禁用在每个步骤后保存 StepExecution 的功能?我不需要它,因为我的工作无法重新启动。
如果您有任何其他可以解决我的问题的想法,我也很感兴趣。
非常感谢你的帮助。
我有一个Pojo对象,由Jersey使用jackson序列化:
public class BookOfFriendsAnswer {
private Map<String, List<BookSummary>> books;
public BookOfFriendsAnswer() {
}
public BookOfFriendsAnswer(Map<String, List<BookSummary>> books) {
this.books = books;
}
public Map<String, List<BookSummary>> getBooks() {
return books;
}
public void setBooks(Map<String, List<BookSummary>> books) {
this.books = books;
}
}
Run Code Online (Sandbox Code Playgroud)
序列化产生一个像这样的JSon:
{
"books": {
"entry": [
{
"key": "54567bbce4b0e0ef9379993e",
"value": "BookSummary{id='54567bbde4b0e0ef9379993f', title='title 1', authors=[Steve,James] } BookSummary{id='54567bd9e4b0e0ef93799940', title='Title 2', authors=[Simon, Austin]}"
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我试图从我的客户端反序列化消息时,如下所示:
mapper.readValue(json, clazz)
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
无法识别的字段"key"(类com.example.server.api.BookSummary),未标记为可忽略
我不知道问题是来自服务器生成的JSOn还是客户端的反序列化.
你知道什么是问题以及如何纠正它?
非常感谢