📄 memberimpl.java
字号:
//alive - 8 bytes
//port - 4 bytes
//secure port - 4 bytes
//host length - 1 byte
//host - hl bytes
//clen - 4 bytes
//command - clen bytes
//dlen - 4 bytes
//domain - dlen bytes
//uniqueId - 16 bytes
//payload length - 4 bytes
//payload plen bytes
//end package TRIBES_MBR_END.length
int pos = offset;
if (XByteBuffer.firstIndexOf(data,offset,TRIBES_MBR_BEGIN)!=pos) {
throw new IllegalArgumentException("Invalid package, should start with:"+org.apache.catalina.tribes.util.Arrays.toString(TRIBES_MBR_BEGIN));
}
if ( length < (TRIBES_MBR_BEGIN.length+4) ) {
throw new ArrayIndexOutOfBoundsException("Member package to small to validate.");
}
pos += TRIBES_MBR_BEGIN.length;
int bodylength = XByteBuffer.toInt(data,pos);
pos += 4;
if ( length < (bodylength+4+TRIBES_MBR_BEGIN.length+TRIBES_MBR_END.length) ) {
throw new ArrayIndexOutOfBoundsException("Not enough bytes in member package.");
}
int endpos = pos+bodylength;
if (XByteBuffer.firstIndexOf(data,endpos,TRIBES_MBR_END)!=endpos) {
throw new IllegalArgumentException("Invalid package, should end with:"+org.apache.catalina.tribes.util.Arrays.toString(TRIBES_MBR_END));
}
byte[] alived = new byte[8];
System.arraycopy(data, pos, alived, 0, 8);
pos += 8;
byte[] portd = new byte[4];
System.arraycopy(data, pos, portd, 0, 4);
pos += 4;
byte[] sportd = new byte[4];
System.arraycopy(data, pos, sportd, 0, 4);
pos += 4;
byte hl = data[pos++];
byte[] addr = new byte[hl];
System.arraycopy(data, pos, addr, 0, hl);
pos += hl;
int cl = XByteBuffer.toInt(data, pos);
pos += 4;
byte[] command = new byte[cl];
System.arraycopy(data, pos, command, 0, command.length);
pos += command.length;
int dl = XByteBuffer.toInt(data, pos);
pos += 4;
byte[] domain = new byte[dl];
System.arraycopy(data, pos, domain, 0, domain.length);
pos += domain.length;
byte[] uniqueId = new byte[16];
System.arraycopy(data, pos, uniqueId, 0, 16);
pos += 16;
int pl = XByteBuffer.toInt(data, pos);
pos += 4;
byte[] payload = new byte[pl];
System.arraycopy(data, pos, payload, 0, payload.length);
pos += payload.length;
member.setHost(addr);
member.setPort(XByteBuffer.toInt(portd, 0));
member.setSecurePort(XByteBuffer.toInt(sportd, 0));
member.setMemberAliveTime(XByteBuffer.toLong(alived, 0));
member.setUniqueId(uniqueId);
member.payload = payload;
member.domain = domain;
member.command = command;
member.dataPkg = new byte[length];
System.arraycopy(data, offset, member.dataPkg, 0, length);
return member;
}
public static MemberImpl getMember(byte[] data) {
return getMember(data,new MemberImpl());
}
/**
* Return the name of this object
* @return a unique name to the cluster
*/
public String getName() {
return "tcp://"+getHostname()+":"+getPort();
}
/**
* Return the listen port of this member
* @return - tcp listen port
*/
public int getPort() {
return this.port;
}
/**
* Return the TCP listen host for this member
* @return IP address or host name
*/
public byte[] getHost() {
return host;
}
public String getHostname() {
if ( this.hostname != null ) return hostname;
else {
try {
this.hostname = java.net.InetAddress.getByAddress(host).getHostName();
return this.hostname;
}catch ( IOException x ) {
throw new RuntimeException("Unable to parse hostname.",x);
}
}
}
/**
* Contains information on how long this member has been online.
* The result is the number of milli seconds this member has been
* broadcasting its membership to the cluster.
* @return nr of milliseconds since this member started.
*/
public long getMemberAliveTime() {
return memberAliveTime;
}
public long getServiceStartTime() {
return serviceStartTime;
}
public byte[] getUniqueId() {
return uniqueId;
}
public byte[] getPayload() {
return payload;
}
public byte[] getCommand() {
return command;
}
public byte[] getDomain() {
return domain;
}
public int getSecurePort() {
return securePort;
}
public void setMemberAliveTime(long time) {
memberAliveTime=time;
}
/**
* String representation of this object
*/
public String toString() {
StringBuffer buf = new StringBuffer("org.apache.catalina.tribes.membership.MemberImpl[");
buf.append(getName()).append(",");
buf.append(getHostname()).append(",");
buf.append(port).append(", alive=");
buf.append(memberAliveTime).append(",");
buf.append("id=").append(bToS(this.uniqueId)).append(", ");
buf.append("payload=").append(bToS(this.payload,8)).append(", ");
buf.append("command=").append(bToS(this.command,8)).append(", ");
buf.append("domain=").append(bToS(this.domain,8)).append(", ");
buf.append("]");
return buf.toString();
}
public static String bToS(byte[] data) {
return bToS(data,data.length);
}
public static String bToS(byte[] data, int max) {
StringBuffer buf = new StringBuffer(4*16);
buf.append("{");
for (int i=0; data!=null && i<data.length; i++ ) {
buf.append(String.valueOf(data[i])).append(" ");
if ( i==max ) {
buf.append("...("+data.length+")");
break;
}
}
buf.append("}");
return buf.toString();
}
/**
* @see java.lang.Object#hashCode()
* @return The hash code
*/
public int hashCode() {
return getHost()[0]+getHost()[1]+getHost()[2]+getHost()[3];
}
/**
* Returns true if the param o is a McastMember with the same name
* @param o
*/
public boolean equals(Object o) {
if ( o instanceof MemberImpl ) {
return Arrays.equals(this.getHost(),((MemberImpl)o).getHost()) &&
this.getPort() == ((MemberImpl)o).getPort() &&
Arrays.equals(this.getUniqueId(),((MemberImpl)o).getUniqueId());
}
else
return false;
}
public void setHost(byte[] host) {
this.host = host;
}
public void setHostname(String host) throws IOException {
hostname = host;
this.host = java.net.InetAddress.getByName(host).getAddress();
}
public void setMsgCount(int msgCount) {
this.msgCount = msgCount;
}
public void setPort(int port) {
this.port = port;
this.dataPkg = null;
}
public void setServiceStartTime(long serviceStartTime) {
this.serviceStartTime = serviceStartTime;
}
public void setUniqueId(byte[] uniqueId) {
this.uniqueId = uniqueId!=null?uniqueId:new byte[16];
getData(true,true);
}
public void setPayload(byte[] payload) {
byte[] oldpayload = this.payload;
this.payload = payload!=null?payload:new byte[0];
if ( this.getData(true,true).length > McastServiceImpl.MAX_PACKET_SIZE ) {
this.payload = oldpayload;
throw new IllegalArgumentException("Payload is to large for tribes to handle.");
}
}
public void setCommand(byte[] command) {
this.command = command!=null?command:new byte[0];
getData(true,true);
}
public void setDomain(byte[] domain) {
this.domain = domain!=null?domain:new byte[0];
getData(true,true);
}
public void setSecurePort(int securePort) {
this.securePort = securePort;
}
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
int length = in.readInt();
byte[] message = new byte[length];
in.read(message);
getMember(message,this);
}
public void writeExternal(ObjectOutput out) throws IOException {
byte[] data = this.getData();
out.writeInt(data.length);
out.write(data);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -