2011-09-15 5 views
1

나는 봄 Integeration.I에 새로운 오전이봄 integeration - 오류 채널 처리는

  1. 몇 가지 검증을
  2. (소스 폴더에서) TXT 파일을 읽을 스프링 integeration를 사용하여 하나 개의 요구 사항이 발행
  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 is

<?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 몇 개 열에 구함 : 2 GOT : 1 (오류 메시지)

것은 나에게 모든 솔루션

+0

로깅이 구성되어 있고 'LOG.debug'결과를 볼 수있는 경우 'LOG.WARN'을 사용할 수 있습니다. 그러나 로깅 만하는 것은 오류를보고 싶은 위치에 따라 다릅니다.이 비트 당신은 오류 처리를 추가하지 않은 Spring 문제가 아니다. – Shahzeb

+0

안녕하세요 Shahzeb, 정말 통해 ur 회신 주셔서 감사합니다, 어떻게 ErrorChannelWriter 클래스에서 처리 오류가 있습니다 –

답변

1

내가 돈을주지하시기 바랍니다 이 요구 사항을 해결하기 위해 오류 채널을 통과해야한다고 생각하지 않습니다. 이것의 주된 이유는이 경우 잘못된 입력이 예상되는 시나리오라는 것입니다. errorChannel은 예기치 않은 예외가 엔드 포인트에서 발생할 경우 Spring Integration이 메시지를 보내는 채널입니다.

유효성 검사가 실패한 경우 메시지에 일부 헤더를 추가하면 해당 헤더를 기반으로 라우팅하고 거기에 실패 메시지를 기록 할 수 있습니다. 그런 다음 오류 메시지를 로그 파일이나 다른 것으로 보낼 수 있습니다.