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