에서 중단 된 후에도 계속 실행 8.스레드 어플은 봄과 <code>org.springframework.scheduling.commonj.WorkManagerTaskExecutor</code> 를 사용하여 생성되며, 웹 스피어 애플리케이션 서버에서 실행되는 장기 실행 스레드를 가지고 스피어
문제는이 스레드도 실행 유지한다는 것입니다 응용 프로그램이 중지 된 경우 그 실은 멈춰야 만하지만 그것은 일어나지 않습니다. 심지어는 Thread.currentThread().isInterrupted()
을 사용하여 현재 스레드가 인터럽트되었는지를 확인하려고 시도했지만 항상 false
을 반환합니다. 스레드가 계속 실행되거나 중지되어야 하는지를 코드를 통해 알 수있는 방법이 없습니다.
이것은 WorkManagerTaskExecutor 내 스프링 구성입니다 :
스레드가 이런 식으로 실행되고<bean id="taskExecutor" class="org.springframework.scheduling.commonj.WorkManagerTaskExecutor">
<property name="workManagerName" value="wm/default" />
</bean>
:
Thread t = new EmailReaderThread(email);
workManagerTaskExecutor.execute(t);
- 내가 무엇을 놓치고를?
- 응용 프로그램이 중지 될 때마다 응용 프로그램의 스레드 (응용 프로그램에서 생성 된 스레드)도 중지되도록하려면 어떻게해야합니까?
컨테이너가 JNDI에 의해 리소스로 노출하는 적절한 WorkManager을 사용하여 스레드를 등록 중이므로 관리되지 않는 스레드로 간주되지 않습니다.
업데이트 : 다음은 스레드를 생성하는 코드입니다.
@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.");
}
}
}
스레드 대신 Runnable을 WorkManagerTaskExecutor.execute (WorkManagerTaskExecutor 작업)에 전달하면 안됩니까? – Hyangelo
스레드는 Runnable을 구현하므로 Runnable입니다. 나는 그것이 문제가 아니라고 생각한다. –
실행자는 전달 된 쓰레드의'start()'메소드를 결코 호출하지 않습니다 ('run()'만). 따라서 일반 실행 파일 (쓰레드가 아닌)을 사용할 수도 있습니다. –