2017-09-11 84 views
0

我试图延长连接到电子邮件存储(Microsoft Exchange服务器)的超时但没有成功。原因是,在连接到商店的本地计算机上几乎是瞬间完成的,但在部署代码的计算机上可能需要几分钟的时间。我宁愿只有很长的超时时间,而不是连续不断地尝试连接。这个怎么做?这里是我的代码(试图将超时设置为2分钟):JavaMail通过imaps连接到电子邮件存储 - 延长超时

 Properties properties = new Properties(); 
     properties.put("mail.store.protocol", "imaps"); 
     properties.put("mail.imaps.host", IESProperties.STORE_HOST); 
     properties.put("mail.imaps.port", "993"); 
     properties.put("mail.imaps.connectiontimeout", "120000"); // 2 minutes 
     properties.put("mail.imaps.timeout", "120000"); // 2 minutes 

     Session session = Session.getInstance(properties); 
     IMAPStore store = null; 

     try { 
      store = (IMAPStore) session.getStore("imaps"); 
      try { 
       store.connect(IESProperties.STORE_USERNAME, IESProperties.STORE_PASSWORD); 

当我运行这个好像只有10秒左右或者类似的东西后,就放弃了。

jvm 1 | javax.mail.MessagingException: Connection timed out: connect; 
jvm 1 | nested exception is: 
jvm 1 |  java.net.ConnectException: Connection timed out: connect 
jvm 1 |  at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:66 
5) 
jvm 1 |  at javax.mail.Service.connect(Service.java:295) 
jvm 1 |  at javax.mail.Service.connect(Service.java:176) 
jvm 1 |  at javax.mail.Service.connect(Service.java:196) 
jvm 1 |  at com.axa.ets.ies.Main.start(Main.java:297) 
jvm 1 |  at com.axa.ets.ies.Main.main(Main.java:232) 
jvm 1 |  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
jvm 1 |  at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
jvm 1 |  at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Sourc 
e) 
jvm 1 |  at java.lang.reflect.Method.invoke(Unknown Source) 
jvm 1 |  at org.tanukisoftware.wrapper.WrapperSimpleApp.run(WrapperSimple 
App.java:325) 
jvm 1 |  at java.lang.Thread.run(Unknown Source) 

当我telnet到商店时,它需要很长时间,但通常在大约一分钟内连接。

如何使用API​​扩展此超时?谢谢

+0

设置** **系统属性'mail.socket.debug'到TRUE;,使[JavaMail的调试输出(https://javaee.github.io/javamail/FAQ#debug) ,并验证它是否获得了正确的连接超时。还可能有关于连接失败的更多信息。你在什么操作系统上使用什么JDK?什么是JavaMail版本? JavaMail只是将超时值传递给JDK,JDK将其传递给操作系统。 –

+0

@ Bill Shannon这绝对是一个超时问题,不需要调试。我可以使用相同的代码和相同的信息连接其他几台机器。我刚刚实施了一个不断尝试重新连接并最终成功的解决方案。它与telnet行为一致。我想我会继续尝试重新连接,因为它看起来没有代码解决方案。 – Wes

+0

我只是要求将代码移动到另一台服务器,因为它似乎是服务器的某种滞后问题。 – Wes

回答

0

我不确定你是否可以通过你的代码来控制它。但是,可能通过服务器控制该服务器(请参阅here - > IMAP4的连接超时限制):

本示例设置空闲身份验证连接的连接超时限制。

Set-ImapSettings -Identity CAS01 -AuthenticatedConnectionTimeout TimeValue 

本示例为空闲未经验证的连接的连接超时限制。

Set-ImapSettings -Identity CAS01 -PreAuthenticatedConnectionTimeout TimeValue 
+0

是的,我不认为这是一个选项我绝对不想改变服务器,因为它被很多人使用。 – Wes

+0

我已经请求另一台服务器将代码部署到其他地方,因为它会立即连接到其他任何地方。由于这可能是一些人的解决方案,我会将其标记为正确的答案。 – Wes