Получать почту с помощью Spring Integration? - PullRequest
0 голосов
/ 22 февраля 2020

У меня есть простой проект в весенней интеграции, который пытается получить почту:

@Service
public class MailReceiverService implements CommandLineRunner {

    @Bean
    TestMailServer.ImapServer imapServer() {
        return TestMailServer.imap(0);
    }

    private static Log logger = LogFactory.getLog(MailReceiverService.class);

    public static void manageMessage() {

    @SuppressWarnings("resource")
    ClassPathXmlApplicationContext ac =
        new ClassPathXmlApplicationContext(
            "/integration/gmail-imap-idle-config.xml");
    DirectChannel inputChannel = ac.getBean("receiveChannel", DirectChannel.class);


            inputChannel.subscribe(message -> {
                logger.info("Message: " + message);
            });



  }

    @Override
    public void run(String... args) {
        manageMessage();
    }


}

gmail-imap-idle-config. xml выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/integration https://www.springframework.org/schema/integration/spring-integration.xsd
        http://www.springframework.org/schema/integration/mail https://www.springframework.org/schema/integration/mail/spring-integration-mail.xsd
        http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd"
    xmlns:int="http://www.springframework.org/schema/integration"
    xmlns:int-mail="http://www.springframework.org/schema/integration/mail"
    xmlns:util="http://www.springframework.org/schema/util">

    <int:channel id="receiveChannel" />
    <int-mail:imap-idle-channel-adapter id="customAdapter"
            store-uri="imaps://username:password@imap.gmail.com:993/inbox"
            channel="receiveChannel"
            auto-startup="true"
            should-delete-messages="false"
            should-mark-messages-as-read="false"
            java-mail-properties="javaMailProperties"/>

    <util:properties id="javaMailProperties">
        <prop key="mail.imap.socketFactory.class">javax.net.ssl.SSLSocketFactory</prop>
        <prop key="mail.imap.socketFactory.fallback">false</prop>
        <prop key="mail.store.protocol">imaps</prop>
        <prop key="mail.debug">false</prop>
    </util:properties>

</beans>

Однако, когда я запускаю его, я получаю это сообщение:

Канал 'application.errorChannel' имеет 0 подписчиков. остановленный компонент '_org.springframework.integration.errorLogger'

И он отключается! какие-либо предложения о том, как заставить это работать? Спасибо!

1 Ответ

0 голосов
/ 24 февраля 2020

Ваша проблема в том, что вы не поддерживаете приложение. <int-mail:imap-idle-channel-adapter> запускает длительный процесс в фоновом режиме. Но когда вы запускаете свое приложение, вы немедленно отходите от основного потока, и тот просто выходит. Тем временем вы получаете сообщение из ящика электронной почты, но подписчик на receiveChannel уже ушел, потому что ваше приложение находится в состоянии закрытия в соответствии с поведением основного потока. * не основной поток для выхода.

В примерах у нас обычно есть что-то вроде этого:

System.out.println("Hit 'Enter' to terminate");
System.in.read();
ctx.close();

Таким образом, вы не позволите JVM выйти и, следовательно, будете получать электронные письма до вы прекращаете работу приложения.

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