Это продолжение прослушивателя почты Java. с помощью Spring Integration: несколько экземпляров приложения не получают почту. Я использую ниже код ImapMailReceiver:
@Bean
public ImapMailReceiver receiver() {
ImapMailReceiver receiver = new ImapMailReceiver(
"imaps://username:[email protected]/INBOX");
receiver.setShouldMarkMessagesAsRead(false);
receiver.setSimpleContent(true);
receiver.setUserFlag("test-flag");
//receiver.setJavaMailProperties(javaMailProperties());
return receiver;
}
Мое приложение было развернуто на серверах разработки и стадии. Согласно журналам отладки: This email server does not support RECENT or USER flags
. Следовательно, любой пользовательский флаг, который я устанавливаю с помощью приведенного выше кода, бесполезен, и письма будут приниматься только одним экземпляром моего приложения (либо разработчиком, либо этапом), а не всеми экземплярами. Таким образом, письма удаляются одним экземпляром. Как заставить его работать так, чтобы все мои экземпляры приложения получали новые электронные письма? Должен ли я устанавливать какие-либо свойства javamail? Как заставить это работать
ОБНОВЛЕНИЕ используется ниже Custom searchTermStrategy. Для каждого опроса будет получен список новых сообщений + набор старых сообщений. Еще не тестировал на нескольких экземплярах приложения.
private class CustomSearchTermStrategy implements SearchTermStrategy {
CustomSearchTermStrategy() {
}
@Override
public SearchTerm generateSearchTerm(Flags supportedFlags, Folder folder) {
SearchTerm searchTerm = null;
boolean recentFlagSupported = false;
if (supportedFlags != null) {
recentFlagSupported = supportedFlags.contains(Flags.Flag.RECENT);
if (recentFlagSupported) {
searchTerm = new FlagTerm(new Flags(Flags.Flag.RECENT), true);
}
if (supportedFlags.contains(Flags.Flag.ANSWERED)) {
NotTerm notAnswered = new NotTerm(new FlagTerm(new Flags(Flags.Flag.ANSWERED), true));
if (searchTerm == null) {
searchTerm = notAnswered;
} else {
searchTerm = new AndTerm(searchTerm, notAnswered);
}
}
if (supportedFlags.contains(Flags.Flag.DELETED)) {
NotTerm notDeleted = new NotTerm(new FlagTerm(new Flags(Flags.Flag.DELETED), true));
if (searchTerm == null) {
searchTerm = notDeleted;
} else {
searchTerm = new AndTerm(searchTerm, notDeleted);
}
}
if (supportedFlags.contains(Flags.Flag.SEEN)) {
NotTerm notSeen = new NotTerm(new FlagTerm(new Flags(Flags.Flag.SEEN), true));
if (searchTerm == null) {
searchTerm = notSeen;
} else {
searchTerm = new AndTerm(searchTerm, notSeen);
}
}
}
// if (!recentFlagSupported) {
// searchTerm = applyTermsWhenNoRecentFlag(folder, searchTerm);
// }
return searchTerm;
}
}