Spring Integration - Динамическая настройка MailReceiver - PullRequest
0 голосов
/ 20 апреля 2019

Я довольно плохо знаком с spring-integration В любом случае, я использую его для того, чтобы получать письма и разрабатывать их.

Я использовал этот класс конфигурации пружины:

@Configuration
@EnableIntegration
@PropertySource(value = { "classpath:configuration.properties" }, encoding = "UTF-8", ignoreResourceNotFound = false)
public class MailReceiverConfiguration {

    private static final Log logger = LogFactory.getLog(MailReceiverConfiguration.class);

    @Autowired
    private EmailTransformerService emailTransformerService;

    // Configurazione AE
    @Bean
    public MessageChannel inboundChannelAE() {
        return new DirectChannel();
    }

    @Bean(name= {"aeProps"})
    public Properties aeProps() {
        Properties javaMailPropertiesAE = new Properties();
        javaMailPropertiesAE.put("mail.store.protocol", "imap");
        javaMailPropertiesAE.put("mail.debug", Boolean.TRUE);
        javaMailPropertiesAE.put("mail.auth.debug", Boolean.TRUE);
        javaMailPropertiesAE.put("mail.smtp.socketFactory.fallback", "false");
        javaMailPropertiesAE.put("mail.imap.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        return javaMailPropertiesAE;
    }
    @Bean(name="mailReceiverAE")
    public MailReceiver mailReceiverAE(@Autowired MailConfigurationBean mcb, @Autowired @Qualifier("aeProps") Properties javaMailPropertiesAE) throws Exception {

        return ConfigurationUtil.getMailReceiver("imap://USERNAME:PASSWORD@MAILSERVER:PORT/INBOX", new BigDecimal(2), javaMailPropertiesAE);
    }

    @Bean
    @InboundChannelAdapter( autoStartup = "true", 
                            channel = "inboundChannelAE", 
                            poller = {@Poller(fixedRate = "${fixed.rate.ae}", 
                            maxMessagesPerPoll = "${max.messages.per.poll.ae}") })
    public MailReceivingMessageSource pollForEmailAE(@Autowired MailReceiver mailReceiverAE) {
        MailReceivingMessageSource mrms = new MailReceivingMessageSource(mailReceiverAE);
        return mrms;
    }

    @Transformer(inputChannel = "inboundChannelAE", outputChannel = "transformerChannelAE")
    public MessageBean transformitAE( MimeMessage mailMessage ) throws Exception {
        // amministratore email inbox
        MessageBean messageBean = emailTransformerService.transformit(mailMessage);
        return messageBean;
    }

    @Splitter(inputChannel = "transformerChannelAE", outputChannel = "nullChannel")
    public List<Message<?>> splitIntoMessagesAE(final MessageBean mb) {

        final List<Message<?>> messages = new ArrayList<Message<?>>();

        for (EmailFragment emailFragment : mb.getEmailFragments()) {
            Message<?> message = MessageBuilder.withPayload(emailFragment.getData())
                    .setHeader(FileHeaders.FILENAME, emailFragment.getFilename())
                    .setHeader("directory", emailFragment.getDirectory()).build();
            messages.add(message);
        }

        return messages;
    }
}

Пока все хорошо .... Я запускаю свой микросервис, и этот компонент прослушивает указанный почтовый сервер, и почта загружается.

Теперь у меня есть это требование: конфигурация почтового сервера (я имею в виду строку "imap://USERNAME:PASSWORD@MAILSERVER:PORT/INBOX") должна быть взята из базы данных, и ее можно настраивать. В любое время системный администратор может изменить его, и получатель почты должен использовать новую конфигурацию.

Насколько я понял, я должен создать новый экземпляр MailReceiver при наличии новой конфигурации и использовать его в InboundChannelAdapter

Есть ли лучшая практика для этого? Я нашел это решение: ImapMailReceiver НЕТ ХРАНЕНИЯ попытки сохранения в папке READ-ONLY (Ошибка) [THROTTLED];

В этом решении я могу внедрить ThreadPoolTaskScheduler, если я определю его в своем классе конфигурации; Я также могу ввести DirectChannel, но каждый раз, когда мне нужно создать новый MailReceiver и новый ImapIdleChannelAdapter, не учитывая это сообщение WARN, которое я получаю, когда

ImapIdleChannelAdapter starts:
java.lang.RuntimeException: No beanfactory at org.springframework.integration.expression.ExpressionUtils.createStandardEvaluationContext(ExpressionUtils.java:79) at org.springframework.integration.mail.AbstractMailReceiver.onInit(AbstractMailReceiver.java:403)

Есть ли лучший способ удовлетворить мой сценарий?

спасибо Angelo

1 Ответ

0 голосов
/ 22 апреля 2019

Лучший способ сделать это - использовать Java DSL и динамическую регистрацию потока.

Документация здесь .

Таким образом, вы можете отменить регистрацию старого потокаи регистрируйте новый, каждый раз, когда изменяется конфигурация.

Он будет автоматически обрабатывать инъекционные зависимости, такие как фабрика бобов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...