1

私はSpring Integrationの初心者です.Spring Integrationを使用するという要件が1つあります

  1. txt ファイルを読み取ります (ソース フォルダーから)
  2. いくつかの検証を行います
  3. 検証が成功した場合 - sucess ファイル (success フォルダー内) に書き込む
  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;
        }

そして、私の ErrorChannelWriter は

    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();
        }
        }

そして私の検証クラスは

  com.check.Validation

  public class Validation 
  {

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



  }

  }

そして私の ListToStringTransformer は

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


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

    }

私のファイルには2つのフィールドではなく1つのフィールドが含まれています

> maya 

ここでファイル形式が間違っているため、レコードはエラー フォルダーに移動されますが、エラー メッセージは表示されません。ファイル形式が正しくない場合にエラー メッセージ (TOO FEW COLUMNS WANTED: 2 GOT: 1) を追加するにはどうすればよいですか。私の要件は私のエラーファイルにあります

maya -TOO FEW COLUMNS WANTED: 2 GOT: 1 or(任意のエラー メッセージ)

解決策を教えてください

4

1 に答える 1

1

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

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

于 2011-12-20T15:03:24.900 に答える