ServiceActivator不会从ImapIdleChannelAdapter接收消息

时间:2018-06-15 07:46:42

标签: spring-integration

ServiceActivator不接收来自ImapIdleChannelAdapter ...

的消息

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

$this->form_validation->set_rules('codetype', 'Code Type', array( 'required', array( 'codecheck_callable', function($str) { // Check validity of $str and return TRUE or FALSE if ($str == 'test') { $this->form_validation->set_message('codecheck_callable', 'can not be test'); return false; } else { return TRUE; } } ) ) );

以下代码段: `     @Autowired     EmailConfig emailCfg;

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

`

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

@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;
}

1 个答案:

答案 0 :(得分:1)

我不知道您的代码究竟有什么问题,但我会建议您使用一些可以帮助您的方法。

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

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

    }

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

    @ServiceActivator(inputChannel = "mailChannel")
    public void receive(Message<?> message) {
    /* (String) message.getPayload() */
    }
    
  3. 也许这不是一个案例,但让我们检查一下。