package com.forest.ape.mq.impl;
import java.util.List;
import com.forest.ape.mq.CallableHandler;
public class WorkerFactory {
RecvWorker rWorker = null;
SendWorker sWorker = null;
/**
* MQ want to tell who is leader(id) and followers,
* if i am leader, i must take responsibility to create sending queues, but if i am not leader,
* i just need to create my receiving queue
* @param leaderId
* @param followers
*/
@Deprecated
private WorkerFactory(String leaderId, List<String> followers, String epoch, String myId){
sWorker = new SendWorker(leaderId, followers, epoch);
}
private WorkerFactory(RecvWorker r, SendWorker s) {
rWorker = r;
sWorker = s;
}
WorkerFactory() {}
/**
* if i am leader, i must take responsibility to create sending queues
* @param leaderId
* @param followers
* @param epoch
* @return
*/
public WorkerFactory buildByLeader(String leaderId, List<String> followers, String epoch) {
sWorker = new SendWorker(leaderId, followers, epoch);
return new WorkerFactory(null, sWorker);
}
/**
* if i am not leader, i just need to create my receiving queue
* @param followerId
* @param epoch
* @return
*/
public WorkerFactory buildByFollower(String followerId, String epoch) {
rWorker = new RecvWorker(followerId, epoch);
return new WorkerFactory(rWorker, null);
}
/**
* if i am not leader, i just need to create my receiving queue
* @param followerId
* @param epoch
* @return
*/
public WorkerFactory buildByFollower(String followerId, String epoch, CallableHandler handler) {
rWorker = new RecvWorker(followerId, epoch);
rWorker.setCallHandler(handler);
return new WorkerFactory(rWorker, null);
}
/**
* leader dont consider anything about how msg sent and copes with it,
* but may be it wants to know whether it is sent
* @param data
* @param handler
*/
@Deprecated
public void enQueue(byte[] data, CallableHandler handler) {
throw new UnsupportedOperationException("you haven't implemented");
}
/**
* leader dont consider anything about how msg sent and copes with it,
* but may be it wants to know whether it is sent
* @param data
* @param handler
*/
public boolean enQueue(MQPacket packet) {
return sWorker.enQueue(packet);
}
/**
* leader dont consider anything about how msg sent and copes with it,
* @param data
* @param handler
*/
@Deprecated
public void enQueue(byte[] data) {
if (sWorker == null) {
throw new UnsupportedOperationException("you are not leader, don't do sending operation");
}
}
/**
* whatever role of learner, it should cope with the msg, must set it
* @param handler
*/
public void recvQueue(CallableHandler handler) {
rWorker.setCallHandler(handler);
}
public void start() {
if (sWorker != null)
sWorker.start();
if (rWorker != null)
rWorker.start();
}
}