Я довольно плохо знаком с 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