2011-09-15 8 views
1

私は春Integeration.Iに新しいですが、春integeration - エラーチャネル取り扱いは

  1. は、いくつかの検証を行う
  2. (ソースフォルダから)txtファイルを読み込むスプリングintegerationを使用して1つの要件が発行
  3. 場合(成功フォルダ内の)成功ファイルへの書き込み
  4. 検証が失敗ファイル(エラーフォルダ内)に失敗した場合
  5. ファイル形式が正しくない場合は、そのファイルを次のフォルダに移動する必要があります。エラーフォルダ(例:除外の列は2ですが、私のファイルに列が含まれている1である)私の設定ファイルはこの

     <?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:si="http://www.springframework.org/schema/integration" 
         xmlns:file="http://www.springframework.org/schema/integration/file" 
         xsi:schemaLocation="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
           http://www.springframework.org/schema/integration 
           http://www.springframework.org/schema/integration/spring-integration-1.0.xsd 
           http://www.springframework.org/schema/integration/file 
           http://www.springframework.org/schema/integration/file/spring-integration-file-1.0.xsd"> 
    
         <bean id="checkCSVReader" 
          class="com.check.wrapper"> 
          <property name="pzMapXML" value="classpath:sampleFileFormat.xml" /> 
         </bean> 
    
         <bean id="checkTrasnFomer" 
          class="com.check.checkTransfomer"> 
          <property name="wrapper" ref="checkCSVReader" /> 
         </bean> 
    
         <bean id="fileErrorProcessor" 
          class="com.check.ErrorChannelWriter"> 
         </bean> 
         <bean id="listToStringTrans" 
          class="com.check.ListToStringTransfomer"></bean> 
    
    
        <bean id="validation" 
          class="com.check.Validation"/> 
    
         <file:inbound-channel-adapter directory="file://D:\check\soruce" prevent-duplicates="false" 
          auto-create-directory="true" channel="readChannel" > 
          <si:poller id="Poller"> 
           <si:interval-trigger interval="10000" /> 
          </si:poller> 
         </file:inbound-channel-adapter> 
    
         <si:channel id="readChannel" /> 
    
         <si:chain input-channel="readChannel" output-channel="processChannel"> 
          <si:header-enricher error-channel="errorFile" /> 
          <file:file-to-string-transformer /> 
          <si:transformer ref="checkTrasnFomer" method="transform" /> 
          <si:service-activator ref="validation" 
           method="validate" /> 
         </si:chain> 
    
         <si:channel id="processChannel" /> 
    
         <si:transformer ref="listToStringTrans" method="transformList" 
          input-channel="processChannel" output-channel="finalOut" /> 
    
         <si:channel id="finalOut" /> 
    
         <file:outbound-channel-adapter id="checkSuccFileOutBound" 
          auto-create-directory="true" delete-source-files="true" 
          directory="file://D:\check\success" channel="finalOut"> 
         </file:outbound-channel-adapter> 
    
         <si:channel id="errorFile" /> 
    
         <si:transformer ref="fileErrorProcessor" 
          input-channel="errorFile" output-channel="errorChannel" method="transformError" /> 
    
         <file:outbound-channel-adapter id="errorChannel" 
          directory="file://D:\check\error" delete-source-files="true" 
          /> 
    
         <si:channel id="checkFileErr" /> 
        </beans> 
    

    私checkFlatPackCVSParserWrapperクラスは

    public class checkFlatPackCVSParserWrapper { 
         private static final Log LOG = LogFactory.getLog("checkFlatPackCVSParserWrapper"); 
         private Resource pzMapXML; 
         private char delimiter = ','; 
         private char qualifier = '"'; 
         private boolean ignoreFirstRecord = false; 
    
         public Resource getPzMapXML() { 
          return pzMapXML; 
         } 
         public void setPzMapXML(Resource pzMapXML) { 
          this.pzMapXML = pzMapXML; 
         } 
         public char getDelimiter() { 
          return delimiter; 
         } 
         public void setDelimiter(char delimiter) { 
          this.delimiter = delimiter; 
         } 
         public char getQualifier() { 
          return qualifier; 
         } 
         public void setQualifier(char qualifier) { 
          this.qualifier = qualifier; 
         } 
         public boolean isIgnoreFirstRecord() { 
          return ignoreFirstRecord; 
         } 
         public void setIgnoreFirstRecord(boolean ignoreFirstRecord) { 
          this.ignoreFirstRecord = ignoreFirstRecord; 
         } 
    
         public Parser getParser(String csv) { 
          if(LOG.isDebugEnabled()) 
           LOG.debug("getParser: " + csv); 
    
          Parser result = null; 
          try { 
           result = DefaultParserFactory.getInstance().newDelimitedParser(
             pzMapXML.getInputStream(), //xml column mapping 
             new ByteArrayInputStream(csv.getBytes()), //txt file to parse 
             delimiter, //delimiter 
             qualifier, //text qualfier 
             ignoreFirstRecord); 
    
          }catch (Exception e) { 
           if(LOG.isDebugEnabled()) 
            LOG.debug("Unable to read file: " + e); 
           throw new RuntimeException("File Parse exception"); 
          } 
          return result; 
         } 
        } 
    

    sampleFileFormat.xmlであるようなものです

<?xml version="1.0" encoding="UTF-8"?> 
    <!DOCTYPE PZMAP SYSTEM "flatpack.dtd" > 
    <PZMAP> 
     <COLUMN name="FIRSTNAME" /> 
     <COLUMN name="LASTNAME" /> 
    </PZMAP> 


and checkTransfomer is 


    public class checkTransfomer { 
     private static final Log LOG = LogFactory.getLog(checkTransfomer.class); 
     private CheckFlatPackCVSParserWrapper wrapper; 

     public String transform(String csv) { 
      Parser parser = wrapper.getParser(csv); 
      if(LOG.isDebugEnabled()) { 
       LOG.debug("Parser is: " + parser); 
      }   
      DataSet ds = parser.parse(); 
      ArrayList<Check> list = new ArrayList<Check>(); 
      while(ds.next()) { 
       Check check= new Check(); 
       check.setFirstName(ds.getString("FIRSTNAME")); 
       check.setLastName(ds.getString("LASTNAME")); 
       if(LOG.isDebugEnabled()) { 
        LOG.debug("Bean value is: " + bean); 
       }   
       list.add(bean);    
      } 
      if(LOG.isDebugEnabled()) { 
       LOG.debug("Records fetched is: " + list.size()); 
      }   
      return list.toString(); 
     } 

     public CheckFlatPackCVSParserWrapper getWrapper() { 
      return wrapper; 
     } 

     public void setWrapper(CheckFlatPackCVSParserWrapper wrapper) { 
      this.wrapper = wrapper; 
     } 

Er rorChannelWriterは

public class ErrorChannelWriter { 

     public static final Log LOG = LogFactory.getLog(ErrorChannelWriter.class); 

     public Message<?> transformError(ErrorMessage errorMessage) { 
      if (LOG.isDebugEnabled()) { 
       LOG.debug("Transforming errorMessage is: " + errorMessage); 
      } 
      return ((MessagingException) errorMessage.getPayload()) 
        .getFailedMessage(); 
     } 
     } 

で、私のvalidagtionクラスが

com.check.Validation 

    public class Validation 
    { 

    void validation(CheckCheck) 
    { 
    if(Check.getFirstName().equals("maya")) 
    { 
    throw new RuntimeException("Name Already exist"); 
    } 



    } 

    } 

で、私のListToStringTransfomerが

 public class ListToStringTransfomer { 
     private static final Log LOG=LogFactory.getLog(ListToStringTransfomer.class); 


     public String transformList(List<IssueAppBean> list) { 
      return list.toString(); 
     } 

    } 

、代わりに二つのフィールドここ

> maya 

の一つのフィールドを含む私のファイルですじぶんの ファイル形式が間違っているため、レコードがエラーフォルダに移動していますが、エラーメッセージは表示されません。私のファイル形式が間違っている場合、どうすればエラーメッセージ(TOO FEW COLUMNS WANTED:2 GOT:1)を追加できますか? は私の要件は、私のエラーファイルであるcontaionすべき

マヤ-TOOいくつかの列は、WANTED:2 GOT:1または(すべてのエラーメッセージ)

は私にすべてのソリューション

+0

ロギングが設定されていて、 'LOG.debug'という結果が表示される場合は、単に 'LOG.WARN'を使用することができます。ただし、ロギングだけはエラーをどのように処理したいかによって異なります。 Springの問題ではなく、エラー処理を追加していないだけです。 – Shahzeb

+0

こんにちはShahzeb、本当にありがとう、私はErrorChannelWriterクラスでエラー処理することができます –

答えて

1

Iドンを与えてくださいこの要件を解決するには、エラーチャネルを通過する必要があると思います。この主な理由は、この場合無効な入力が予想されるシナリオであることです。 errorChannelは、予期しない例外がエンドポイントで発生した場合にSpring Integrationがメッセージを送信するチャネルです。

検証に失敗した場合にメッセージにヘッダーを追加すると、そのヘッダーに基づいてルーティングし、そこに失敗メッセージを記録することができます。その後、エラーメッセージをログファイルなどに送信することができます。