Неиспользуемые учетные записи электронной почты в Spring и IMAP - PullRequest
0 голосов
/ 07 октября 2019

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

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

Где я запускаю задачу

@Configuration
@EnableAutoConfiguration
@ComponentScan
@EnableScheduling
@EnableAsync
public class MailApplication{

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(MailApplication.class, args);
        try {
            String[] accounts = {"testmail1%40web.de:123456", "testmail2%40web.de:123456"};
            context.getBean(MailGuard.class).start(accounts);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Мой класс задач

@Component
public class MailGuard {

    @Autowired
    private IntegrationFlowContext flowContext;

    private static final Logger log = LoggerFactory.getLogger(MailGuard.class);
    private TaskScheduler scheduler;

    @Async
    public void start(String[] data) {
        ScheduledExecutorService localExecutor = Executors.newScheduledThreadPool(2);
        scheduler = new ConcurrentTaskScheduler(localExecutor);

        for(String acc : data) {
            scheduler.schedule(new MailRunnable(acc, flowContext),
                        new Date());

        }


    }

    class MailRunnable implements Runnable {
        String account;
        IntegrationFlowContext flowContext;

        MailRunnable(String account, IntegrationFlowContext flowContext) {
            this.account = account;
            this.flowContext = flowContext;
        }

        public void run() {
            String[] split = account.split(":");
            startMail(split[0], split[1]);
            log.info("started mail monitoring for: " + split[0]);
        }


        public void startMail(String user, String pw) {
            IntegrationFlow flow = IntegrationFlows
                    .from(Mail.imapIdleAdapter(imapUrl(user, pw))
                            .javaMailProperties(p -> {
                                p.put("mail.imap.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
                                p.put("mail.store.protocol", "imaps");
                                p.put("mail.debug", "false");
                                p.put("mail.imaps.timout", "100");
                            })
                            .shouldDeleteMessages(true)
                            .shouldReconnectAutomatically(true)
                            .selectorExpression(new SpelExpressionParser()
                            .headerMapper(new DefaultMailHeaderMapper()))
                    .handle(this::handle)
                    .get();
            this.flowContext.registration(flow).register();
        }

        private <P> Object handle(P p, MessageHeaders messageHeaders) {
            System.out.println(messageHeaders.get("mail_from"));
            return null;
        }

        private String imapUrl(String user, String pw) {

            return "imap://"
                    + user + ":" + pw
                    + "@imap.web.de:993/INBOX";
        }

    }
}

Вотпример моей проблемы

  1. Отправка почты в Testmail1 -> Приложение получает почту для Testmail1
  2. Повторная отправка почты в Testmail1 -> Приложение ничего не делает
  3. Отправка почтыto Testmail2 -> приложение получает почту для Testmail2 и после этого сразу же выбирает предыдущую отправленную почту для Testmail1
  4. Повторная отправка почты в Testmail2 -> Приложение ничего не делает

Так что каким-то образом оно простаиваетв определенном порядке, а не параллельно


Выполнение задачи без модели imap

Я хотел выяснить, почему это не работает параллельно ... Итак, сначалая тыGHT его, потому что исполнитель и threadpools, но это не так. Я попытался удалить часть, где я регистрирую новый IntegrationFlow, и заменить его system.out.println в бесконечном цикле с отметкой времени, подобной этой

    class MailRunnable implements Runnable {
        String account;
        IntegrationFlowContext flowContext;
        MailRunnable(String account, IntegrationFlowContext flowContext) {
            this.account = account;
            this.flowContext = flowContext;
        }
        public void run() {
                String split[] = account.split(":");
                startMail(split[0], split[1]);
                log.info("started mail monitoring for: "+split[0]);
        }


        public void startMail(String user, String pw) {
            while(true) {
                try {
                    System.out.println(user+" - "+new Date().toGMTString());
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }

Выходные данные:

testmail1%40web.de - 11 Oct 2019 17:13:49 GMT
testmail2%40web.de - 11 Oct 2019 17:13:49 GMT
testmail1%40web.de - 11 Oct 2019 17:13:59 GMT
testmail2%40web.de - 11 Oct 2019 17:13:59 GMT
testmail2%40web.de - 11 Oct 2019 17:14:09 GMT
testmail1%40web.de - 11 Oct 2019 17:14:09 GMT

Так что это, кажется, работает нормально. Что-то не так с реестром? Я также пытался избежать использования IDLE и использовал поллер с intervall вместо этого, и есть та же проблема

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