0

システム メッセージの送信を処理する 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 の問題ですか?

4

0 に答える 0