调用ImapIdleChannelAdapter.doStop时线程卡住



我使用spring integration imap空闲通道适配器来接收电子邮件,但在接收电子邮件的过程中似乎出现了线程阻塞,当我们试图停止适配器时,我们发现存在线程阻塞问题。

你能建议如何解决这个问题吗?我们确实设置了超时,似乎不起作用。

很奇怪为什么超时也不起作用

<util:properties id="exchangeJavaMailProperties">
<prop key="mail.imaps.socketFactory.class">javax.net.ssl.SSLSocketFactory</prop>
<prop key="mail.imap.starttls.enable">false</prop>
<prop key="mail.imaps.socketFactory.fallback">false</prop>
<prop key="mail.store.protocol">imaps</prop>
<prop key="mail.imaps.auth.plain.disable">true</prop>
<prop key="mail.debug">true</prop>
<prop key="mail.imaps.timeout">300000</prop>
<prop key="mail.imap.timeout">300000</prop> 
<prop key="mail.imap.connectiontimeout">300000</prop>
<prop key="mail.imaps.connectiontimeout">300000</prop>
</util:properties>

"task-scheduler-7" #942 prio=5 os_prio=0 tid=0x00000000029a9000 nid=0x51a runnable [0x00007f8a97835000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:171)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at com.sun.mail.util.TraceInputStream.read(TraceInputStream.java:124)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
at java.io.BufferedInputStream.read(BufferedInputStream.java:265)
- locked <0x0000000086280c00> (a java.io.BufferedInputStream)
at com.sun.mail.iap.ResponseInputStream.readResponse(ResponseInputStream.java:103)
at com.sun.mail.iap.Response.<init>(Response.java:114)
at com.sun.mail.imap.protocol.IMAPResponse.<init>(IMAPResponse.java:60)
at com.sun.mail.imap.protocol.IMAPProtocol.readResponse(IMAPProtocol.java:390)
at com.sun.mail.iap.Protocol.command(Protocol.java:354)
- locked <0x0000000086280c38> (a com.sun.mail.imap.protocol.IMAPProtocol)
at com.sun.mail.imap.protocol.IMAPProtocol.fetch(IMAPProtocol.java:2113)
at com.sun.mail.imap.protocol.IMAPProtocol.fetch(IMAPProtocol.java:2105)
at com.sun.mail.imap.protocol.IMAPProtocol.fetchSectionBody(IMAPProtocol.java:1818)
at com.sun.mail.imap.protocol.IMAPProtocol.fetchBody(IMAPProtocol.java:1801)
at com.sun.mail.imap.protocol.IMAPProtocol.peekBody(IMAPProtocol.java:1774)
at com.sun.mail.imap.IMAPInputStream.fill(IMAPInputStream.java:154)
- locked <0x0000000086280cb8> (a java.lang.Object)
at com.sun.mail.imap.IMAPInputStream.read(IMAPInputStream.java:218)
- locked <0x0000000086280cc8> (a com.sun.mail.imap.IMAPInputStream)
at com.sun.mail.imap.IMAPInputStream.read(IMAPInputStream.java:244)
at com.sun.mail.imap.IMAPMessage.writeTo(IMAPMessage.java:849)
at javax.mail.internet.MimeMessage.<init>(MimeMessage.java:245)
at org.springframework.integration.mail.AbstractMailReceiver$IntegrationMimeMessage.<init>(AbstractMailReceiver.java:557)
at org.springframework.integration.mail.AbstractMailReceiver$IntegrationMimeMessage.<init>(AbstractMailReceiver.java:552)
at org.springframework.integration.mail.AbstractMailReceiver.postProcessFilteredMessages(AbstractMailReceiver.java:415)
at org.springframework.integration.mail.AbstractMailReceiver.receive(AbstractMailReceiver.java:342)
- locked <0x0000000086284e98> (a java.lang.Object)
at org.springframework.integration.mail.ImapIdleChannelAdapter$IdleTask.run(ImapIdleChannelAdapter.java:273)
at org.springframework.integration.mail.ImapIdleChannelAdapter$ReceivingTask.run(ImapIdleChannelAdapter.java:241)
at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
"[STUCK] ExecuteThread: '2' for queue: 'weblogic.kernel.Default (self-tuning)'" #31 daemon prio=1 os_prio=0 tid=0x00007f8ac021a000 nid=0x183 waiting for monitor entry [0x00007f8aea5d2000]
java.lang.Thread.State: BLOCKED (on object monitor)
at org.springframework.integration.mail.AbstractMailReceiver.destroy(AbstractMailReceiver.java:519)
- waiting to lock <0x0000000086284e98> (a java.lang.Object)
at org.springframework.integration.mail.ImapIdleChannelAdapter.doStop(ImapIdleChannelAdapter.java:170)

我认为这个问题的解决方法如下:https://github.com/spring-projects/spring-integration/commit/6d0757a08a75828eea408e68a9284cebb6e602fd.

因此,您需要考虑将您的项目升级到最新的Spring Integration:https://spring.io/projects/spring-integration#learn

即使修复不完全针对上述死锁,取消ping似乎也有助于防止等待任务完成。

最新更新