メールに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="ヘッダー&#10;" />

<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