Каналы сообщений один или много?

Мне нужно обрабатывать электронные письма примерно с 30 адресов. Я реализую это таким образом, чтобы все письма шли на один DirectChannel и после Receiver, В Receiver Я могу понять, с какого адреса приходит сообщение, для этого я создаю CustomMessageSource это обертывания javax.mail.Message к моему собственному типу, который содержит javax.mail.Message и немного Enum, Похоже, это не очень хорошее решение, потому что я могу использовать @Transformer, но как я могу использовать его, если у меня есть только 1 канал?

Это был первый вопрос.

Второй вопрос:

Должен ли я использовать один канал и один приемник для всех этих адресов? Или лучше иметь канал и получатель для каждого почтового адреса? Я не понимаю Весну так глубоко, чтобы почувствовать разницу.

ps этот вопрос является продолжением Spring для нескольких imapAdapter

1 ответ

Решение

В каждом дочернем контексте вы можете добавить улучшающий заголовок, чтобы задать настраиваемый заголовок для URL из адаптера; с выходным каналом, являющимся общим каналом для общего сервиса.

В сервисе используйте void foo(Message emailMessage, @Header("myHeader") String url)

Я бы вообще рекомендовал использовать один сервис, если сервис не должен делать радикально разные вещи в зависимости от источника.

РЕДАКТИРОВАТЬ:

Я изменил свой ответ на ваш предыдущий вопрос, чтобы улучшить исходное сообщение URL-адресом в заголовке; каждый экземпляр имеет свой собственный обогащенный заголовок, и все они направляют обогащенное сообщение к общему emailChannel,

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

}

... и я изменил получающий сервис, чтобы он получил доступ к заголовку...

@MessageEndpoint
public class EmailReceiverService {

    @ServiceActivator(inputChannel="emailChannel")
    public void handleMessage(Message message, @Header("emailUrl") String url) {
        System.out.println(message + " header:" + url);
    }

}

...надеюсь, это поможет.

РЕДАКТИРОВАТЬ 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;
}

а также

@ServiceActivator(inputChannel="emailChannel")
public void handleMessage(Message message, @Header("emailUrl") String url,
                                           @Header("from") String from) {
    System.out.println(message + " header:" + url + " from:" + from);
}
Другие вопросы по тегам