netty-socketio 集群随记

实现netty-socketio集群的方式

代码实例

    @PostConstruct
    public void subscribe() {
        pubSubStore.subscribe(PubSubType.DISPATCH, new PubSubListener<DispatchMessage>() {
            @Override
            public void onMessage(DispatchMessage message) {
                log.debug("subscribe: {}" ,message);
                Collection<SocketIOClient> clients = null;
                String room = message.getRoom();
                String namespace = message.getNamespace();
                Packet packet = message.getPacket();
                if (!ObjectUtils.isEmpty(namespace)&&!ObjectUtils.isEmpty(room)){
                    SocketIONamespace socketIONamespace = socketIOServer.getNamespace(namespace);
                    if (socketIONamespace != null){
                        clients = socketIONamespace.getRoomOperations(room).getClients();
                    }
                }else{
                    clients = socketIOServer.getBroadcastOperations().getClients();
                }
                if(!CollectionUtils.isEmpty(clients)){
                    clients.parallelStream().forEach(ioClient -> {
                        ioClient.sendEvent(Event.Event,packet.getData());
                    });
                }
            }
        }, DispatchMessage.class);
    }
}
@Component
@Slf4j
public class ClientUtil {

    @Resource
    private SocketIOServer socketIOServer;

    public void sendEvent(SocketIOClient client, MessageModel model) {
        log.debug("sendEvent--------------------------:{}", model);
        client.sendEvent(Event.Event, model);
    }

    public void sendNamespaceRoomEventExcluded(SocketIOClient client, MessageModel model) {
        log.debug("sendNamespaceRoomEventExcluded:{}", model);
        socketIOServer.getNamespace(model.getNamespace()).getRoomOperations(model.getRoomId()).sendEvent(Event.Event, client, model);
    }

    public void sendNamespaceRoomEvent(MessageModel model) {
        log.debug("sendNamespaceRoomEvent:{}", model);
        socketIOServer.getNamespace(model.getNamespace()).getRoomOperations(model.getRoomId()).sendEvent(Event.Event, model);
    }

    public void sendNamespaceEvent(MessageModel model) {
        log.debug("sendNamespaceRoomEvent:{}", model);
        socketIOServer.getNamespace(model.getNamespace()).getAllClients().parallelStream().forEach(client -> {
            client.sendEvent(Event.Event, model);
        });
    }

    public void sendRoomEvent(MessageModel model) {
        log.debug("sendNamespaceRoomEvent:{}", model);
        socketIOServer.getRoomOperations(model.getRoomId()).sendEvent(Event.Event, model);
    }
}

源码

查看源码可发现sendEvent方法最终还是调用了dispatch方法,由此可见我们只需要实现订阅就行。

/**
 * broadcast interface
 *
 */
public interface BroadcastOperations extends ClientOperations {

    Collection<SocketIOClient> getClients();

    <T> void send(Packet packet, BroadcastAckCallback<T> ackCallback);

    void sendEvent(String name, SocketIOClient excludedClient, Object... data);

    void sendEvent(String name, Predicate<SocketIOClient> excludePredicate, Object... data);

    <T> void sendEvent(String name, Object data, BroadcastAckCallback<T> ackCallback);

    <T> void sendEvent(String name, Object data, SocketIOClient excludedClient, BroadcastAckCallback<T> ackCallback);

    <T> void sendEvent(String name, Object data, Predicate<SocketIOClient> excludePredicate, BroadcastAckCallback<T> ackCallback);

}
    @Override
    public void sendEvent(String name, Predicate<SocketIOClient> excludePredicate, Object... data) {
        Packet packet = new Packet(PacketType.MESSAGE, EngineIOVersion.UNKNOWN);
        packet.setSubType(PacketType.EVENT);
        packet.setName(name);
        packet.setData(Arrays.asList(data));

        for (SocketIOClient client : clients) {
            packet.setEngineIOVersion(client.getEngineIOVersion());
            if (excludePredicate.test(client)) {
                continue;
            }
            client.send(packet);
        }
        dispatch(packet);
    }
    private void dispatch(Packet packet) {
        this.storeFactory.pubSubStore().publish(
                PubSubType.DISPATCH,
                new DispatchMessage(this.room, packet, this.namespace));
    }

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值