package com.hqyg.disjob.monitor.pojo; import java.io.Serializable; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Map.Entry; import java.util.TreeMap; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; import com.hqyg.disjob.monitor.db.domain.DBJobBasicInfo; /** * * @author Disjob * */ public class MessagePiple implements Serializable,Comparable<MessagePiple>{ /** * */ private static final long serialVersionUID = 1L; private LinkedBlockingQueue<DBJobBasicInfo> responseMsgQueue ; private String requestId ; private String groupName ; private String jobName ; private long timeOut ;//秒 单位 private long startTime ;//毫秒值 为单位 private long endTime ;// endTime = startTime+ timeOut,毫秒值 为单位 private String receiveMessageTime ; //接收 job 执行完 返回消息的时间 /** * 统一处理为 秒。超时不足一秒的 给1 秒: * @param timeOut */ public MessagePiple(String requestId,String groupName,String jobName,long timeOut) { responseMsgQueue = new LinkedBlockingQueue<DBJobBasicInfo>(1) ;//just receive a message of job server response this.timeOut = timeOut < 0 ? 1 : timeOut ; this.timeOut += 1 ;//5s 的网络延时等其他情况的处理。超时报警 5s 的误差时间 和界面上设置的 this.startTime = System.currentTimeMillis(); this.endTime = startTime + timeOut * 1000 ;//结束的时间点 this.requestId = requestId ; this.groupName = groupName ; this.jobName = jobName ; } public DBJobBasicInfo take() throws InterruptedException{ long tmpTimeOut = this.endTime - System.currentTimeMillis() ; tmpTimeOut = tmpTimeOut <=0 ? 0 : tmpTimeOut; return this.responseMsgQueue.poll(tmpTimeOut,TimeUnit.MILLISECONDS); } public void offer(DBJobBasicInfo message){ this.receiveMessageTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); this.responseMsgQueue.offer(message); } public String getRequestId() { return requestId; } public void setRequestId(String requestId) { this.requestId = requestId; } public long getTimeOut() { return timeOut; } public void setTimeOut(long timeOut) { this.timeOut = timeOut; } public long getStartTime() { return startTime; } public void setStartTime(long startTime) { this.startTime = startTime; } public long getEndTime() { return endTime; } public void setEndTime(long endTime) { this.endTime = endTime; } public String getReceiveMessageTime() { return receiveMessageTime; } public void setReceiveMessageTime(String receiveMessageTime) { this.receiveMessageTime = receiveMessageTime; } public String getGroupName() { return groupName; } public void setGroupName(String groupName) { this.groupName = groupName; } public String getJobName() { return jobName; } public void setJobName(String jobName) { this.jobName = jobName; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + (int) (endTime ^ (endTime >>> 32)); result = prime * result + ((requestId == null) ? 0 : requestId.hashCode()); result = prime * result + ((responseMsgQueue == null) ? 0 : responseMsgQueue.hashCode()); result = prime * result + (int) (startTime ^ (startTime >>> 32)); result = prime * result + (int) (timeOut ^ (timeOut >>> 32)); return result; } /** * 按结束的先后时间排序 */ @Override public int compareTo(MessagePiple other) { Long cuEndTime = this.endTime ; Long otherEndTime = other.endTime; int result = cuEndTime.compareTo(otherEndTime);//因为开始时间不一样,所以这里的结束时间不可能一样 return (int) (result == 0 ? this.startTime-other.startTime : result) ; } public static void main(String[] args) { TreeMap<MessagePiple,String> sort = new TreeMap<MessagePiple,String>(); sort.put(new MessagePiple("id", "g1", "j1", 3), ""); sort.put(new MessagePiple("id", "g2", "j2", 4), ""); sort.put(new MessagePiple("id", "g3", "j3", 5), ""); sort.put(new MessagePiple("id", "g4", "j4", 6), ""); sort.put(new MessagePiple("id", "g5", "j5", 7), ""); for(Entry<MessagePiple, String> entry : sort.entrySet()){ System.out.println(entry.getKey().getEndTime()+"; "+entry.getKey().getTimeOut()); } } }