システム メッセージの送信を処理する Struts アクションのメソッドがあるため、Executors.newCachedThreadPool() を使用して新しいスレッド実行を呼び出しますが、再度送信を操作すると、スレッドが死んでいるように見えました。コードは次のとおりです。
public String sendMessage(){
if(!validateSystemMessage(systemMessage)){
return ERROR;
}
systemMessage.setEnable(false);
systemMessage.setContent(systemMessage.getContent());
systemMessage.setTitle(systemMessage.getTitle());
systemMessage.setMessageTime(new Date());
systemMessageDao.saveOrUpdate(systemMessage);
**ExecutorService executor = Executors.newCachedThreadPool();
SendMessage sendMessage=new SendMessage(systemMessage.getSmId());
LOGGER.info("-- systemMessage---"+systemMessage.getSmId());
sendMessage.setSystemMessageDao(systemMessageDao);
sendMessage.setUserMessageDao(userMessageDao);
String[] ids = userIds.split(",");
LOGGER.info("-- ids.length---"+ids.length);
sendMessage.setUserIds(ids);
executor.submit(sendMessage);**
systemMessage=null;
message=SUCCESS;
return SUCCESS;
}
public class SendMessage implements Callable<Boolean>{
@Override
public Boolean call() throws Exception{
SystemMessage msg = null;
msg = this.systemMessageDao.findSystemMessageById(msgId);
List<Long> userIdsSended = this.userMessageDao.findUserIdsByMsgId(msgId);//thread seemed be dead here
List<Long> listUserIds = new ArrayList<Long>();
for (String userId : userIds) {
Long id=Long.valueOf(userId);
if (userIdsSended != null && userIdsSended.contains(id)) {
continue;
}
listUserIds.add(id);
}
if (listUserIds != null && !listUserIds.isEmpty()) {
this.userMessageDao.save(msgId, listUserIds);
}
msg.setEnable(true);
this.systemMessageDao.saveOrUpdate(msg);
return true;
}
}
public SystemMessage findSystemMessageById(Long smId) {
List<SystemMessage> list = this.getHibernateTemplate().find("from SystemMessage systemMessage where systemMessage.smId = ?", new Object[] { smId });
return list.size() != 0 ? list.get(0) : null;
}
数分後に再度送信すると、正常に実行されます。違いは newCachedThreadPool が新しいスレッドを実行することだと思います。しかし、スレッドで再度実行できないのはなぜですか? hibernateTemplate または session の問題ですか?