Java осень 2012 лекция 3

Preview:

Citation preview

Лекция 3. «Message System»

public class Address {static private AtomicInteger abonentIdCreator = new AtomicInteger();final private int abonentId;

public Address(){this.abonentId = abonentIdCreator.incrementAndGet();

}

public int getAbonentId() {return abonentId;

}}

public interface Abonent {Address getAddress();

}

public abstract class Msg {final private Address from;final private Address to;

public Msg(Address from, Address to){this.from = from;this.to = to;

}

protected Address getFrom(){return from;

}

protected Address getTo(){return to;

}

public abstract void exec(Abonent abonent);}

public abstract class MsgToFrontend extends Msg {

public MsgToFrontend(Address from, Address to) {super(from, to);

}

public void exec(Abonent abonent) {if(abonent instanceof Frontend){

exec((Frontend)abonent);}

}

public abstract void exec(Frontend frontend);}

public class MsgUpdateUserId extends MsgToFrontend {

final private int sessionId;final private int userId;

public GameInfoMsg(Address from, Address to, int sessionId, int userId) {super(from, to);this. sessionId = sessionId;this. userId = userId;

}

public void exec(Frontend frontend) {frontend.updateUserId(sessionId, userId);

}}

private Map<Address, ArrayBlockingQueue<Msg>> messages = new HashMap<Address, ArrayBlockingQueue<Msg>>();

public void sendMessage(Msg message){Queue<Msg> messageQueue = messages.get(message.getTo());messageQueue.add(message);

}

public void execForAbonent(Abonent abonent) {Queue<Msg> messageQueue = messages.get(abonent.getAddress());while(!messageQueue.isEmpty()){

Msg message = messageQueue.poll();message.exec(abonent);

}}

public void run() {while (true) {

messageSystem.execForAbonent(this);Thread.sleep(TICK_TIME);

}}