我在 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 的问题?