多线程中的Spring HibernateTemplate

时间:2012-05-10 02:57:59

标签: multithreading spring hibernate

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

0 个答案:

没有答案