java web结束线程_java – 即使在Websphere中停止应用程序后,线程仍会继续运行

我有一个长期运行的线程,使用org.

springframework.scheduling.commonj.WorkManagerTaskExecutor创建

使用

Spring并在Websphere Application Server 8中运行.

问题是即使应用程序已停止,此线程仍会继续运行.该线程也需要停止,但它没有发生.我甚至尝试使用Thread.currentThread().isInterrupted()来检查当前线程是否被中断但它总是返回false.所以没有办法通过我的代码知道线程应该继续运行还是停止.

这是我对WorkManagerTaskExecutor的弹簧配置:

线程正在以这种方式执行:

Thread t = new EmailReaderThread(email);

workManagerTaskExecutor.execute(t);

>我错过了什么?

>我能做什么,以便每当应用程序停止时,应用程序的线程(由应用程序生成的线程)也会停止?

我认为这不被视为非托管线程,因为我使用适当的WorkManager注册线程,容器由JNDI作为资源公开.

更新:

这是创建Thread的代码.

@Service

@Transactional

public class SmsServiceHypermedia implements SmsService {

@Autowired

private WorkManagerTaskExecutor workManagerTaskExecutor;

public SmsServiceHypermedia() {

createEmailReaderThread();

}

private void createEmailReaderThread() {

log.debug("Generating Email Reader Threads...");

Email email = getDefaultEmail(); //obtain the default Email object, not important for the problem.

EmailReaderThread r = new EmailReaderThread(email);

workManagerTaskExecutor.execute(r);

}

private class EmailReaderThread extends Thread {

private Email email;

private Session session;

public EmailReaderThread(Email email) {

this.email = email;

}

@Override

public void run() {

readEmails();

}

public void readEmails() {

final long delay = 30 * 1000; //delay between message poll.

log.debug("Starting to read emails for email: " + email.getAddress());

while(!Thread.currentThread().isInterrupted()) {

try {

log.debug("Current session: " + session);

Store store = session.getStore();

log.debug("Connecting using session: " + session);

store.connect();

Folder inbox = store.getFolder("INBOX");

inbox.open(Folder.READ_WRITE);

javax.mail.Message[] messages = inbox.search(

new FlagTerm(new Flags(Flags.Flag.SEEN), false));

for (javax.mail.Message message : messages) {

//Do something with the message

}

inbox.close(true);

store.close();

block(delay);

} catch (Exception e) {

throw new RuntimeException(e);

}

}

}

//I know this could be implemented by calling Thread.sleep() is just that I ran out of options so I also tried it this way.

private void block(long millis) {

final long endTime = System.currentTimeMillis() + millis;

log.debug("Blocking for this amount of time: " + millis + " ms");

while (System.currentTimeMillis() < endTime) {

}

log.debug("End of blocking.");

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值