这个JAVA线程错误是什么?

这个JAVA线程错误是什么?,java,Java,我有这个错误,我无法修复,我不知道是什么问题。我被困在这里面了 这个错误意味着什么com.google.apphosting.api.ApiProxy$CallNotFoundException:无法生成api调用邮件。请发送一个既不是原始请求线程也不是由ThreadManager创建的线程的线程 这是完整的堆栈跟踪: org.apache.commons.mail.EmailException: Sending the email to the following server fai

我有这个错误,我无法修复,我不知道是什么问题。我被困在这里面了

这个错误意味着什么com.google.apphosting.api.ApiProxy$CallNotFoundException:无法生成api调用邮件。请发送一个既不是原始请求线程也不是由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);
       }
    }

这个错误意味着什么?我做错了什么?

这意味着您不能使用非由创建的线程。在您的例子中,您试图使用一个
ScheduledThreadPoolExecutor
,默认情况下,它将使用“非法”线程


您需要从
ThreadManager
提供
ThreadFactory
(很可能是
backgroundThreadFactory()
),这样创建的线程是“正确的”线程,GAE不会抱怨。

尝试注释
com.google.appengine
依赖项,然后重试。希望它能起作用

<dependency>
        <groupId>com.google.appengine</groupId>
        <artifactId>appengine-api-1.0-sdk</artifactId>
        <version>...</version>
</dependency>

com.google.appengine
appengine-api-1.0-sdk
...

您确定吗,因为我没有看到此方法的任何堆栈跟踪?错误不是来自线程类。该错误来自对发送调用的内容设置限制的库。你能在你提到的那一行中设置一个断点并逐步通过它吗?当然可以(错误消息不会骗你)。可能不是很明确,但这并不重要。您的
WsThreadService
看起来是基于stacktrace进行调度的。您需要对其进行修改,以便使用
ThreadManager
提供的线程对其进行调度。