2017-07-31 82 views
0

工作這是我的春天整合案例:Spring集成頭富集做連鎖

1)FTP適配器下載PDF文件

2)pdf2TextTransformer轉換PDF使用PDFBOX

3文本)pdfText2CsvTransformer將文本轉換爲csv

我在鏈中添加了一個richter,但是,似乎header沒有傳播到myErrorChannel,任何人都可以告訴我爲什麼?

這裏是我的調試日誌,標題file_originalFile不會傳播到myErrorChannel

][Headers={file_originalFile=D:\projects\DMTP\ftp\local2\6000047256 - Copy - Copy.pdf, file_name=6000047256 - Copy - Copy.pdf, id=a091fe5e-83f3-e48c-4be5-927849dbf31a, timestamp=1501472718172}] 
11:45:18.180 DEBUG [task-scheduler-2][org.springframework.integration.channel.PublishSubscribeChannel] preSend on channel 'errorChannel', message: [Payload MessageTransformationException content=org.springframework.integration.transformer.MessageTransformationException: org.springframework.messaging.MessageHandlingException: java.lang.StringIndexOutOfBoundsException: String index out of range: -3][Headers={id=251c77f0-30e8-e18c-6980-ebfb289f79a4, timestamp=1501472718180}] 
11:45:18.180 DEBUG [task-scheduler-2][org.springframework.integration.handler.ServiceActivatingHandler] ServiceActivator for [org.spr[email protected]56eacc77] received message: [Payload MessageTransformationException content=org.springframework.integration.transformer.MessageTransformationException: org.springframework.messaging.MessageHandlingException: java.lang.StringIndexOutOfBoundsException: String index out of range: -3][Headers={id=251c77f0-30e8-e18c-6980-ebfb289f79a4, timestamp=1501472718180}] 
file_originalFile:null 
MessageHeaders: {id=251c77f0-30e8-e18c-6980-ebfb289f79a4, timestamp=1501472718180} 
MessagePayload: org.springframework.integration.transformer.MessageTransformationException: org.springframework.messaging.MessageHandlingException: java.lang.StringIndexOutOfBoundsException: String index out of range: -3 
11:45:18.182 DEBUG [task-scheduler-2][org.springframework.integration.handler.ServiceActivatingHandler] handler 'ServiceActivator for [org.spr[email protected]56eacc77]' produced no reply for request Message: [Payload MessageTransformationException content=org.springframework.integration.transformer.MessageTransformationException: org.springframework.messaging.MessageHandlingException: java.lang.StringIndexOutOfBoundsException: String index out of range: -3][Headers={id=251c77f0-30e8-e18c-6980-ebfb289f79a4, timestamp=1501472718180}] 

這裏是我的配置:

<bean id="ftpClientFactory" class="org.springframework.integration.ftp.session.DefaultFtpSessionFactory"> 
    <property name="host" value="${host}"/> 
    <property name="port" value="${availableServerPort}"/> 
    <property name="username" value="${userid}"/> 
    <property name="password" value="${password}"/> 
</bean> 

<bean id="cachingSessionFactory" class="org.springframework.integration.file.remote.session.CachingSessionFactory"> 
    <constructor-arg ref="ftpClientFactory"/> 
</bean> 
<int:channel id="ftpChannelIn"> 
    <int:queue capacity="1"/> 
</int:channel> 

<int-ftp:inbound-channel-adapter id="ftpInbound" 
           channel="ftpChannelIn" 
           session-factory="cachingSessionFactory" 
           filename-pattern="*.pdf" 
           auto-create-local-directory="true" 
           delete-remote-files="true" 
           remote-directory="/in2" 
           local-directory="D:/projects/DMTP/ftp/local2"> 
    <!--<int:poller fixed-rate="1000"/>--> 
    <int:poller fixed-delay="1"/> 
</int-ftp:inbound-channel-adapter> 

<int:chain input-channel="ftpChannelIn"> 
    <int:header-enricher> 
     <int:header name="foo" value="bar"/> 
    </int:header-enricher> 
    <file:file-to-bytes-transformer/> 
    <int:transformer ref="pdf2TextTransformer"/> 
    <int:transformer ref="pdfText2CsvTransformer"/> 
    <int-ftp:outbound-channel-adapter 
      remote-directory="/out" 
      session-factory="cachingSessionFactory" 
      remote-filename-generator="filenameGenerator"/> 
</int:chain> 


<int:channel id="ftpChannelOut"> 
</int:channel> 
<bean id="filenameGenerator" class="file.DatedDirectoryFactory "/> 
<int:poller default="true" fixed-delay="50"/> 
<int:channel id="myErrorChannel"/> 
<int:service-activator input-channel="errorChannel" ref="errorLogger"/> 

回答

2

ErrorMessage是建立在輪詢,它是基於異常的:

try { 
    getMessagingTemplate().send(errorChannel, getErrorMessageStrategy().buildErrorMessage(t, null)); 
      sent = true; 
} 

沒有關於原標題任何信息。

您的標題,特別是<int:header name="foo" value="bar"/>顯示在下游requestMessage。通常,當集成組件發生異常時,會拋出MessagingException。 你的情況是MessageTransformationException。這種異常有failedMessage屬性。這正是你的requestMessage錯誤中的「有罪」。而且,據你所知,已經在這裏你可以訪問你的標題 - MessagingException.getFailedMessage().getHeaders()get("foo")。當然,file_originalFile也可以在這裏使用。

1

如果你的變壓器正在返回Message<?>然後他們負責複製標題;該框架假定。如果您的轉換器是POJO,並且只返回轉換後的有效負載(推薦的編程模型),則框架將負責傳播標頭。

打開調試日誌記錄來檢查消息流;如果您仍然認爲它「不起作用」,請更詳細地解釋並編輯問題以顯示日誌。

順便說一句,「不起作用」不是對問題的充分描述。

+0

謝謝,Gary 我的轉換是POJO,並且我爲你的信息添加了我的調試日誌,你會幫助檢查爲什麼頭文件file_originalFile不會傳播到myErrorChannel? –

+0

另請參閱我的答案。 –

+0

嘆息;正如你所見,「不起作用」對問題的解釋完全不足;您現在添加了一個關於錯誤頻道的重要部分。永遠不要,永遠不要問「沒用」的問題,沒有進一步的解釋。謝謝@ArtemBilan。 –