@Override public void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception { group.writeAndFlush(msg.retain()); } }
@Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { if (evt == WebSocketServerProtocolHandler .ServerHandshakeStateEvent.HANDSHAKE_COMPLETE) { ctx.pipeline().remove(HttpRequestHandler.class); group.writeAndFlush(new TextWebSocketFrame( "Client " + ctx.channel() + " joined")); group.add(ctx.channel()); } else { super.userEventTriggered(ctx, evt); } }
@Override public <T> void broadcastSync(T message, MediaType mediaType, Predicate<WebSocketSession> filter) { WebSocketFrame frame = webSocketMessageEncoder.encodeMessage(message, mediaType); try { webSocketSessionRepository.getChannelGroup().writeAndFlush(frame, ch -> { Attribute<NettyRxWebSocketSession> attr = ch.attr(NettyRxWebSocketSession.WEB_SOCKET_SESSION_KEY); NettyRxWebSocketSession s = attr.get(); return s != null && s.isOpen() && filter.test(s); }).sync(); } catch (InterruptedException e) { throw new WebSocketSessionException("Broadcast Interrupted"); } }
@Override public <T> Flowable<T> broadcast(T message, MediaType mediaType, Predicate<WebSocketSession> filter) { return Flowable.create(emitter -> { try { WebSocketFrame frame = webSocketMessageEncoder.encodeMessage(message, mediaType); webSocketSessionRepository.getChannelGroup().writeAndFlush(frame, ch -> { Attribute<NettyRxWebSocketSession> attr = ch.attr(NettyRxWebSocketSession.WEB_SOCKET_SESSION_KEY); NettyRxWebSocketSession s = attr.get(); return s != null && s.isOpen() && filter.test(s); }).addListener(future -> { if (future.isSuccess()) { emitter.onNext(message); emitter.onComplete(); } else { Throwable cause = future.cause(); emitter.onError(new WebSocketSessionException("Broadcast Failure: " + cause.getMessage(), cause)); } }); } catch (Throwable e) { emitter.onError(new WebSocketSessionException("Broadcast Failure: " + e.getMessage(), e)); } }, BackpressureStrategy.BUFFER); } }
private void handleOfflineNotice(RegisterMeta.Address address) { logger.info("OfflineNotice on {}.", address); Message msg = new Message(serializerType.value()); msg.messageCode(JProtocolHeader.OFFLINE_NOTICE); msg.data(address); subscriberChannels.writeAndFlush(msg); }
private void handleOfflineNotice(RegisterMeta.Address address) { logger.info("OfflineNotice on {}.", address); Message msg = new Message(serializerType.value()); msg.messageCode(JProtocolHeader.OFFLINE_NOTICE); msg.data(address); subscriberChannels.writeAndFlush(msg); }
subscriberChannels.writeAndFlush(msg, new ChannelMatcher() {
subscriberChannels.writeAndFlush(msg, new ChannelMatcher() {
private void handlePublish(RegisterMeta meta, Channel channel) { logger.info("Publish {} on channel{}.", meta, channel); attachPublishEventOnChannel(meta, channel); final RegisterMeta.ServiceMeta serviceMeta = meta.getServiceMeta(); ConfigWithVersion<ConcurrentMap<RegisterMeta.Address, RegisterMeta>> config = registerInfoContext.getRegisterMeta(serviceMeta); synchronized (registerInfoContext.publishLock(config)) { // putIfAbsent和config.newVersion()需要是原子操作, 所以这里加锁 if (config.getConfig().putIfAbsent(meta.getAddress(), meta) == null) { registerInfoContext.getServiceMeta(meta.getAddress()).add(serviceMeta); final Message msg = new Message(serializerType.value()); msg.messageCode(JProtocolHeader.PUBLISH_SERVICE); msg.version(config.newVersion()); // 版本号+1 msg.data(Pair.of(serviceMeta, meta)); subscriberChannels.writeAndFlush(msg, new ChannelMatcher() { @Override public boolean matches(Channel channel) { boolean doSend = isChannelSubscribeOnServiceMeta(serviceMeta, channel); if (doSend) { MessageNonAck msgNonAck = new MessageNonAck(serviceMeta, msg, channel); // 收到ack后会移除当前key(参见handleAcknowledge), 否则超时超时重发 messagesNonAck.put(msgNonAck.id, msgNonAck); } return doSend; } }); } } }
private void handlePublish(RegisterMeta meta, Channel channel) { logger.info("Publish {} on channel{}.", meta, channel); attachPublishEventOnChannel(meta, channel); final RegisterMeta.ServiceMeta serviceMeta = meta.getServiceMeta(); ConfigWithVersion<ConcurrentMap<RegisterMeta.Address, RegisterMeta>> config = registerInfoContext.getRegisterMeta(serviceMeta); synchronized (registerInfoContext.publishLock(config)) { // putIfAbsent和config.newVersion()需要是原子操作, 所以这里加锁 if (config.getConfig().putIfAbsent(meta.getAddress(), meta) == null) { registerInfoContext.getServiceMeta(meta.getAddress()).add(serviceMeta); final Message msg = new Message(serializerType.value()); msg.messageCode(JProtocolHeader.PUBLISH_SERVICE); msg.version(config.newVersion()); // 版本号+1 msg.data(Pair.of(serviceMeta, meta)); subscriberChannels.writeAndFlush(msg, new ChannelMatcher() { @Override public boolean matches(Channel channel) { boolean doSend = isChannelSubscribeOnServiceMeta(serviceMeta, channel); if (doSend) { MessageNonAck msgNonAck = new MessageNonAck(serviceMeta, msg, channel); // 收到ack后会移除当前key(参见handleAcknowledge), 否则超时超时重发 messagesNonAck.put(msgNonAck.id, msgNonAck); } return doSend; } }); } } }
@Override public Msg sendMessage(final Msg msg) { if (autoFlush.get()) { channels.writeAndFlush(msg); } else { channels.write(msg); } return null; }
public void send(Event event) { groups.get(event.type).writeAndFlush(new EventMessage(event)); }
public void send(Event event) { groups.get(event.type).writeAndFlush(new EventMessage(event)); }
@Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { if(evt == WebSocketServerProtocolHandler.ServerHandshakeStateEvent.HANDSHAKE_COMPLETE){ ctx.pipeline().remove(HttpRequestHandler.class); group.writeAndFlush(new TextWebSocketFrame("Client "+ctx.channel()+" joined!")); group.add(ctx.channel()); }else{ super.userEventTriggered(ctx, evt); } }
@EventHandler public void onPluginStatusChangeEvent(PluginStatusChangeEvent event) { if (channel != null && channel.isOpen()) { logger.trace("Writing event to client channels: " + event.toString()); clientChannels.writeAndFlush(new TextWebSocketFrame(createPluginStatusChangeJSON(event).toString())); } else { logger.trace("Channel not open; ignoring event: " + event); } }
@EventHandler public void onPresenceUpdateEvent(PresenceUpdateNotificationEvent event) { if (channel != null && channel.isOpen()) { logger.trace("Writing event to client channels: " + event.toString()); clientChannels.writeAndFlush(new TextWebSocketFrame(createPresenceUpdateJSON(event).toString())); } else { logger.trace("Channel not open; ignoring event: " + event); } }
@EventHandler public void onHubConfigurationUpdateEvent(HubConfigurationUpdateEvent event) { if (channel != null && channel.isOpen()) { logger.trace("Writing event to client channels: " + event.toString()); clientChannels.writeAndFlush(new TextWebSocketFrame(createHubConfigurationJSON(event).toString())); } }
private ResponseFuture writeAsyncToParents(SimulatorMessage message) { long messageId = message.getMessageId(); String futureKey = createFutureKey(message.getSource(), messageId, addressIndex); ResponseFuture future = createInstance(futureMap, futureKey); if (LOGGER.isTraceEnabled()) { LOGGER.trace(format("[%d] %s created ResponseFuture %s", messageId, localAddress, futureKey)); } OperationTypeCounter.sent(message.getOperationType()); getChannelGroup().writeAndFlush(message); return future; }
private void handleOfflineNotice(RegisterMeta.Address address) { logger.info("OfflineNotice on {}.", address); Message msg = new Message(serializerType.value()); msg.messageCode(JProtocolHeader.OFFLINE_NOTICE); msg.data(address); subscriberChannels.writeAndFlush(msg); }
private void handleOfflineNotice(RegisterMeta.Address address) { logger.info("OfflineNotice on {}.", address); Message msg = new Message(serializerType.value()); msg.messageCode(JProtocolHeader.OFFLINE_NOTICE); msg.data(address); subscriberChannels.writeAndFlush(msg); }