Spring Batch學習筆記——steps之間共享數據

<h2>名詞說明:</h2> <p>上下文:</p> <p>執行:</p> <p>執行上下文:</p> <h2>案例:</h2> <p>警告:一旦steps共享數據,這些數據就會把這些steps鏈接起來。努力使steps獨立。若是你實在是不能獨立他們,才使用下面的技術。你應該把數據共享做爲steps不能獨立的後備方案。</p> <h2>1 數據共享方式:</h2> <ul> <li>a step存儲共享數據到數據庫,receiving step從數據庫讀取他們 </li> <li>Execution context(執行上下文): 使用Spring&#160; Batch execution context 做爲data容器。a step往上下文寫數據,一個step從上下文讀數據 </li> <li>Holder:使用Spring bean和依賴注入。Spring往communicating beans中注入一個holder bean。第一個step往holder中set values,另外一個step從holder中reads values </li> </ul> <h2>2 使用execution context來共享數據</h2> <p>什麼是execution context:ExecutionContext類就表明了執行上下文,它就是一個適合與批應用的 鍵值對的一個 map。下面就是一個從上下文讀寫數據的例子:</p> <blockquote> <pre><pre style="font-size: 12px; font-family: consolas,&#39;Courier New&#39;,courier,monospace; width: 100%; margin: 0em; background-color: #ffffff">executionContext.putString(&quot;importId&quot;, importId); </pre><pre style="font-size: 12px; font-family: consolas,&#39;Courier New&#39;,courier,monospace; width: 100%; margin: 0em; background-color: #ffffff">String importId = jobExecutionContext.getString(&quot;importId&quot;);</pre></pre> </blockquote>數據庫

<p>an execution context只是a job execution的一部分,而且不一樣的執行上下文</p>ide

<h3>Jobs 和 steps 有它們本身的execution context</h3>spa

<p>&#160;&#160;&#160; Spring Batch提供了兩種execution context: job execution context和step execution context。它們都是ExecutionContext類型可是它們的做用域不一樣。下圖說明了在一個job execution過程當中的兩種執行上下文。</p>.net

<p><a href="http://static.oschina.net/uploads/img/201504/03000640_mlZS.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://static.oschina.net/uploads/img/201504/03000640_aOZS.png" width="244" height="95" /></a></p>接口

<p>那麼怎麼訪問執行上下文呢?你須要引用對應的執行:JobExecution:若是你想訪問job執行上下文,StepExecution:若是你想訪問step執行上下文。幾乎全部的Spring Batch artifacts可以很容易的訪問JobExecution和StepExecution,不幸的是item reader,processor,writer功能不能訪問它們。不過你能夠實現一個監聽接口(如:ItemStream)來洞察execution.下面列舉了ItemReader經過實現ItemStream接口來訪問執行上下文</p>作用域

<p>清單1:</p>get

<pre><pre style="font-size: 12px; font-family: consolas,&#39;Courier New&#39;,courier,monospace; width: 100%; margin: 0em; background-color: #ffffff"><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> FilesInDirectoryItemReader <span style="color: #0000ff">implements</span> </pre><pre style="font-size: 12px; font-family: consolas,&#39;Courier New&#39;,courier,monospace; width: 100%; margin: 0em; background-color: #ffffff"> ItemReader&lt;File&gt;, ItemStream {it

</pre><pre style="font-size: 12px; font-family: consolas,&#39;Courier New&#39;,courier,monospace; width: 100%; margin: 0em; background-color: #ffffff">@Override </pre><pre style="font-size: 12px; font-family: consolas,&#39;Courier New&#39;,courier,monospace; width: 100%; margin: 0em; background-color: #ffffff"><span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> open(ExecutionContext executionContext) </pre><pre style="font-size: 12px; font-family: consolas,&#39;Courier New&#39;,courier,monospace; width: 100%; margin: 0em; background-color: #ffffff"> <span style="color: #0000ff">throws</span> ItemStreamException { } </pre><pre style="font-size: 12px; font-family: consolas,&#39;Courier New&#39;,courier,monospace; width: 100%; margin: 0em; background-color: #ffffff">@Override </pre><pre style="font-size: 12px; font-family: consolas,&#39;Courier New&#39;,courier,monospace; width: 100%; margin: 0em; background-color: #ffffff"><span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> update(ExecutionContext executionContext) </pre><pre style="font-size: 12px; font-family: consolas,&#39;Courier New&#39;,courier,monospace; width: 100%; margin: 0em; background-color: #ffffff"> <span style="color: #0000ff">throws</span> ItemStreamException { } </pre><pre style="font-size: 12px; font-family: consolas,&#39;Courier New&#39;,courier,monospace; width: 100%; margin: 0em; background-color: #ffffff">@Override </pre><pre style="font-size: 12px; font-family: consolas,&#39;Courier New&#39;,courier,monospace; width: 100%; margin: 0em; background-color: #ffffff"><span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> close() <span style="color: #0000ff">throws</span> ItemStreamException { } </pre><pre style="font-size: 12px; font-family: consolas,&#39;Courier New&#39;,courier,monospace; width: 100%; margin: 0em; background-color: #ffffff">@Override </pre><pre style="font-size: 12px; font-family: consolas,&#39;Courier New&#39;,courier,monospace; width: 100%; margin: 0em; background-color: #ffffff"><span style="color: #0000ff">public</span> File read() <span style="color: #0000ff">throws</span> Exception, UnexpectedInputException, </pre><pre style="font-size: 12px; font-family: consolas,&#39;Courier New&#39;,courier,monospace; width: 100%; margin: 0em; background-color: #ffffff"> ParseException, NonTransientResourceException { (...) } </pre><pre style="font-size: 12px; font-family: consolas,&#39;Courier New&#39;,courier,monospace; width: 100%; margin: 0em; background-color: #ffffff">}</pre></pre>io

<pre>用job execution context在steps之間共享數據</pre>class

相關文章
相關標籤/搜索