Tengo un hilo de ejecución larga que se ha creado usando org.springframework.scheduling.commonj.WorkManagerTaskExecutor
con la primavera y se está ejecutando en Websphere Application Server 8.hilo sigue funcionando incluso después de la aplicación se ha detenido en Websphere
El problema es que este hilo sigue funcionando incluso si la aplicación ha sido detenida Ese hilo debe detenerse también, pero no está sucediendo. Incluso traté de usar Thread.currentThread().isInterrupted()
para verificar si el hilo actual fue interrumpido pero siempre devuelve false
. Así que no hay forma de saber a través de mi código si el hilo debe seguir funcionando o detenerse.
Esta es mi configuración del resorte para el WorkManagerTaskExecutor:
<bean id="taskExecutor" class="org.springframework.scheduling.commonj.WorkManagerTaskExecutor">
<property name="workManagerName" value="wm/default" />
</bean>
El hilo se está ejecutando de esta manera:
Thread t = new EmailReaderThread(email);
workManagerTaskExecutor.execute(t);
- ¿Qué me falta?
- ¿Qué puedo hacer para que cada vez que se detiene la aplicación, la cadena de la aplicación (hilos generados por la aplicación) también se detenga?
creo que esto no se considera un hilo no administrado porque yo estoy registrando el hilo con la adecuada WorkManager cual el contenedor expone como un recurso por JNDI.
Actualización: Aquí está el código que crea el subproceso.
@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.");
}
}
}
¿No debería estar pasando un Runnable a WorkManagerTaskExecutor.execute (tarea WorkManagerTaskExecutor) en lugar de un subproceso? – Hyangelo
Un subproceso implementa Runnable así que es Runnable. Creo que ese no es el problema. –
ejecutores nunca llaman al método 'start()' de un hilo pasado (solo el 'run()') por lo que también podría usar un runnable normal (no un hilo) –