提问者:小点点

Spring积分向通道传递消息


我正在尝试使用Spring集成来接收电子邮件,解析它以调用服务,然后有条件地转发相同的电子邮件。我能够阅读、解析和发送电子邮件,但不能转发内容

@Bean
    @Value("${imap.url}")
    public IntegrationFlow mailListener( String imapUrl) {
        return IntegrationFlows
                .from(s -> s.imap(imapUrl)
                                .searchTermStrategy((f,l) -> fromAndNotSeenTerm())
                                .javaMailProperties(p -> p.put("mail.debug", "false")),
                        e -> e.autoStartup(true)
                                .poller(p -> p.fixedDelay(10000)))
                .handle(Message.class, (payload, header) -> parseEmail(payload))
                .<Boolean, Boolean>route(p -> p,
                    m -> m.channelMapping("true", "sendMailChannel")
                          .channelMapping("false", "nullChannel"))
                .get();
    }


@Bean
    public IntegrationFlow sendMailFlow() {
        return IntegrationFlows.from("sendMailChannel")
                .enrichHeaders(Mail.headers().subjectFunction(m->"Email SUbj").from("xyz@abc.com").toFunction(m -> new String[] { "abc@abc.com" }))
                .handle(Mail.outboundAdapter("smtp.host.net")
                                .port(25)
.protocol("smtp")
                                .javaMailProperties(p -> p.put("mail.debug", "true")))
                .get();
    }

使用上面的代码,问题是将从电子邮件(payload)读取的内容传递给sendEmailChannel。目前parseEmail(Boolean)的输出正在进入通道。您能建议如何完成它吗?仍然不知道如何解决这个问题

更新1:

@Bean
    @Value("${imap.url}")
    public IntegrationFlow mailListener( String imapUrl) {
        return IntegrationFlows
                .from(s -> s.imap(imapUrl)
                                .searchTermStrategy((f,l) -> fromAndNotSeenTerm())
                                .javaMailProperties(p -> p.put("mail.debug", "false")),
                        e -> e.autoStartup(true)
                                .poller(p -> p.fixedDelay(10000)))
                .enrichHeaders(s -> s.headerExpressions(h -> h
                        .put("saved", "payload")))
                .handle(Message.class, (payload, header) -> parseEmail(payload))
                .<Boolean, Boolean>route(p -> p,
                    m -> m.channelMapping("true", "sendMailChannel")
                          .channelMapping("false", "nullChannel"))
                .get();
    }

我按照建议将有效负载添加到header,但无法找出将有效负载从header设置回的转换。但是即使我在路由之前将其设置回有效负载,它也不会中断流程吗?因为parse方法(布尔)的输出应该驱动路由决策

最终更新

感谢Gary的帮助,我能够通过添加过滤器和转换使我的第一个集成流程工作

public IntegrationFlow mailListener( String imapUrl) {
    return IntegrationFlows
            .from(s -> s.imap(imapUrl)
                            .searchTermStrategy((f,l) -> fromAndNotSeenTerm())
                            .javaMailProperties(p -> p.put("mail.debug", "false")),
                    e -> e.autoStartup(true)
                            .poller(p -> p.fixedDelay(10000)))
            .enrichHeaders(s -> s.headerExpressions(h -> h
                    .put("saved", "payload")))
            .handle(Message.class, (payload, header) -> parseEmail(payload))
            .filter((Boolean p) -> p == true)
            .transform("headers['saved']")
            .channel(MessageChannels.queue("sendMailChannel"))
            .get();
}

共1个答案

匿名用户

使用标头增强器保存标头中的原始有效负载(标头名称=保存表达式=有效负载),然后在解析器之后使用转换器将其移回paylaod(表达式=标头['保存'])。