Spring Integration中的日志记录过程,不使用xml文件

时间:2018-04-19 15:26:24

标签: spring spring-integration

我的目标是在不使用xml文件进行配置的情况下记录进程的时间。通过阅读其他帖子,我想出了在集成流程中丰富标题。这种方式有效,但不是出于正确的目的。对于每个新启动的进程,它在应用程序启动时给我一个startTime(即一个常量)。见下文:

@Bean
public IntegrationFlow processFileFlow() {
    return IntegrationFlows
        .from(FILE_CHANNEL_PROCESSING)
        .transform(fileToStringTransformer())
        .enrichHeaders(h -> h.header("startTime", String.valueOf(System.currentTimeMillis())))
        .handle(FILE_PROCESSOR, "processFile").get();
}

我的目标是在不使用上面提到的xml文件的情况下正确记录流程,但我没有设法做到这一点。我找到了一个例子,尝试使用ChannelInterceptorAdapter解决方案:

@Component(value = "integrationLoggingInterceptor")
public class IntegrationLoggingInterceptor extends ChannelInterceptorAdapter {

    private static final Logger log = LoggerFactory.getLogger(IntegrationLoggingInterceptor.class);

    @Override
    public void postSend(Message<?> message, MessageChannel channel, boolean sent) {
        log.debug("Post Send - Channel " + channel.getClass());
        log.debug("Post Send - Headers: " + message.getHeaders() + " Payload: " + message.getPayload() + " Message sent?: " + sent);
    }

    @Override
    public Message<?> postReceive(Message<?> message, MessageChannel channel) {
        try {
            log.debug("Post Receive - Channel " + channel.getClass());
            log.debug("Post Receive - Headers: " + message.getHeaders() + " Payload: " + message.getPayload());
        } catch (Exception ex) {
            log.error("Error in post receive : ", ex);
        }
        return message;
    }

}

但我根本没有收到任何日志。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

.enrichHeaders(h -> h.header("startTime", String.valueOf(System.currentTimeMillis())))属于这个:

public <V> HeaderEnricherSpec header(String name, V value, Boolean overwrite) {
    AbstractHeaderValueMessageProcessor<V> headerValueMessageProcessor =
            new StaticHeaderValueMessageProcessor<>(value);
    headerValueMessageProcessor.setOverwrite(overwrite);
    return header(name, headerValueMessageProcessor);
}

注意StaticHeaderValueMessageProcessor。所以,你展示的内容实际上是一个常数。

如果您需要为要处理的每封邮件计算一个值,则应考虑使用基于Function的变体:

.enrichHeaders(h -> 
               h.headerFunction("startTime", 
                        m -> String.valueOf(System.currentTimeMillis())))