私は春Integeration.Iに新しいですが、春integeration - エラーチャネル取り扱いは
- は、いくつかの検証を行う
- (ソースフォルダから)txtファイルを読み込むスプリングintegerationを使用して1つの要件が発行
- 場合(成功フォルダ内の)成功ファイルへの書き込み
- 検証が失敗ファイル(エラーフォルダ内)に失敗した場合
- ファイル形式が正しくない場合は、そのファイルを次のフォルダに移動する必要があります。エラーフォルダ(例:除外の列は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または(すべてのエラーメッセージ)
は私にすべてのソリューション
ロギングが設定されていて、 'LOG.debug'という結果が表示される場合は、単に 'LOG.WARN'を使用することができます。ただし、ロギングだけはエラーをどのように処理したいかによって異なります。 Springの問題ではなく、エラー処理を追加していないだけです。 – Shahzeb
こんにちはShahzeb、本当にありがとう、私はErrorChannelWriterクラスでエラー処理することができます –