spring-integration - 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;
}
}
解决方案
我不知道你的代码到底有什么问题,但我会建议你一些可以帮助你的方法。
首先,我建议您在基于 java 的配置中使用 java DSL。它将为您提供直接特定集成应用程序流程的好方法(并避免简单的错误)。例如对于拆分器和服务激活器:
@Bean public IntegrationFlow yourFlow(AbstractMessageSplitter splitter, MessageHandler handler) { return IntegrationFlows .from(CHANNEL) .split(splitter) .handle(handler).get();
}
其次,直接将消息类型指定为字符串通常是个坏主意。尝试这样的事情(为什么是字符串?):
@ServiceActivator(inputChannel = "mailChannel") public void receive(Message<?> message) { /* (String) message.getPayload() */ }
也许这不是一个案例,但让我们检查一下。
推荐阅读
- php - jQuery Ajax 调用在服务器上出现内部服务器错误,但在 Localhost 上有效
- java - Hibernate 一对多关系
- java - 比较 Jsch Java 中上传和下载的文件
- php - 在 PHP 类路由器中添加 404 规则
- python - 保留满足条件的行和相邻行
- javascript - 如何在 JavaScript 中获取最近的 span 元素
- c++ - 为什么“size_type”变量的地址在 C++ 中用作“stoi()”的参数?
- linux - 错误:esys:src/tss2-esys/api/Esys_CreatePrimary.c:135:Esys_CreatePrimary() Esys 完成错误代码 (0x000009a2)
- python - CNN:哪个频道提供的信息最多?
- css - 在tailwindcss中具有不透明度的背景图像