處理所有的傳入的數據包 @Override public void route(IQ packet) { iqRouter.route(packet); } @Override public void route(Message packet) { messageRouter.route(packet); } @Override public void route(Presence packet) { presenceRouter.route(packet); }
實際根據 packet 的類型不同,路由到具體 Router:
IQRouter
MessageRouter
PresenceRouter
每次 route(),都會在之前和之後調用攔截器:
// Invoke the interceptors before we process the read packet InterceptorManager.getInstance().invokeInterceptors(packet, session, true, false);
// Invoke the interceptors after we have processed the read packet InterceptorManager.getInstance().invokeInterceptors(packet, session, true, true);
在 PacketRouterImpl 中也提供了一種處理任何 Packet 的方法:
@Override public void route(Packet packet) { if (packet instanceof Message) { route((Message)packet); } else if (packet instanceof Presence) { route((Presence)packet); } else if (packet instanceof IQ) { route((IQ)packet); } else { throw new IllegalArgumentException(); } }
但可以看到,其實只處理了
IQ
Message
Presence
三種包。
另一個實現包 SessionPacketRouter 也是類似,都是轉發到具體了 Router:
@Override public void route(Packet packet) { // Security: Don't allow users to send packets on behalf of other users packet.setFrom(session.getAddress()); if(packet instanceof IQ) { route((IQ)packet); } else if(packet instanceof Message) { route((Message)packet); } else if(packet instanceof Presence) { route((Presence)packet); } } @Override public void route(IQ packet) { packet.setFrom(session.getAddress()); router.route(packet); session.incrementClientPacketCount(); } @Override public void route(Message packet) { packet.setFrom(session.getAddress()); router.route(packet); session.incrementClientPacketCount(); } @Override public void route(Presence packet) { packet.setFrom(session.getAddress()); router.route(packet); session.incrementClientPacketCount(); }
判斷 Packet 的類型,然後轉發到相應的 Router。
原文地址:https://www.zhblog.net/go/java/openfire/openfire-packet-router?t=585