メールにitemを書き込むItemWriter部品
SpringBatchでは様々なitemを書き込む部品が用意されています。
しかし、メールに書き込む部品は用意されていません。
soracaneでは、メールに書き込む部品を提供します。
以下で、部品の使い方を見てみます。
目標
ファイルからデータを読み込み、メールに書き込むこともできますが、ファイルの準備が必要になります。
それだとサンプルとして面倒かと思いますので、ここではデータはSpringの設定ファイルに書き込むことにします。
Spring設定ファイルに記述されたデータをItemReaderで読み込み、MailItemWriterでメールに書き込みます。
DBやファイルからデータを読み込むItemReaderにつきましては、Spring概要の記事か、インターネット上を検索すれば見つかるかと思いますので
そちらを参照ください。
使用サンプル
<SpringBatch設定ファイル: batch-context.xml>
<!-- ジョブの処理1 -->
<job id="job" xmlns="http://www.springframework.org/schema/batch" incrementer="jobParametersIncrementer">
<step id="step1" parent="simpleStep" >
<tasklet>
<chunk reader="itemReader" writer="mailItemWriter" commit-interval="2" />
</tasklet>
</step>
</job>
<!-- enables the functionality of JobOperator.startNextInstance(jobName) -->
<bean id="jobParametersIncrementer" class="org.springframework.batch.core.launch.support.RunIdIncrementer" />
<bean id="simpleStep"
class="org.springframework.batch.core.step.item.SimpleStepFactoryBean"
abstract="true">
<property name="jobRepository" ref="jobRepository" />
<property name="commitInterval" value="1" />
</bean>
<!-- ファイルを読み込みBeanに入れる -->
<bean id="itemReader" class="jp.co.soracane.batch.item.RestartableListItemReader">
<constructor-arg index="0">
<list>
<map>
<entry key="id" value="123" />
<entry key="name" value="名前" />
<entry key="date" value="2010/10/11" />
</map>
<map>
<entry key="id" value="345" />
<entry key="name" value="名前2" />
<entry key="date" value="2010/11/11" />
</map>
<map>
<entry key="id" value="780" />
<entry key="name" value="名前3" />
<entry key="date" value="2010/12/11" />
</map>
</list>
</constructor-arg>
</bean>
<bean id="simpleMailMessage" class="org.springframework.mail.SimpleMailMessage">
<property name="subject" value="テスト" />
<property name="from" value="test@test.co.jp" />
<property name="to" value="test.to@test.co.jp" />
</bean>
<!-- 読み込んだ結果をメールに出力していく -->
<bean id="mailItemWriter" class="jp.co.soracane.batch.item.MailItemWriter" scope="step">
<property name="mailSender" ref="mailSender" />
<property name="simpleMailMessage" ref="simpleMailMessage" />
<property name="textTemplate">
<bean class="jp.co.soracane.batch.item.file.LineAggregatorTextTemplate">
<property name="header" value="ヘッダー " />
<property name="footer" value="フッター" />
<property name="lineAggregator">
<bean class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
<property name="fieldExtractor">
<bean class="jp.co.soracane.batch.item.file.MapFieldExtractor" >
<property name="names" value="id,name,date" />
</bean>
</property>
</bean>
</property>
</bean>
</property>
</bean>
<!-- メールセンダー -->
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="defaultEncoding" value="ISO-2022-JP" />
<property name="host" value="smtp.XXX.ne.jp" />
<property name="username" value="Xxxxx" />
</bean>
ここで設定したItemReaderは、Listの要素を順番にitemとして渡していく部品です。
単純な機能ですのでここではそれ程気にしなくて大丈夫です。
MailItemWriterはsoracaneが提供するメールを送信する部品です。
textTemplateプロパティは、メール本文を作成する方法を設定します。
ここでは、LineAggregatorを利用したTextTemplateを設定しました。
メール本文はカンマ区切りで記述されます。出力するデータの数はコミット数で決まり、上記の設定の場合、2行が出力されます。
また、コミットする度にメールが送信されます。
【送信されるメールのサンプル】
<メール1通目>
[タイトル]
テスト[1]
[本文]
ヘッダー
123,名前,2010/10/11
345,名前2,2010/11/11
フッター
<メール2通目>
[タイトル]
テスト[2]
[本文]
ヘッダー
780,名前3,2010/12/11
フッター
textTemplateには、他にもVelocityTemplateなどがあります。
Velocityを使用してメール本文を作成することができます。
javadocのTextTemplateを見てみてください。派生クラスを見ると、どのようなクラスが用意されているか分かるかと思います。
こうして、データをメールで送信することができます。
最後に
MailItemWriterを使用すると、設定だけでデータを本文に記述したメールを送信することができるようになります。
定期的にSQLなどでデータを収集してメールで送るツールなどは、設定ファイルの記述のみで実現できるようになります。
SQLの実行用の部品はSpringBatchで用意されています。
IBatisを使用する場合などは設定のみで完全にデータ送信できます。
また、SpringJdbcを使用するときはMapを使用できるようにする部品をsoracaneで用意していますので、SpringJdbcを使用する場合でも設定ファイルのみで実現できます。
かなり、SpringBatchでできることの幅が広がるかとおもいます。
Created Date: 2010/01/10