2017-07-31 35 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。 –