以下情况。我有一个Spring-Boot应用程序,它处理两个主要功能。
1.通过IMAPS从服务器异步阅读电子邮件。(配置见下文)
1.提供生成和阅读order的API(这是我的业务对象)
问题是好奇的。如果我启动我的应用程序没有连接到IMAP和阅读电子邮件,我可以向我的API发出任何请求。但是在启动电子邮件连接和阅读电子邮件的情况下,我无法向我的API发出任何请求。
我总是收到以下错误:
Error: connect ECONNREFUSED 127.0.0.1:8081
字符串
有没有人可以帮助我,给予我一个建议,如何处理这个问题?
// Email Connection
Store store = null;
var props = new Properties();
props.setProperty("mail.store.protocol", mailProperties.getProtocol());
try {
var session = Session.getInstance(props, null);
store = session.getStore();
store.connect(
mailProperties.getHost(),
mailProperties.getUsername(),
decodeAsString(mailProperties.getPassword())
);
var inbox = store.getFolder("INBOX");
inbox.open(Folder.READ_WRITE);
waitForNewMessages(inbox);
...
inbox.addMessageCountListener(new MessageCountAdapter() {
@Override
@SneakyThrows
public void messagesAdded(MessageCountEvent ev) {
for (Message message : ev.getMessages()) {
log.info("Message received subject={}, from={}", message.getSubject(), message.getFrom());
emailMessageHandler.handle(message);
}
}
});
...
private void waitForNewMessages(Folder inbox) throws MessagingException {
while (inbox.isOpen()) {
//every 25 minutes poke the server with a inbox.getMessageCount() to keep the connection active/open
var scheduler = Executors.newScheduledThreadPool(1);
final Runnable pokeInbox = () -> {
try {
inbox.getMessageCount();
} catch (MessagingException ex) {
//nothing doin'
}
};
scheduler.schedule(pokeInbox, 25, TimeUnit.MINUTES);
((IMAPFolder) inbox).idle();
}
}
型
2条答案
按热度按时间swvgeqrz1#
在研究了整个www之后,我发现了以下解决方案
IdleManager
。IdleManager使用ExecutorService监听来自SMTP服务器的所有事件,并且不会阻止Web应用程序接收其他传入请求。要取得联系和更多信息,您可以查看以下文档。IdleManager
huwehgph2#
提供关于上述问题的更多细节:
要通过IMAP协议在Sping Boot 应用程序中监视/读取传入的电子邮件:
1.我们可以使用提供IMAP实现的JavaMail API。
1.我们需要一个支持IMAP IDLE功能的电子邮件服务器,IMAP IDLE允许我们的应用程序在新邮件到达邮箱时立即接收通知,而不是依赖于定期轮询。
请参阅此处的详细实现:https://medium.com/@sushant7/how-to-monitor-incoming-emails-in-a-spring-boot-application-indefinitely-7dabbdb74b2d