Асинхронный прием почты с интеграцией Spring Boot и Spring - PullRequest
1 голос
/ 13 января 2020

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

Я совсем новичок в весенней интеграции, и я не до конца понимаю, как она работает или она правильная.

1) Пока у меня есть этот код - Я могу прочитать все электронные письма, но я не уверен, обрабатываются ли они асинхронно или нет, или это правильный путь?

ListeningExample class

@Configuration
public class ListeningExample {

    @Bean
    public HeaderMapper<MimeMessage> mailHeaderMapper() {
        return new DefaultMailHeaderMapper();
    }

    @Bean
    public IntegrationFlow imapMailFlow() {    
        IntegrationFlow flow =  IntegrationFlows
                .from(Mail.imapInboundAdapter("imap://user:pwd@imap.gmail.com/INBOX")
                                .userFlag("testSIUserFlag")
                                .javaMailProperties(javaMailProperties()),
                        e -> e.autoStartup(true)
                                .poller(p -> p.fixedDelay(5000)))dostane to detailni zpravy
                .transform(Mail.toStringTransformer())
                .channel(MessageChannels.queue("imapChannel"))
                .get();
        return flow;
     }

    @Bean(name = PollerMetadata.DEFAULT_POLLER)
    public PollerMetadata defaultPoller() {

        PollerMetadata pollerMetadata = new PollerMetadata();
        pollerMetadata.setTrigger(new PeriodicTrigger(1000));
        return pollerMetadata;
    }
}

MailRecieverService class

@Service
public class MailRecieverService {

    private List<EmailAction> services;

    @Bean
    @ServiceActivator(inputChannel = "imapChannel")
    public MessageHandler processNewEmail() {
        MessageHandler messageHandler = new MessageHandler() {

            @Override
            public void handleMessage(org.springframework.messaging.Message<?> message) throws MessagingException {
                System.out.println("New email:" + message.toString());

                //Processing emails do with them something..
                for (EmailAction emailAction : services) {
                    emailAction.performAction(null);
                }

            }
        };
        return messageHandler;
    }

}

Основной класс

@SpringBootApplication
@EnableIntegration
public class Main extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Main.class);
    }


    public static void main(String[] args) throws Exception {
        SpringApplicationBuilder builder = new SpringApplicationBuilder(Main.class);
        builder.headless(false).run(args);
    }

}

2) Есть ли возможность в весенней загрузке перемещать / удалять электронные письма, создавать папки, и выполняете ли другие действия с учетной записью электронной почты или мне нужно использовать библиотеку javax.mail самостоятельно? Если да, не могли бы вы привести несколько примеров?

1 Ответ

0 голосов
/ 13 января 2020

Ваш поток интеграции правильный. Адаптер входящего канала IMAP по своей природе является асин c и порождает поток для l oop новых сообщений. Однако, если вы беспокоитесь о своем for (EmailAction emailAction : services) {, вам следует подумать о том, чтобы сделать эту часть asyn c самостоятельно. Вы определенно можете использовать PublishSubscribeChannel с Executor и несколькими подписчиками для этих служб, чтобы действительно обрабатывать одно и то же сообщение электронной почты в этих службах параллельно.

Все остальные вещи, касающиеся удаления, создания и другого управления электронной почтой операции выходят за рамки шаблонов интеграции предприятия. Поэтому не существует высокоуровневого Spring API для выполнения этих операций из приложения. Попробуйте использовать Java Mail API напрямую: https://javaee.github.io/javamail/#Project_Documentation

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