package com.techq.available.connector;
import java.nio.ByteBuffer;
import java.util.concurrent.TimeUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.techq.available.App;
import com.techq.available.connector.impl.ElectionCnxManagerImpl;
import com.techq.available.quorum.Message;
import com.techq.available.quorum.Notification;
import com.techq.available.quorum.QuorumPeer;
import com.techq.available.quorum.ServerState;
public class ConnectorTest {
private static final Logger LOG = LoggerFactory
.getLogger(ConnectorTest.class);
public static ElectionCnxManager initConnector(long id) {
try {
QuorumPeer peer = new App().createPeer(id);
ElectionCnxManager manager = new ElectionCnxManagerImpl(peer);
manager.startListen();
// manager.toSend(1L, )
return manager;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public static void main(String[] args) throws InterruptedException {
// one send
// one recv
// to 2
Thread sendThread = new Thread() {
final ElectionCnxManager manager = initConnector(1);
Notification n = new Notification(Notification.mType.AGREEMENT, 2,
0, 2, ServerState.FOLLOWING, 2,// to whom
1//
);
public void run() {
try {
while (true) {
TimeUnit.SECONDS.sleep(1);
LOG.info("send:" + n);
ByteBuffer buffer = process(n);
manager.toSend(2L, buffer);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace(System.out);
}
}
};
Thread recvThread = new Thread() {
final ElectionCnxManager manager = initConnector(2);
public void run() {
try {
while (true) {
Message response = manager.pollRecvQueue(200,
TimeUnit.MILLISECONDS);
if (response == null)
continue;
ByteBuffer buffer = response.getBuffer();
int val = buffer.getInt();//4
Notification.mType type = Notification.getTypeByInt(val);
long state = response.getBuffer().getInt();//4
long leader = response.getBuffer().getLong();//8
long zxid = response.getBuffer().getLong();//8
long electionEpoch = response.getBuffer().getLong();//8
long from = response.getBuffer().getLong();//8
long sid = 1;
Notification n = new Notification(
type,
leader,
zxid,
electionEpoch,
ServerState.FOLLOWING,
from,//to whom
sid//
);
LOG.info("recv:" + n);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
sendThread.start();
recvThread.start();
Thread.currentThread().join();
}
private static ByteBuffer process(Notification m) {
byte requestBytes[] = new byte[Message.DEFAULT_SIZE];
ByteBuffer requestBuffer = ByteBuffer.wrap(requestBytes);
/*
* Building notification packet to send
*/
/**
* int 4byte long 4 * 8 byte total bytes: 36bytes
*/
requestBuffer.clear();
LOG.info("type:" + m.getType().ordinal());
requestBuffer.putInt(m.getType().ordinal());
requestBuffer.putInt(m.getState().ordinal());
requestBuffer.putLong(m.getLeader());
requestBuffer.putLong(m.getZxid());
requestBuffer.putLong(m.getLogicalClock());
requestBuffer.putLong(m.getFrom());// from which peer
return requestBuffer;
}
}