Java Spring问题与java.lang.IllegalThreadStateException

时间:2017-10-24 14:44:38

标签: java multithreading email

我有一个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) {

但它不起作用..我的意思是,应用程序仍在等待发送电子邮件以完成流程。电子邮件是流程的最后一步,所以我试图将响应发送到前端,而不是等待电子邮件。 但是,在发送电子邮件之前,我不会得到任何回复。

1 个答案:

答案 0 :(得分:0)

如果您不想等待emailService执行send操作,可以使用@Async对其进行注释。由于该方法无效,您无需处理代理提供的Future,因此更改的影响最小。

https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/scheduling/annotation/Async.html