package jdepend.client.core.remote.score; import java.io.IOException; import java.net.InetAddress; import java.net.MalformedURLException; import java.net.UnknownHostException; import java.rmi.ConnectException; import java.rmi.Naming; import java.rmi.NotBoundException; import java.rmi.RemoteException; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Timer; import java.util.TimerTask; import jdepend.client.core.remote.config.ServerConfigurator; import jdepend.client.core.remote.session.RemoteSessionProxy; import jdepend.core.score.ScoreFacade; import jdepend.core.score.ScoreInfo; import jdepend.framework.config.PropertyConfigurator; import jdepend.framework.domain.PersistentBean; import jdepend.framework.exception.JDependException; import jdepend.framework.log.LogUtil; import jdepend.server.service.score.ScoreDTO; import jdepend.server.service.score.ScoreRemoteService; /** * 分数上传 * * @author wangdg * */ public class ScoreUpload extends PersistentBean { private static final long serialVersionUID = -7772443906780252903L; private static final String DEFAULT_SCORE_SERVICE = "rmi://localhost/ScoreRemoteService"; private Date collectEndTime; private boolean isNeedSave = false; public final static long collectTimeDiff = 1000 * 60 * 60; // public final static long collectTimeDiff = 0; private static ScoreUpload uploader; private transient Timer timer = new Timer(); public static ScoreUpload getInstance() { if (uploader == null) { uploader = new ScoreUpload(); } return uploader; } public ScoreUpload() { super("分数前端收集器", "分数前端收集器", PropertyConfigurator.DEFAULT_PROPERTY_DIR); } public void start() { // 定时触发分数传递任务 timer.schedule(new UploadScoreTask(this), 20000, 600000); } public void stop() { timer.cancel(); } public void upload() { long currentTime = System.currentTimeMillis(); if (this.collectEndTime == null || currentTime - this.collectEndTime.getTime() >= collectTimeDiff) { try { // 收集指定时间段的分数信息 List<ScoreInfo> items = new ArrayList<ScoreInfo>(); if (this.collectEndTime == null) { items = ScoreFacade.getScoreList(); } else { items = ScoreFacade.getScoreList(this.collectEndTime); } if (items != null && items.size() > 0) { List<ScoreDTO> uploadItems = new ArrayList<ScoreDTO>(); ScoreDTO uploadItem; String ip = InetAddress.getLocalHost().getHostAddress(); String user = null; if (RemoteSessionProxy.getInstance().isValid()) { user = RemoteSessionProxy.getInstance().getUserName(); } else { user = InetAddress.getLocalHost().getHostName(); } for (ScoreInfo item : items) { uploadItem = new ScoreDTO(ip, user, item.group, item.command, item.lc, item.score, item.distance, item.balance, item.relation, item.relation, item.createDate); uploadItems.add(uploadItem); } // 发送分数信息 this.getScoreRemoteService().uploadScore(uploadItems); } // 重置collectEndTime if (this.collectEndTime == null) { this.collectEndTime = new Date(currentTime); } else { this.collectEndTime.setTime(currentTime); } isNeedSave = true; } catch (JDependException e) { e.printStackTrace(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (RemoteException e) { e.printStackTrace(); } } } public Date getCollectEndTime() { return collectEndTime; } public void setCollectEndTime(Date collectEndTime) { this.collectEndTime = collectEndTime; } public void setNeedSave(boolean isNeedSave) { this.isNeedSave = isNeedSave; } public boolean isNeedSave() { return isNeedSave; } @Override public void save() throws IOException { if (isNeedSave()) { super.save(); LogUtil.getInstance(ScoreUpload.class).systemLog("保存分数收集器。。。"); } } public ScoreRemoteService getScoreRemoteService() throws JDependException { try { return (ScoreRemoteService) Naming.lookup(getScoreRemoteServiceURL()); } catch (ConnectException e) { e.printStackTrace(); throw new JDependException("连接服务器失败!", e); } catch (MalformedURLException e) { e.printStackTrace(); throw new JDependException("URL地址错误!", e); } catch (RemoteException e) { e.printStackTrace(); throw new JDependException("远程服务失败!", e); } catch (NotBoundException e) { e.printStackTrace(); throw new JDependException("没有查询到绑定服务!", e); } } private String getScoreRemoteServiceURL() { String scoreRemoteServiceURL = (new ServerConfigurator()).getScoreRemoteServiceURL(); if (scoreRemoteServiceURL == null) { scoreRemoteServiceURL = DEFAULT_SCORE_SERVICE; } return scoreRemoteServiceURL; } class UploadScoreTask extends TimerTask { private ScoreUpload uploader; public UploadScoreTask(ScoreUpload uploader) { this.uploader = uploader; } @Override public void run() { uploader.upload(); } } }