傳統輪詢模式存在無效請求多、實時性差的缺陷。基於 XMPP 協議的 TCP 長連接特性,結合 Openfire 服務器擴展組件機制,可構建高效的服務端主動推送系統。
private BlockingQueue<Packet> packetQueue = new LinkedBlockingQueue<>();
private class PacketSenderThread extends Thread {
private volatile Boolean shutdown = false;
public void run() {
while (!shutdown) {
Packet p = queue.take(); // 阻塞等待
componentManager.sendPacket(component, p); // 發送 XMPP 數據包
}
}
}
private Set<JID> subscriptions = ConcurrentHashMap.newKeySet();
public synchronized void subscription(JID jid) { subscriptions.add(jid); }
public synchronized void unsubscription(JID jid) { subscriptions.remove(jid); }
public class PushComponent extends AbstractComponent {
@Override public String getName() { return "pusher"; }
@Override protected void handleMessage(Message message) { /* 業務處理 */ }
}
public class PushManager {
private ExternalComponentManager manager = new ExternalComponentManager("192.168.149.214", 5275);
public void init() {
manager.setSecretKey("push", "test");
manager.addComponent(pushSvr.getPushDomain(), pushSvr.getComp());
}
}
AbstractXMPPConnection connection = SesseionHelper.newConn("192.168.149.214", 5223, "domain");
connection.login(); // 匿名登錄
connection.addAsyncStanzaListener(packet -> {
System.out.println(new Date() + ": " + packet.toXML());
}, stanza -> stanza instanceof Message);
<dependency>
<groupId>org.igniterealtime.whack</groupId>
<artifactId>core</artifactId>
<version>2.0.1-SNAPSHOT</version>
</dependency>
該方案利用 XMPP 標準協議,通過外部組件模式實現與 Openfire 解耦,支持多種 XMPP 服務器遷移。核心代碼不足 200 行,卻構建了完整的「訂閱-發布」推送閉環,適合輕量級即時通知場景。