Поток продолжает работать даже после остановки приложения в 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.

Обновление: Вот код, который создает поток.

@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.");
        }
    }   
}

7
задан dbreaux 30 December 2011 в 05:57
поделиться