首页 > 解决方案 > ServiceActivator 没有收到来自 ImapIdleChannelAdapter 的消息

问题描述

ServiceActivator 没有收到来自 ImapIdleChannelAdapter 的消息...

JavaMail 记录成功的 FETCH,但 MIME 消息没有传递到 SA 端点......我想了解我的代码有什么问题。

A7 FETCH 1:35 (ENVELOPE INTERNALDATE RFC822.SIZE FLAGS BODYSTRUCTURE) * 1 FETCH (ENVELOPE ("Fri....

下面的代码片段:` @Autowired EmailConfig emailCfg;

@Bean
public SubscribableChannel mailChannel() {
    return MessageChannels.direct().get();
}

@Bean
public ImapIdleChannelAdapter getMailAdapter() {
    ImapMailReceiver mailReceiver = new ImapMailReceiver(emailCfg.getImapUrl());
    mailReceiver.setJavaMailProperties(javaMailProperties());
    mailReceiver.setShouldDeleteMessages(false);
    mailReceiver.setShouldMarkMessagesAsRead(true);
    ImapIdleChannelAdapter imapIdleChannelAdapter = new ImapIdleChannelAdapter(mailReceiver);
    imapIdleChannelAdapter.setOutputChannel(mailChannel());
    imapIdleChannelAdapter.setAutoStartup(true);
    imapIdleChannelAdapter.afterPropertiesSet();
    return imapIdleChannelAdapter;
}

@ServiceActivator(inputChannel = "mailChannel")
public void receive(String mail) {
    log.warn(mail);
}

private Properties javaMailProperties() {
    Properties javaMailProperties = new Properties();
    javaMailProperties.setProperty("mail.imap.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
    javaMailProperties.setProperty("mail.imap.socketFactory.fallback", "false");
    javaMailProperties.setProperty("mail.store.protocol", "imaps");
    javaMailProperties.setProperty("mail.debug", "true");
    javaMailProperties.setProperty("mail.imap.ssl", "true");
    return javaMailProperties;
}

`

问题是由于错误的 bean 初始化。可以正常工作的完整版:

@Slf4j
@Configuration
@EnableIntegration
public class MyMailAdapter {

@Autowired
EmailConfig emailCfg;

@Bean
public SubscribableChannel mailChannel() {
    log.info("Channel ready");
    return MessageChannels.direct().get();
}

@Bean
public ImapMailReceiver receiver() {
    ImapMailReceiver mailReceiver = new ImapMailReceiver(emailCfg.getImapUrl());
    mailReceiver.setJavaMailProperties(javaMailProperties());
    mailReceiver.setShouldDeleteMessages(false);
    mailReceiver.setShouldMarkMessagesAsRead(true);
    return mailReceiver;
}

@Bean
public ImapIdleChannelAdapter adapter() {
    ImapIdleChannelAdapter imapIdleChannelAdapter = new ImapIdleChannelAdapter(receiver());
    imapIdleChannelAdapter.setOutputChannel(mailChannel());
    imapIdleChannelAdapter.afterPropertiesSet();
    return imapIdleChannelAdapter;
}

@ServiceActivator(inputChannel = "mailChannel")
public void receive(Message<MimeMessage> mail) throws MessagingException {
    log.info(mail.getPayload().toString());
}

private Properties javaMailProperties() {
    Properties javaMailProperties = new Properties();
    javaMailProperties.setProperty("mail.imap.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
    javaMailProperties.setProperty("mail.imap.socketFactory.fallback", "false");
    javaMailProperties.setProperty("mail.store.protocol", "imaps");
    javaMailProperties.setProperty("mail.debug", "true");
    javaMailProperties.setProperty("mail.imap.ssl", "true");
    return javaMailProperties;
}
}

标签: spring-integration

解决方案


我不知道你的代码到底有什么问题,但我会建议你一些可以帮助你的方法。

  1. 首先,我建议您在基于 java 的配置中使用 java DSL。它将为您提供直接特定集成应用程序流程的好方法(并避免简单的错误)。例如对于拆分器和服务激活器:

    @Bean
    public IntegrationFlow yourFlow(AbstractMessageSplitter splitter,  
    MessageHandler handler) {
    return 
    IntegrationFlows
        .from(CHANNEL)
        .split(splitter)
        .handle(handler).get();
    

    }

  2. 其次,直接将消息类型指定为字符串通常是个坏主意。尝试这样的事情(为什么是字符串?):

    @ServiceActivator(inputChannel = "mailChannel")
    public void receive(Message<?> message) {
    /* (String) message.getPayload() */
    }
    

也许这不是一个案例,但让我们检查一下。


推荐阅读