每當我嘗試讀取 MimeMessage 的內容時,我都會收到“java.lang.IllegalStateException:檔案夾未打開”例外。
我有一個非常簡單的服務來處理收到的訊息:
@Service
public class ReceiveMailService {
private final Logger log = LoggerFactory.getLogger(ReceiveMailService.class);
public void handleReceivedMail(MimeMessage receivedMessage) {
try {
log.debug("{}", receivedMessage.getContent());
MimeMessageParser mimeMessageParser = new MimeMessageParser(receivedMessage).parse(); // it breaks here
doMyStuff(mimeMessageParser);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
}
這是我的配置類:
@Configuration
@EnableIntegration
public class MailReceiverConfiguration {
private static final Logger log = LoggerFactory.getLogger(MailReceiverConfiguration.class);
@Value("${spring.mail.pop3.host}")
private String host;
@Value("${spring.mail.pop3.port}")
private Integer port;
@Value("${spring.mail.username}")
private String username;
@Value("${spring.mail.password}")
private String password;
private final ReceiveMailService receiveMailService;
public MailReceiverConfiguration(ReceiveMailService receiveMailService) {
this.receiveMailService = receiveMailService;
}
@Bean
public IntegrationFlow mailListener() {
return IntegrationFlows
.from(Mail
.pop3InboundAdapter(host, port, username, password)
.javaMailProperties(p -> {
p.put("mail.debug", "false");
p.put("mail.pop3.socketFactory.fallback", "false");
p.put("mail.pop3.port", port);
p.put("mail.pop3.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
p.put("mail.pop3.socketFactory.port", port);
})
.maxFetchSize(10)
.shouldDeleteMessages(false),
e -> e.poller(Pollers.fixedRate(5000).maxMessagesPerPoll(10))
)
.handle(message -> receiveMailService.handleReceivedMail((MimeMessage) message.getPayload()))
.get();
}
}
我已經想不出為什么這不起作用了。
uj5u.com熱心網友回復:
對于像您這樣的用例,請參閱此選項:
/**
* When configured to {@code false}, the folder is not closed automatically after a fetch.
* It is the target application's responsibility to close it using the
* {@link org.springframework.integration.IntegrationMessageHeaderAccessor#CLOSEABLE_RESOURCE} header
* from the message produced by this channel adapter.
* @param autoCloseFolder set to {@code false} to keep folder opened.
* @return the spec.
* @since 5.2
* @see AbstractMailReceiver#setAutoCloseFolder(boolean)
*/
public S autoCloseFolder(boolean autoCloseFolder) {
檔案在這里:https ://docs.spring.io/spring-integration/docs/current/reference/html/mail.html#mail-inbound
從版本 5.2 開始,郵件接收器上提供了 autoCloseFolder 選項。將其設定為 false 不會在獲取后自動關閉檔案夾,而是將 IntegrationMessageHeaderAccessor.CLOSEABLE_RESOURCE 標頭(有關更多資訊,請參閱 MessageHeaderAccessor API)填充到從通道配接器發送給生產者的每條訊息中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/452754.html
