package cn.newgxu.bbs.web.action.admin; import java.sql.Connection; import java.sql.PreparedStatement; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.List; import javax.sql.DataSource; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import cn.newgxu.bbs.common.Authorization; import cn.newgxu.bbs.common.Constants; import cn.newgxu.bbs.common.MessageList; import cn.newgxu.bbs.common.exception.BBSException; import cn.newgxu.bbs.common.util.Util; import cn.newgxu.bbs.domain.user.User; import cn.newgxu.bbs.service.MessageService; import cn.newgxu.bbs.web.action.AbstractBaseAction; import cn.newgxu.bbs.web.action.CreateSmallNewsAction; import cn.newgxu.bbs.web.model.message.SendMessageModel; /** * * @author 集成显卡 * @since 4.0.0 * @version $Revision 1.1$ */ public class SendMessageAllAction extends AbstractBaseAction { private static final long serialVersionUID = -8538755273711109508L; private DataSource dataSource; private int monthBefore;//多少个月前 private static final Log log = LogFactory .getLog(CreateSmallNewsAction.class); private SendMessageModel model = new SendMessageModel(); private MessageService messageService; public String execute() throws Exception { signOnlineUser("发送短消息"); model.setUser(getUser()); //当没有用户信息时,就从session中取得管理员的id,并实例user到model中 //使用的获得管理员id的方法:((Authorization)this.getSession().getAttribute(Constants.ADMIN_SESSION)).getId() if(this.getUser()==null) model.setUser(User.get(((Authorization)this.getSession().getAttribute(Constants.ADMIN_SESSION)).getId())); System.out.println(model.getUser().getNick()); try { messageService.sendMessage(model); return SUCCESS; } catch (BBSException e) { MessageList m = new MessageList(); log.debug(e); m.addMessage(e.getMessage()); Util.putMessageList(m, getSession()); return ERROR; } } /** * 修改了 jpa 添加很慢的问题, * 修正了 内存不足,就是分段执行就好了 * @return * @throws Exception */ public String submit() throws Exception { signOnlineUser("发送短消息中..."); model.setUser(User.get(((Authorization)this.getSession().getAttribute(Constants.ADMIN_SESSION)).getId())); model.setUsers(""); MessageList m = new MessageList(); Connection conn=null; PreparedStatement ps=null; try { //System.out.println(model.getUser().getNick()+" "+this.monthBefore+"月前 说:"+model.getTitle()+"---"+model.getContent()); Date date=this.getDate(this.monthBefore); int userNumber=User.getNumberOfUsersByLogintime(date); List<Integer> list=User.getIdsByLasttime(date); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String datetime=dateFormat.format(new Date()); conn=this.getDataSource().getConnection(); conn.setAutoCommit(false); StringBuilder sb=new StringBuilder(); sb.append("insert into message (user_id,folder_id,sender_id,receiver_id,receivers,face,title,content,create_time) values"); ps=conn.prepareStatement("insert into message (user_id,folder_id,sender_id,receiver_id,receivers,face,title,content,create_time) values(?,?,?,?,?,?,?,?,?)"); long start=System.currentTimeMillis(); for(int j=0;j<list.size();j++){ if(j>0) sb.append(","); sb.append("("+list.get(j)+",1,"+model.getUser().getId()+","+list.get(j)+","+"'all users',"+model.getFace()+",'"+model.getTitle()+"','"+model.getContent()+"','"+datetime+"')"); if((j+1)%800==0){ ps.executeUpdate(sb.toString()); sb.replace(0, sb.length(), "insert into message (user_id,folder_id,sender_id,receiver_id,receivers,face,title,content,create_time) values"); j++; sb.append("("+list.get(j)+",1,"+model.getUser().getId()+","+list.get(j)+","+"'all users',"+model.getFace()+",'"+model.getTitle()+"','"+model.getContent()+"','"+datetime+"')"); } } ps.executeUpdate(sb.toString()); long useTime=(System.currentTimeMillis()-start); System.out.println("OK:"+useTime+"ms"); m.setUrl("/admin/send_message_all.yws"); m.addMessage("<b>操作成功!发送的用户数 "+userNumber+",用时"+useTime+" (毫秒)</b>"); m.addMessage("<a href='/admin/send_message_all.yws'>继续群发</a>"); Util.putMessageList(m, getSession()); log.debug("短消发送成功!"); return SUCCESS; } catch(Exception e){ conn.rollback(); m.addMessage(e.getMessage()); e.printStackTrace(); return ERROR; } finally{ try{ if(ps!=null) ps.close(); if(conn!=null) conn.close(); } catch(Exception e){} } } private Date getDate(int beforeMonth){ Calendar c=Calendar.getInstance(); c.setTime(new Date(System.currentTimeMillis())); c.add(Calendar.MONTH, -beforeMonth); System.out.println("发送信息的登录时间:"+c.getTime()); return c.getTime(); } public int getMonthBefore() { return monthBefore; } public void setMonthBefore(int monthBefore) { this.monthBefore = monthBefore; } public DataSource getDataSource() { return dataSource; } public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } public Object getModel() { return model; } public void setMessageService(MessageService messageService) { this.messageService = messageService; } }