2017-07-04 68 views
0

我有這個錯誤,我無法修復,我不知道什麼是錯的。我困在這裏。這是什麼JAVA線程錯誤?

這個錯誤的含義是什麼? com.google.apphosting.api.ApiProxy $ CallNotFoundException:不能讓API調用mail.Send在一個線程既不是原始請求的線程也不由ThreadManager

創建的線程這是一個完整的堆棧跟蹤:

org.apache.commons.mail.EmailException: Sending the email to the following server failed : smtp.gmail.com:587 
    at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1242) 
    at org.apache.commons.mail.Email.send(Email.java:1267) 
    at com.wealthsystems.sim3g.modulo.email.impl.EnviaEmailsThread.process(EnviaEmailsThread.java:123) 
    at com.wealthsystems.dao.hibernate.api.service.WsThreadService.run(WsThreadService.java:55) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) 
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:304) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: com.google.apphosting.api.ApiProxy$CallNotFoundException: Can't make API call mail.Send in a thread that is neither the original request thread nor a thread created by ThreadManager 
    at com.google.apphosting.api.ApiProxy$CallNotFoundException.foreignThread(ApiProxy.java:800) 
    at com.google.apphosting.api.ApiProxy.makeSyncCall(ApiProxy.java:112) 
    at com.google.apphosting.api.ApiProxy.makeSyncCall(ApiProxy.java:65) 
    at com.google.appengine.api.mail.MailServiceImpl.doSend(MailServiceImpl.java:101) 
    at com.google.appengine.api.mail.MailServiceImpl.send(MailServiceImpl.java:34) 
    at com.google.appengine.api.mail.stdimpl.GMTransport.sendMessage(GMTransport.java:223) 
    at javax.mail.Transport.send(Transport.java:95) 
    at javax.mail.Transport.send(Transport.java:48) 
    at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1232) 
    ... 10 more 

這是我的代碼生成此錯誤:

public static void sendMailApache(String protocol, String host, String port, String userName, String password, 
      String subject, byte[] content, String para, String cc, String co) { 
     try { 
      final Email email = new SimpleEmail(); 
      email.setHostName(host); 
      email.setSmtpPort(Integer.parseInt(port)); 
      email.setTLS(true); 
      email.setSSL(false); 
      email.setAuthenticator(new DefaultAuthenticator(userName, password)); 
      email.setFrom(userName); 
      email.setSubject(subject); 
      email.setCharset(org.apache.commons.mail.Email.ISO_8859_1); 

      for (String str: para.split(";")) { 
       email.addTo(str); 
      } 
      for (String str: cc.split(";")) { 
       email.addCc(str); 
      } 
      for (String str: co.split(";")) { 
       email.addBcc(str); 
      } 
      email.setMsg(content.toString()); 
      email.send(); 
     } catch (EmailException e) { 
      throw new RuntimeException(e); 
     } 
    } 

這個錯誤是什麼意思?我做錯了什麼?

+0

你確定,因爲我沒有看到任何此方法的堆棧跟蹤? – Ravi

+0

錯誤不是來自Thread類。該錯誤來自於對發送呼叫的限制。你能否在你提到的路線上放置一個斷點並逐步完成? – efekctive

回答

0

這意味着您不能使用不是由ThreadManager創建的線程。在你的情況下,你試圖使用默認會使用「非法」線程的ScheduledThreadPoolExecutor

您需要從ThreadManager(最可能是backgroundThreadFactory())提供ThreadFactory,因此創建的線程是「正確的」線程,GAE不會抱怨。

+0

但我沒有使用任何線程 – gFontaniva

+0

當然,你是(錯誤信息不會騙你)。不是很明確,但那並不重要。 – Kayaman

+0

我怎樣才能啓用ScheduledThreadPoolExecutor的使用? – gFontaniva