Я пытаюсь бесконечно получать письма от нескольких почтовых аккаунтов. Проблема здесь в том, что письма не получают параллельно. Если я отправляю почту на отслеживаемые учетные записи электронной почты, она бездействует только одна, а если перехватывает почту, она бездействует с другой.
Я попытался создать 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";
}
}
}
Вотпример моей проблемы
- Отправка почты в Testmail1 -> Приложение получает почту для Testmail1
- Повторная отправка почты в Testmail1 -> Приложение ничего не делает
- Отправка почтыto Testmail2 -> приложение получает почту для Testmail2 и после этого сразу же выбирает предыдущую отправленную почту для Testmail1
- Повторная отправка почты в 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 вместо этого, и есть та же проблема