paulwong

          SPRING BATCH 錯(cuò)誤通知機(jī)制

          運(yùn)行SPRING BATCH JOB 的時(shí)候,有可能出錯(cuò),如果能有相關(guān)的錯(cuò)誤處理機(jī)制,則這些錯(cuò)誤就能及時(shí)得到處理。

          SPRING BATCH 提供了監(jiān)聽器,可配置在JOB執(zhí)行完后,或執(zhí)行JOB前,要執(zhí)行的方法。

          JOB的定義及BEAN的配置文件:

          <?xml version="1.0" encoding="UTF-8"?>
          <beans xmlns="http://www.springframework.org/schema/beans"
              xmlns:xsi
          ="http://www.w3.org/2001/XMLSchema-instance"
              xmlns:batch
          ="http://www.springframework.org/schema/batch"
              xmlns:util
          ="http://www.springframework.org/schema/util"
              xsi:schemaLocation
          ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                  http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
                  http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch-2.1.xsd"
          >

              <batch:job id="restartHelloWorldJob">
                  <batch:step id="restartStep1" next="restartStep2">
                      <batch:tasklet ref="helloWorldTasklet"></batch:tasklet>
                  </batch:step>
                  <batch:step id="restartStep2" next="restartStep3">
                      <batch:tasklet ref="helloWorldTwoTasklet"></batch:tasklet>
                  </batch:step>
                  <batch:step id="restartStep3" >
                      <batch:tasklet ref="helloWorldThreeTasklet"></batch:tasklet>
                  </batch:step>
                  <batch:listeners>
                      <batch:listener ref="monitoringJobListener"></batch:listener>
                  </batch:listeners>
              </batch:job>

              
              <bean id="helloWorldTasklet" class="com.paul.batch.tasklet.HelloWorldTasklet"></bean>
              <bean id="helloWorldTwoTasklet" class="com.paul.batch.tasklet.HelloWorldTwoTasklet"></bean>
              <bean id="helloWorldThreeTasklet" class="com.paul.batch.tasklet.HelloWorldThreeTasklet"></bean>
              
              <!-- <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
                  <property name="host" value=""></property>
              </bean>

              <bean id="templateMessage" class="org.springframework.mail.SimpleMailMessage">
                  <property name="from" value="batch-notifier@example.com" />
                  <property name="to" value=""></property>
              </bean>
              
              <bean id="emailMonitoringNotifier" class="com.paul.batch.notifier.EmailMonitoringNotifier">
                  <property name="mailSender" ref="mailSender" />
                  <property name="templateMessage" ref="templateMessage" />
              </bean> 
          -->
              
              <bean id="logMonitoringNotifier" class="com.paul.batch.notifier.LogMonitoringNotifier">
              </bean>
              
              <bean id="monitoringJobListener" class="com.paul.batch.listener.MonitoringExecutionListener">
                  <property name="monitoringNotifier" ref="logMonitoringNotifier"></property>
              </bean>
          </beans>

          監(jiān)聽器MonitoringExecutionListener

          package com.paul.batch.listener;

          import org.springframework.batch.core.BatchStatus;
          import org.springframework.batch.core.JobExecution;
          import org.springframework.batch.core.annotation.AfterJob;
          import org.springframework.batch.core.annotation.BeforeJob;

          import com.paul.batch.notifier.BatchMonitoringNotifier;

          public class MonitoringExecutionListener {
              private BatchMonitoringNotifier monitoringNotifier;

              @BeforeJob
              public void executeBeforeJob(JobExecution jobExecution) {
                  // Do nothing
              }

              @AfterJob
              public void executeAfterJob(JobExecution jobExecution) {
                  if (jobExecution.getStatus() == BatchStatus.FAILED) {
                      // Notify when job fails
                      monitoringNotifier.notify(jobExecution);
                  }
              }

              public void setMonitoringNotifier(BatchMonitoringNotifier monitoringNotifier) {
                  this.monitoringNotifier = monitoringNotifier;
              }
          }


          BatchMonitoringNotifier接口

          package com.paul.batch.notifier;

          import org.springframework.batch.core.JobExecution;

          public interface BatchMonitoringNotifier {

              void notify(JobExecution jobExecution);

          }


          LogMonitoringNotifier實(shí)現(xiàn)

          package com.paul.batch.notifier;

          import java.io.ByteArrayOutputStream;
          import java.io.PrintStream;
          import java.util.List;

          import org.springframework.batch.core.JobExecution;

          public class LogMonitoringNotifier implements BatchMonitoringNotifier {

              private String formatExceptionMessage(Throwable exception) {
                  ByteArrayOutputStream baos = new ByteArrayOutputStream();
                  exception.printStackTrace(new PrintStream(baos));
                  return baos.toString();
              }

              private String createMessageContent(JobExecution jobExecution) {
                  List<Throwable> exceptions = jobExecution.getAllFailureExceptions();
                  StringBuilder content = new StringBuilder();
                  content.append("Job execution #");
                  content.append(jobExecution.getId());
                  content.append(" of job instance #");
                  content.append(jobExecution.getJobInstance().getId());
                  content.append(" failed with following exceptions:");
                  for (Throwable exception : exceptions) {
                      content.append("");
                      content.append(formatExceptionMessage(exception));
                  }
                  return content.toString();
              }

              public void notify(JobExecution jobExecution) {
                  String content = createMessageContent(jobExecution);
                  System.out.println(content);
              }
          } 


          EmailMonitoringNotifier實(shí)現(xiàn)

          package com.paul.batch.notifier;

          import java.io.ByteArrayOutputStream;
          import java.io.PrintStream;
          import java.util.List;

          import org.springframework.batch.core.JobExecution;
          import org.springframework.mail.MailException;
          import org.springframework.mail.MailSender;
          import org.springframework.mail.SimpleMailMessage;

          public class EmailMonitoringNotifier implements BatchMonitoringNotifier {
              private MailSender mailSender;
              private SimpleMailMessage templateMessage;

              private String formatExceptionMessage(Throwable exception) {
                  ByteArrayOutputStream baos = new ByteArrayOutputStream();
                  exception.printStackTrace(new PrintStream(baos));
                  return baos.toString();
              }

              private String createMessageContent(JobExecution jobExecution) {
                  List<Throwable> exceptions = jobExecution.getFailureExceptions();
                  StringBuilder content = new StringBuilder();
                  content.append("Job execution #");
                  content.append(jobExecution.getId());
                  content.append(" of job instance #");
                  content.append(jobExecution.getJobInstance().getId());
                  content.append(" failed with following exceptions:");
                  for (Throwable exception : exceptions) {
                      content.append("");
                      content.append(formatExceptionMessage(exception));
                  }
                  return content.toString();
              }

              public void notify(JobExecution jobExecution) {
                  SimpleMailMessage msg = new SimpleMailMessage(this.templateMessage);
                  msg.setTo("batch-administrator@example.com");
                  String content = createMessageContent(jobExecution);
                  msg.setText(content);
                  try {
                      mailSender.send(msg);
                  } catch (MailException ex) {
                  }
              }

              public MailSender getMailSender() {
                  return mailSender;
              }

              public void setMailSender(MailSender mailSender) {
                  this.mailSender = mailSender;
              }

              public SimpleMailMessage getTemplateMessage() {
                  return templateMessage;
              }

              public void setTemplateMessage(SimpleMailMessage templateMessage) {
                  this.templateMessage = templateMessage;
              }
          }

          MAVEN pom.xml
          <?xml version="1.0" encoding="UTF-8"?>
          <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
              <modelVersion>4.0.0</modelVersion>
              <groupId>org.springframework.batch</groupId>
              <artifactId>spring-batch-simple-cli</artifactId>
              <version>2.1.9.RELEASE</version>
              <packaging>jar</packaging>
              <name>Commandline</name>
              <url>http://www.springframework.org/spring-batch/archetypes/simple-cli-archetype</url>
              <description>This project is a minimal command line batch sample from
                  Spring Batch. Once installed you can use "mvn exec:java" to
                  see the job run; or if you ship the lib directory you can put
                  the project jar on the classpath and run the
                  CommandLineJobRunner directly or with "java -jar launch-context.xml job1".</description>
              <properties>
                  <maven.test.failure.ignore>true</maven.test.failure.ignore>
                  <spring.framework.version>3.0.5.RELEASE</spring.framework.version>
                  <spring.batch.version>2.1.9.RELEASE</spring.batch.version>
                  <dependency.locations.enabled>false</dependency.locations.enabled>
                  <spring.integration.version>2.0.6.RELEASE</spring.integration.version>
              </properties>
              <profiles>
                  <profile>
                      <id>strict</id>
                      <properties>
                          <maven.test.failure.ignore>false</maven.test.failure.ignore>
                      </properties>
                  </profile>
                  <profile>
                      <id>staging</id>
                      <distributionManagement>
                          <repository>
                              <id>staging</id>
                              <url>file:///${user.dir}/target/staging</url>
                          </repository>
                          <snapshotRepository>
                              <id>staging</id>
                              <url>file:///${user.dir}/target/staging</url>
                          </snapshotRepository>
                      </distributionManagement>
                  </profile>
                  <profile>
                      <id>bootstrap</id>
                      <activation>
                          <activeByDefault>true</activeByDefault>
                      </activation>
                      <pluginRepositories>
                          <!-- <pluginRepository>
                              <id>Codehaus</id>
                              <url>http://repository.codehaus.org/</url>
                              <snapshots>
                                  <enabled>false</enabled>
                              </snapshots>
                          </pluginRepository> 
          -->
                          <pluginRepository>
                              <id>com.springsource.repository.bundles.release</id>
                              <name> SpringSource Enterprise Bundle Repository - SpringSource Bundle Releases</name>
                              <url>http://repository.springsource.com/maven/bundles/release</url>
                              <snapshots>
                                  <enabled>false</enabled>
                              </snapshots>
                          </pluginRepository>
                      </pluginRepositories>
                  </profile>
              </profiles>
              <dependencies>
                  <dependency>
                      <groupId>junit</groupId>
                      <artifactId>junit</artifactId>
                      <version>4.8</version>
                      <scope>test</scope>
                  </dependency>
                  <dependency>
                      <groupId>org.springframework</groupId>
                      <artifactId>spring-test</artifactId>
                      <version>${spring.framework.version}</version>
                      <scope>test</scope>
                  </dependency>
                  <dependency>
                      <groupId>org.springframework</groupId>
                      <artifactId>spring-context</artifactId>
                      <version>${spring.framework.version}</version>
                  </dependency>
                  <dependency>
                      <groupId>org.springframework</groupId>
                      <artifactId>spring-aop</artifactId>
                      <version>${spring.framework.version}</version>
                  </dependency>
                  <dependency>
                      <groupId>org.springframework</groupId>
                      <artifactId>spring-jdbc</artifactId>
                      <version>${spring.framework.version}</version>
                  </dependency>
                  <dependency>
                      <groupId>org.springframework.batch</groupId>
                      <artifactId>spring-batch-core</artifactId>
                      <version>${spring.batch.version}</version>
                  </dependency>
                  <dependency>
                      <groupId>org.springframework.batch</groupId>
                      <artifactId>spring-batch-infrastructure</artifactId>
                      <version>${spring.batch.version}</version>
                  </dependency>
                  <dependency>
                      <groupId>org.springframework.batch</groupId>
                      <artifactId>spring-batch-test</artifactId>
                      <version>${spring.batch.version}</version>
                      <scope>test</scope>
                  </dependency>
                  <dependency>
                      <groupId>commons-dbcp</groupId>
                      <artifactId>commons-dbcp</artifactId>
                      <version>1.2.2</version>
                  </dependency>
                  <dependency>
                      <groupId>org.slf4j</groupId>
                      <artifactId>slf4j-log4j12</artifactId>
                      <version>1.5.8</version>
                      <optional>true</optional>
                  </dependency>
                  <dependency>
                      <groupId>log4j</groupId>
                      <artifactId>log4j</artifactId>
                      <version>1.2.14</version>
                      <optional>true</optional>
                  </dependency>
                  <dependency>
                      <groupId>commons-io</groupId>
                      <artifactId>commons-io</artifactId>
                      <version>1.4</version>
                  </dependency>
                  <dependency>
                      <groupId>hsqldb</groupId>
                      <artifactId>hsqldb</artifactId>
                      <version>1.8.0.7</version>
                  </dependency>
                  <dependency>
                      <groupId>org.aspectj</groupId>
                      <artifactId>aspectjrt</artifactId>
                      <version>1.5.4</version>
                  </dependency>
                  <dependency>
                      <groupId>org.aspectj</groupId>
                      <artifactId>aspectjweaver</artifactId>
                      <version>1.5.4</version>
                  </dependency>
                  <dependency>
                      <groupId>org.springframework.integration</groupId>
                      <artifactId>spring-integration-core</artifactId>
                      <version>${spring.integration.version}</version>
                  </dependency>
                  <dependency>
                      <groupId>org.springframework.batch</groupId>
                      <artifactId>spring-batch-integration</artifactId>
                      <version>1.2.1.RELEASE</version>
                  </dependency>
                  <dependency>
                      <groupId>org.springframework.integration</groupId>
                      <artifactId>spring-integration-file</artifactId>
                      <version>${spring.integration.version}</version>
                  </dependency>
                  <dependency>
                      <groupId>mysql</groupId>
                      <artifactId>mysql-connector-java</artifactId>
                      <version>5.1.21</version>
                  </dependency>
                  <dependency>
                      <groupId>org.springframework</groupId>
                      <artifactId>spring-oxm</artifactId>
                      <version>${spring.framework.version}</version>
                  </dependency>
                  <dependency>
                      <groupId>org.springframework.integration</groupId>
                      <artifactId>spring-integration-jdbc</artifactId>
                      <version>${spring.integration.version}</version>
                  </dependency>
                  <dependency>
                      <groupId>org.springframework</groupId>
                      <artifactId>spring-context-support</artifactId>
                      <version>${spring.framework.version}</version>
                  </dependency>
              </dependencies>
              <build>
                  <extensions>
                      <extension>
                          <groupId>org.springframework.build.aws</groupId>
                          <artifactId>org.springframework.build.aws.maven</artifactId>
                          <version>3.0.0.RELEASE</version>
                      </extension>
                  </extensions>
                  <pluginManagement>
                      <plugins>
                          <plugin>
                              <artifactId>maven-assembly-plugin</artifactId>
                              <inherited>false</inherited>
                              <configuration>
                                  <descriptorRefs>
                                      <descriptorRef>project</descriptorRef>
                                  </descriptorRefs>
                              </configuration>
                          </plugin>
                          <!--This plugin's configuration is used to store Eclipse m2e settings 
                              only. It has no influence on the Maven build itself. 
          -->
                          <plugin>
                              <groupId>org.eclipse.m2e</groupId>
                              <artifactId>lifecycle-mapping</artifactId>
                              <version>1.0.0</version>
                              <configuration>
                                  <lifecycleMappingMetadata>
                                      <pluginExecutions>
                                          <pluginExecution>
                                              <pluginExecutionFilter>
                                                  <groupId>com.springsource.bundlor</groupId>
                                                  <artifactId>com.springsource.bundlor.maven</artifactId>
                                                  <versionRange>[1.0,)</versionRange>
                                                  <goals>
                                                      <goal>bundlor</goal>
                                                  </goals>
                                              </pluginExecutionFilter>
                                              <action>
                                                  <ignore />
                                              </action>
                                          </pluginExecution>
                                          <pluginExecution>
                                              <pluginExecutionFilter>
                                                  <groupId>org.apache.maven.plugins</groupId>
                                                  <artifactId>maven-dependency-plugin</artifactId>
                                                  <versionRange>[1.0,)</versionRange>
                                                  <goals>
                                                      <goal>copy-dependencies</goal>
                                                  </goals>
                                              </pluginExecutionFilter>
                                              <action>
                                                  <ignore />
                                              </action>
                                          </pluginExecution>
                                      </pluginExecutions>
                                  </lifecycleMappingMetadata>
                              </configuration>
                          </plugin>
                      </plugins>
                  </pluginManagement>
                  <plugins>
                      <plugin>
                          <groupId>org.apache.maven.plugins</groupId>
                          <artifactId>maven-compiler-plugin</artifactId>
                          <configuration>
                              <source>1.6</source>
                              <target>1.6</target>
                          </configuration>
                      </plugin>
                      <plugin>
                          <groupId>com.springsource.bundlor</groupId>
                          <artifactId>com.springsource.bundlor.maven</artifactId>
                          <version>1.0.0.RELEASE</version>
                          <executions>
                              <execution>
                                  <id>bundlor-transform</id>
                                  <phase>compile</phase>
                                  <goals>
                                      <goal>bundlor</goal>
                                  </goals>
                              </execution>
                          </executions>
                      </plugin>
                      <plugin>
                          <groupId>org.apache.maven.plugins</groupId>
                          <artifactId>maven-surefire-plugin</artifactId>
                          <version>2.12.3</version>
                          <configuration>
                              <includes>
                                  <include>**/*Tests.java</include>
                              </includes>
                              <excludes>
                                  <exclude>**/Abstract*.java</exclude>
                              </excludes>
                              <junitArtifactName>junit:junit</junitArtifactName>
                          </configuration>
                      </plugin>
                      <plugin>
                          <groupId>org.codehaus.mojo</groupId>
                          <artifactId>exec-maven-plugin</artifactId>
                          <version>1.1</version>
                          <configuration>
                              <mainClass>org.springframework.batch.core.launch.support.CommandLineJobRunner</mainClass>
                              <arguments>
                                  <argument>classpath:/launch-context.xml</argument>
                                  <argument>job1</argument>
                              </arguments>
                          </configuration>
                      </plugin>
                      <plugin>
                          <groupId>org.apache.maven.plugins</groupId>
                          <artifactId>maven-dependency-plugin</artifactId>
                          <executions>
                              <execution>
                                  <id>copy-dependencies</id>
                                  <phase>package</phase>
                                  <goals>
                                      <goal>copy-dependencies</goal>
                                  </goals>
                                  <configuration>
                                      <outputDirectory>${project.build.directory}/lib</outputDirectory>
                                  </configuration>
                              </execution>
                          </executions>
                      </plugin>
                      <plugin>
                          <groupId>org.apache.maven.plugins</groupId>
                          <artifactId>maven-jar-plugin</artifactId>
                          <version>2.3</version>
                          <configuration>
                              <archive>
                                  <index>false</index>
                                  <manifest>
                                      <mainClass>org.springframework.batch.core.launch.support.CommandLineJobRunner</mainClass>
                                      <addClasspath>true</addClasspath>
                                      <classpathPrefix>lib/</classpathPrefix>
                                  </manifest>
                                  <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
                              </archive>
                          </configuration>
                      </plugin>
                  </plugins>
              </build>
              <distributionManagement>
                  <downloadUrl>http://www.springframework.org/download</downloadUrl>
                  <site>
                      <id>staging</id>
                      <url>file:///${user.dir}/target/staging/org.springframework.batch.archetype/${pom.artifactId}</url>
                  </site>
                  <repository>
                      <id>spring-release</id>
                      <name>Spring Release Repository</name>
                      <url>file:///${user.dir}/target/staging/release</url>
                  </repository>
                  <snapshotRepository>
                      <id>spring-snapshot</id>
                      <name>Spring Snapshot Repository</name>
                      <url>file:///${user.dir}/target/staging/snapshot</url>
                  </snapshotRepository>
              </distributionManagement>
          </project>



          posted on 2012-11-17 21:42 paulwong 閱讀(4657) 評論(1)  編輯  收藏 所屬分類: SRPING BATCH

          Feedback

          # re: SPRING BATCH 錯(cuò)誤通知機(jī)制 2013-08-16 09:27 paulwong

          @清風(fēng)
          是SPRING BATCH自帶的ADMIN CONSOLE?那是要人工去查看的,這個(gè)可以實(shí)現(xiàn)自動(dòng)通知機(jī)制,如發(fā)郵件等。  回復(fù)  更多評論   


          主站蜘蛛池模板: 鲁山县| 开封县| 金华市| 金阳县| 德钦县| 高碑店市| 甘孜县| 旅游| 余庆县| 义马市| 尉犁县| 扎赉特旗| 东宁县| 香河县| 福安市| 宁德市| 濮阳县| 安远县| 承德县| 山阳县| 郧西县| 浑源县| 涿州市| 子长县| 武陟县| 左权县| 凤山县| 如皋市| 新田县| 普洱| 满洲里市| 南充市| 峨眉山市| 壶关县| 汶上县| 巧家县| 永年县| 罗城| 启东市| 介休市| 策勒县|