我有一个Java应用程序,当我用同一个方法调用两个不同的时间而第一个仍在运行时,给我这个错误(java.lang.IllegalThreadStateException)....
对于我读过的解决方案,我应该创建一个新的Thread实例,但我认为它不是我的选项,因为我自动连接所有类...所以如果我被迫创建一个新的实例,其他服务(在线程内)将不会实例化。
所以,请转到代码......
在我的spring-config.xml中,我添加了以下bean,因此我可以访问EmailThread(这是我想要创建的线程来发送电子邮件),而无需停止应用程序(因为电子邮件需要几秒钟才能发送)< / p>
<bean id="emailThread" class="com.cobranzasmoviles.services.EmailThread"></bean>
这是我的EmailThread
@Component
public class EmailThread extends Thread {
Client client;
CollectionBO collection;
boolean confirmation;
@Autowired
private EmailService emailService;
public void update(Client client, CollectionBO collection, boolean confirmation){
this.client = client;
this.collection = collection;
this.confirmation = confirmation;
}
@Override
public void run() {
try {
if(this.client != null && this.collection != null)
emailService.send(this.client, this.collection, this.confirmation);
} catch (Exception e) {
e.printStackTrace();
}
}
}
这就是我如何称呼它(如果我删除了while和超时,我得到了我所说的错误)
@Autowired
EmailThread emailThread;
private void sendEmail(Client client, CollectionBO collection, boolean confirmation){
try {
this.emailThread.update(client, collection, false);
State state = this.emailThread.getState();
while(!state.name().equalsIgnoreCase("NEW") && !state.name().equalsIgnoreCase("TERMINATED"))
Timeout.seconds(1000);
this.emailThread.start();
} catch (Exception e) {
e.printStackTrace();
}
}
此解决方案的问题是我正在停止应用程序执行,等待状态更改完成。
所以你可以看到,我不能简单地做新的EmailThread()......有什么解决方案吗?我使用错误的策略发送电子邮件?
UPD
我将方法改为
@Async
private void sendEmailService(Client client, CollectionBO collection, boolean confirmation){
try {
// this.emailThread.update(client, collection, false);
// State state = this.emailThread.getState();
// while(!state.name().equalsIgnoreCase("NEW") && !state.name().equalsIgnoreCase("TERMINATED"))
// Timeout.seconds(1000);
// this.emailThread.start();
this.emailService.send(client, collection, confirmation);
} catch (Exception e) {
e.printStackTrace();
}
}
但该应用程序仍在等待发送电子邮件以继续执行...我错过了什么?
我用以下方法调用方法:
this.sendEmailService(client, colResponse, false);
@Async是否足够或者我应该添加其他东西?
UDT2:
我在WebConfig.java上添加了@EnableAsync
@Configuration
@EnableWebMvc
@EnableAsync
@EnableAspectJAutoProxy(proxyTargetClass=true)
public class WebConfig extends WebMvcConfigurerAdapter {
在一个类中,我以这种方式调用@Async方法
this.emailService.send(client, colResponse, true);
在界面中我添加了@Async(不确定是否需要)
@Async
public void send(Client client, CollectionBO collection, boolean confirmation) throws Exception;
在方法实现中还添加了@Async
@Async
public void send(Client client, CollectionBO collection, boolean confirmation) {
但它不起作用..我的意思是,应用程序仍在等待发送电子邮件以完成流程。电子邮件是流程的最后一步,所以我试图将响应发送到前端,而不是等待电子邮件。 但是,在发送电子邮件之前,我不会得到任何回复。
答案 0 :(得分:0)
如果您不想等待emailService
执行send
操作,可以使用@Async
对其进行注释。由于该方法无效,您无需处理代理提供的Future
,因此更改的影响最小。