spring message将消息传递给频道

时间:2016-10-18 19:25:14

标签: spring-integration

我正在尝试使用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();
    }

使用上面的代码,问题是将从电子邮件(有效负载)读取的内容传递给sendEmailChannel。目前,parseEmail(Boolean)的输出将转到频道。你能告诉你完成它的方法吗?仍然无法想出如何解决这个问题

UPDATE1:

@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();
    }

我按照建议将有效负载添加到标头中,但无法找出转换以从标头设置有效负载。但即使我在路由之前将其设置回有效载荷,它是否会打破流量?因为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 个答案:

答案 0 :(得分:1)

使用标头集合器来保存标头中的原始有效负载(标头名称= saved表达式= payload),然后在解析器之后将变换器移回到paylaod(表达式= { {1}})。