Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Email 消息通道是一个还是多个?_Email_Spring Boot_Spring Integration_Channel - Fatal编程技术网

Email 消息通道是一个还是多个?

Email 消息通道是一个还是多个?,email,spring-boot,spring-integration,channel,Email,Spring Boot,Spring Integration,Channel,我需要处理大约30个地址的电子邮件。我实现这一点的方式是,所有电子邮件都发送到一个DirectChannel,然后发送到Receiver。在Receiver中,我可以理解消息来自哪个地址,为此我创建了CustomMessageSource,它将javax.mail.message包装成我自己的类型,其中包含javax.mail.message和一些Enum。看起来这不是一个好的决定,因为我可以使用@Transformer,但是如果我只有一个通道,我如何使用它呢 这是第一个问题 第二个问题: 我应

我需要处理大约30个地址的电子邮件。我实现这一点的方式是,所有电子邮件都发送到一个
DirectChannel
,然后发送到
Receiver
。在
Receiver
中,我可以理解消息来自哪个地址,为此我创建了
CustomMessageSource
,它将
javax.mail.message
包装成我自己的类型,其中包含
javax.mail.message
和一些
Enum
。看起来这不是一个好的决定,因为我可以使用
@Transformer
,但是如果我只有一个通道,我如何使用它呢

这是第一个问题

第二个问题:

我应该为所有这些地址使用一个通道和一个接收器吗?或者为每个邮件地址设置频道和接收者更好?我对春天的理解如此之深,以至于感觉不到它的不同


p、 这个问题是

的延续。在每个子上下文中,您可以添加一个标题充实器,以从适配器为URL设置自定义标题;输出通道是共享服务的共享通道

在服务中,使用void foo(Message emailMessage,@Header(“myHeader”)字符串url)

我通常建议使用单个服务,除非该服务需要根据源代码执行完全不同的操作

编辑

我修改了我对你上一个问题的回答,用标题中的url来增强原始消息;每个实例都有自己的头enricher,它们都将经过充实的消息路由到公共
电子邮件频道

@Configuration
@EnableIntegration
public class GeneralImapAdapter {

    @Value("${imap.url}")
    String imapUrl;

    @Bean
    public static PropertySourcesPlaceholderConfigurer pspc() {
        return new PropertySourcesPlaceholderConfigurer();
    }

    @Bean
    @InboundChannelAdapter(value = "enrichHeadersChannel", poller = @Poller(fixedDelay = "10000") )
    public MessageSource<javax.mail.Message> mailMessageSource(MailReceiver imapMailReceiver) {
        return new MailReceivingMessageSource(imapMailReceiver);
    }

    @Bean
    public MessageChannel enrichHeadersChannel() {
        return new DirectChannel();
    }

    @Bean
    @Transformer(inputChannel="enrichHeadersChannel", outputChannel="emailChannel")
    public HeaderEnricher enrichHeaders() {
        Map<String, ? extends HeaderValueMessageProcessor<?>> headersToAdd =
                Collections.singletonMap("emailUrl", new StaticHeaderValueMessageProcessor<>(this.imapUrl));
        HeaderEnricher enricher = new HeaderEnricher(headersToAdd);
        return enricher;
    }

    @Bean
    public MailReceiver imapMailReceiver() {
        MailReceiver receiver = mock(MailReceiver.class);
        Message message = mock(Message.class);
        when(message.toString()).thenReturn("Message from " + this.imapUrl);
        Message[] messages = new Message[] {message};
        try {
            when(receiver.receive()).thenReturn(messages);
        }
        catch (MessagingException e) {
            e.printStackTrace();
        }
        return receiver;
    }

}
…希望这有帮助

编辑2

而这个更复杂一点;它从有效载荷中提取数据并将其放入收割台中;不需要为您的用例,因为您有完整的消息,但它说明了技术

@Bean
@Transformer(inputChannel="enrichHeadersChannel", outputChannel="emailChannel")
public HeaderEnricher enrichHeaders() {
    Map<String, HeaderValueMessageProcessor<?>> headersToAdd = new HashMap<>();
    headersToAdd.put("emailUrl", new StaticHeaderValueMessageProcessor<String>(this.imapUrl));
    Expression expression = new SpelExpressionParser().parseExpression("payload.from[0].toString()");
    headersToAdd.put("from", new ExpressionEvaluatingHeaderValueMessageProcessor<>(expression, String.class));
    HeaderEnricher enricher = new HeaderEnricher(headersToAdd);
    return enricher;
}

再次感谢你的回答!如果我理解正确,我应该创建一个公共输出通道和许多输入通道?如果您能为您的建议编写一些代码,那将非常棒,因为我是Spring的新手,不知道如何使用
@Header
以及如何使用
输入通道。看起来我不需要这里的
@Transformer
?请参阅我的编辑;我不能一直为您编写代码,但我们确实认识到,当使用Java而不是XML配置组件时,文档有点轻;我们正在改进这方面的文档。在回答您的“我不需要
@Transformer
”评论时,标题enricher是一种Transformer。
@Bean
@Transformer(inputChannel="enrichHeadersChannel", outputChannel="emailChannel")
public HeaderEnricher enrichHeaders() {
    Map<String, HeaderValueMessageProcessor<?>> headersToAdd = new HashMap<>();
    headersToAdd.put("emailUrl", new StaticHeaderValueMessageProcessor<String>(this.imapUrl));
    Expression expression = new SpelExpressionParser().parseExpression("payload.from[0].toString()");
    headersToAdd.put("from", new ExpressionEvaluatingHeaderValueMessageProcessor<>(expression, String.class));
    HeaderEnricher enricher = new HeaderEnricher(headersToAdd);
    return enricher;
}
@ServiceActivator(inputChannel="emailChannel")
public void handleMessage(Message message, @Header("emailUrl") String url,
                                           @Header("from") String from) {
    System.out.println(message + " header:" + url + " from:" + from);
}