Java 11 support for #984 #987 (l) (#1190)

* Java 11 support: lazy-loading pattern

* Java 11 support: layers pattern

* Java 11 support: leader-election/lazy-loading patterns
This commit is contained in:
Zhang WH
2020-03-23 02:02:45 +08:00
committed by GitHub
parent 0ad67c8726
commit 67edeb806d
23 changed files with 238 additions and 243 deletions

View File

@@ -51,13 +51,13 @@ public abstract class AbstractMessageManager implements MessageManager {
*/
protected Instance findNextInstance(int currentId) {
Instance result = null;
List<Integer> candidateList = instanceMap.keySet()
var candidateList = instanceMap.keySet()
.stream()
.filter((i) -> i > currentId && instanceMap.get(i).isAlive())
.sorted()
.collect(Collectors.toList());
if (candidateList.isEmpty()) {
int index = instanceMap.keySet()
var index = instanceMap.keySet()
.stream()
.filter((i) -> instanceMap.get(i).isAlive())
.sorted()
@@ -65,7 +65,7 @@ public abstract class AbstractMessageManager implements MessageManager {
.get(0);
result = instanceMap.get(index);
} else {
int index = candidateList.get(0);
var index = candidateList.get(0);
result = instanceMap.get(index);
}
return result;

View File

@@ -66,7 +66,7 @@ public class Message {
if (o == null || getClass() != o.getClass()) {
return false;
}
Message message = (Message) o;
var message = (Message) o;
return type == message.type && Objects.equals(content, message.content);
}

View File

@@ -43,13 +43,13 @@ public class BullyApp {
public static void main(String[] args) {
Map<Integer, Instance> instanceMap = new HashMap<>();
MessageManager messageManager = new BullyMessageManager(instanceMap);
var messageManager = new BullyMessageManager(instanceMap);
BullyInstance instance1 = new BullyInstance(messageManager, 1, 1);
BullyInstance instance2 = new BullyInstance(messageManager, 2, 1);
BullyInstance instance3 = new BullyInstance(messageManager, 3, 1);
BullyInstance instance4 = new BullyInstance(messageManager, 4, 1);
BullyInstance instance5 = new BullyInstance(messageManager, 5, 1);
var instance1 = new BullyInstance(messageManager, 1, 1);
var instance2 = new BullyInstance(messageManager, 2, 1);
var instance3 = new BullyInstance(messageManager, 3, 1);
var instance4 = new BullyInstance(messageManager, 4, 1);
var instance5 = new BullyInstance(messageManager, 5, 1);
instanceMap.put(1, instance1);
instanceMap.put(2, instance2);
@@ -59,11 +59,11 @@ public class BullyApp {
instance4.onMessage(new Message(MessageType.HEARTBEAT_INVOKE, ""));
final Thread thread1 = new Thread(instance1);
final Thread thread2 = new Thread(instance2);
final Thread thread3 = new Thread(instance3);
final Thread thread4 = new Thread(instance4);
final Thread thread5 = new Thread(instance5);
final var thread1 = new Thread(instance1);
final var thread2 = new Thread(instance2);
final var thread3 = new Thread(instance3);
final var thread4 = new Thread(instance4);
final var thread5 = new Thread(instance5);
thread1.start();
thread2.start();

View File

@@ -51,8 +51,8 @@ public class BullyMessageManager extends AbstractMessageManager {
*/
@Override
public boolean sendHeartbeatMessage(int leaderId) {
Instance leaderInstance = instanceMap.get(leaderId);
boolean alive = leaderInstance.isAlive();
var leaderInstance = instanceMap.get(leaderId);
var alive = leaderInstance.isAlive();
return alive;
}
@@ -65,13 +65,12 @@ public class BullyMessageManager extends AbstractMessageManager {
*/
@Override
public boolean sendElectionMessage(int currentId, String content) {
List<Integer> candidateList = findElectionCandidateInstanceList(currentId);
var candidateList = findElectionCandidateInstanceList(currentId);
if (candidateList.isEmpty()) {
return true;
} else {
Message electionMessage = new Message(MessageType.ELECTION_INVOKE, "");
candidateList.stream()
.forEach((i) -> instanceMap.get(i).onMessage(electionMessage));
var electionMessage = new Message(MessageType.ELECTION_INVOKE, "");
candidateList.stream().forEach((i) -> instanceMap.get(i).onMessage(electionMessage));
return false;
}
}
@@ -85,7 +84,7 @@ public class BullyMessageManager extends AbstractMessageManager {
*/
@Override
public boolean sendLeaderMessage(int currentId, int leaderId) {
Message leaderMessage = new Message(MessageType.LEADER, String.valueOf(leaderId));
var leaderMessage = new Message(MessageType.LEADER, String.valueOf(leaderId));
instanceMap.keySet()
.stream()
.filter((i) -> i != currentId)
@@ -100,8 +99,8 @@ public class BullyMessageManager extends AbstractMessageManager {
*/
@Override
public void sendHeartbeatInvokeMessage(int currentId) {
Instance nextInstance = this.findNextInstance(currentId);
Message heartbeatInvokeMessage = new Message(MessageType.HEARTBEAT_INVOKE, "");
var nextInstance = this.findNextInstance(currentId);
var heartbeatInvokeMessage = new Message(MessageType.HEARTBEAT_INVOKE, "");
nextInstance.onMessage(heartbeatInvokeMessage);
}

View File

@@ -43,13 +43,13 @@ public class RingApp {
public static void main(String[] args) {
Map<Integer, Instance> instanceMap = new HashMap<>();
MessageManager messageManager = new RingMessageManager(instanceMap);
var messageManager = new RingMessageManager(instanceMap);
RingInstance instance1 = new RingInstance(messageManager, 1, 1);
RingInstance instance2 = new RingInstance(messageManager, 2, 1);
RingInstance instance3 = new RingInstance(messageManager, 3, 1);
RingInstance instance4 = new RingInstance(messageManager, 4, 1);
RingInstance instance5 = new RingInstance(messageManager, 5, 1);
var instance1 = new RingInstance(messageManager, 1, 1);
var instance2 = new RingInstance(messageManager, 2, 1);
var instance3 = new RingInstance(messageManager, 3, 1);
var instance4 = new RingInstance(messageManager, 4, 1);
var instance5 = new RingInstance(messageManager, 5, 1);
instanceMap.put(1, instance1);
instanceMap.put(2, instance2);
@@ -59,11 +59,11 @@ public class RingApp {
instance2.onMessage(new Message(MessageType.HEARTBEAT_INVOKE, ""));
final Thread thread1 = new Thread(instance1);
final Thread thread2 = new Thread(instance2);
final Thread thread3 = new Thread(instance3);
final Thread thread4 = new Thread(instance4);
final Thread thread5 = new Thread(instance5);
final var thread1 = new Thread(instance1);
final var thread2 = new Thread(instance2);
final var thread3 = new Thread(instance3);
final var thread4 = new Thread(instance4);
final var thread5 = new Thread(instance5);
thread1.start();
thread2.start();

View File

@@ -62,7 +62,7 @@ public class RingInstance extends AbstractInstance {
@Override
protected void handleHeartbeatInvokeMessage() {
try {
boolean isLeaderAlive = messageManager.sendHeartbeatMessage(this.leaderId);
var isLeaderAlive = messageManager.sendHeartbeatMessage(this.leaderId);
if (isLeaderAlive) {
LOGGER.info("Instance " + localId + "- Leader is alive. Start next heartbeat in 5 second.");
Thread.sleep(HEARTBEAT_INTERVAL);
@@ -84,15 +84,14 @@ public class RingInstance extends AbstractInstance {
*/
@Override
protected void handleElectionMessage(Message message) {
String content = message.getContent();
var content = message.getContent();
LOGGER.info("Instance " + localId + " - Election Message: " + content);
List<Integer> candidateList =
Arrays.stream(content.trim().split(","))
.map(Integer::valueOf)
.sorted()
.collect(Collectors.toList());
var candidateList = Arrays.stream(content.trim().split(","))
.map(Integer::valueOf)
.sorted()
.collect(Collectors.toList());
if (candidateList.contains(localId)) {
int newLeaderId = candidateList.get(0);
var newLeaderId = candidateList.get(0);
LOGGER.info("Instance " + localId + " - New leader should be " + newLeaderId + ".");
messageManager.sendLeaderMessage(localId, newLeaderId);
} else {
@@ -107,7 +106,7 @@ public class RingInstance extends AbstractInstance {
*/
@Override
protected void handleLeaderMessage(Message message) {
int newLeaderId = Integer.valueOf(message.getContent());
var newLeaderId = Integer.valueOf(message.getContent());
if (this.leaderId != newLeaderId) {
LOGGER.info("Instance " + localId + " - Update leaderID");
this.leaderId = newLeaderId;

View File

@@ -49,8 +49,8 @@ public class RingMessageManager extends AbstractMessageManager {
*/
@Override
public boolean sendHeartbeatMessage(int leaderId) {
Instance leaderInstance = instanceMap.get(leaderId);
boolean alive = leaderInstance.isAlive();
var leaderInstance = instanceMap.get(leaderId);
var alive = leaderInstance.isAlive();
return alive;
}
@@ -64,8 +64,8 @@ public class RingMessageManager extends AbstractMessageManager {
*/
@Override
public boolean sendElectionMessage(int currentId, String content) {
Instance nextInstance = this.findNextInstance(currentId);
Message electionMessage = new Message(MessageType.ELECTION, content);
var nextInstance = this.findNextInstance(currentId);
var electionMessage = new Message(MessageType.ELECTION, content);
nextInstance.onMessage(electionMessage);
return true;
}
@@ -79,8 +79,8 @@ public class RingMessageManager extends AbstractMessageManager {
*/
@Override
public boolean sendLeaderMessage(int currentId, int leaderId) {
Instance nextInstance = this.findNextInstance(currentId);
Message leaderMessage = new Message(MessageType.LEADER, String.valueOf(leaderId));
var nextInstance = this.findNextInstance(currentId);
var leaderMessage = new Message(MessageType.LEADER, String.valueOf(leaderId));
nextInstance.onMessage(leaderMessage);
return true;
}
@@ -92,8 +92,8 @@ public class RingMessageManager extends AbstractMessageManager {
*/
@Override
public void sendHeartbeatInvokeMessage(int currentId) {
Instance nextInstance = this.findNextInstance(currentId);
Message heartbeatInvokeMessage = new Message(MessageType.HEARTBEAT_INVOKE, "");
var nextInstance = this.findNextInstance(currentId);
var heartbeatInvokeMessage = new Message(MessageType.HEARTBEAT_INVOKE, "");
nextInstance.onMessage(heartbeatInvokeMessage);
}