private Subscription _subscribeNow(final String subject, final MessageCallback callback, final boolean local) { if (BuiltInServices.ServerBus.name().equals(subject) && subscriptions.containsKey(BuiltInServices.ServerBus.name())) return null; final WrappedCallbackHolder wrappedCallbackHolder = new WrappedCallbackHolder(callback); fireAllSubscribeListeners(subject, local, directSubscribe(subject, callback, local, wrappedCallbackHolder)); return new Subscription() { @Override public void remove() { final List<MessageCallback> cbs = local ? localSubscriptions.get(subject) : subscriptions.get(subject); if (cbs != null) { cbs.remove(wrappedCallbackHolder.getWrappedCallback()); if (cbs.isEmpty()) { unsubscribeAll(subject); } } } }; }
private void verifyConnectionToMessageSource(final Message message) { if (message.isFlagSet(RoutingFlag.FromRemote) && !message.isFlagSet(RoutingFlag.FromPeer) && !(BuiltInServices.ServerBus.name().equals(message.getSubject()) && BusCommand.Associate.name().equals(message.getCommandType()))) { // throws an exception if no queue is found getQueueByMessage(message); } }
@Override public void onUnsubscribe(final SubscriptionEvent event) { final String subject = event.getSubject(); if (subject.endsWith(":RespondTo:RPC") || subject.endsWith(":Errors:RPC")) { return; } encodeAndTransmit(CommandMessage.create() .toSubject(BuiltInServices.ServerBus.name()).command(RemoteUnsubscribe) .set(Subject, subject).set(PriorityProcessing, "1")); } });
@Override public void onSubscribe(final SubscriptionEvent event) { final String subject = event.getSubject(); if (event.isLocalOnly() || subject.startsWith("local:") || remotes.containsKey(subject)) { return; } if (subject.endsWith(":RespondTo:RPC") || subject.endsWith(":Errors:RPC")) { return; } if (event.isNew()) { encodeAndTransmit(CommandMessage.create() .toSubject(BuiltInServices.ServerBus.name()).command(RemoteSubscribe) .set(Subject, subject).set(PriorityProcessing, "1")); } } });
@Override public void onUnsubscribe(final SubscriptionEvent event) { if (event.isLocalOnly() || event.isRemote() || event.getSubject().startsWith("local:")) return; if (messageQueues.isEmpty()) return; MessageBuilder.createMessage() .toSubject(BuiltInServices.ClientBus.name()) .command(BusCommand.RemoteUnsubscribe) .with(MessageParts.Subject, event.getSubject()) .noErrorHandling().sendGlobalWith(ServerMessageBusImpl.this); } }
private void stop(final boolean sendDisconnect, final TransportError reason) { logger.info("stopping bus ..."); if (initialConnectTimer != null) { initialConnectTimer.cancel(); } if (degradeToUnitialized()) { setState(BusState.UNINITIALIZED); deferredMessages.clear(); remotes.clear(); deferredSubscriptions.clear(); } else if (state != BusState.LOCAL_ONLY) { setState(BusState.LOCAL_ONLY, reason); } // Optionally tell the server we're going away (this causes two POST requests) if (sendDisconnect && isRemoteCommunicationEnabled()) { encodeAndTransmit(CommandMessage.create() .toSubject(BuiltInServices.ServerBus.name()).command(BusCommand.Disconnect) .set(MessageParts.PriorityProcessing, "1")); } deferredMessages.addAll(transportHandler.stop(true)); }
@Override public void onSubscribe(final SubscriptionEvent event) { if (event.isLocalOnly() || event.isRemote() || event.getSubject().startsWith("local:")) return; MessageBuilder.createMessage() .toSubject(BuiltInServices.ClientBus.name()) .command(BusCommand.RemoteSubscribe) .with(MessageParts.Subject, event.getSubject()) .noErrorHandling().sendGlobalWith(ServerMessageBusImpl.this); } }
@Override public void handleProtocolExtension(final Message message) { switch (BusCommand.valueOf(message.getCommandType())) { case WebsocketChannelVerify: logger.info("received verification token for websocket connection"); longPollingTransport .transmit(Collections.singletonList(CommandMessage.create() .toSubject(BuiltInServices.ServerBus.name()).command(BusCommand.WebsocketChannelVerify) .copy(MessageParts.WebSocketToken, message))); break; case WebsocketChannelOpen: if (messageBus.getState() == BusState.CONNECTION_INTERRUPTED) messageBus.setState(BusState.CONNECTED); // send final message to open the channel transmitToSocket(webSocketChannel, getWebSocketNegotiationString()); longPollingTransport.stop(false); webSocketToken = message.get(String.class, MessageParts.WebSocketToken); logger.info("web socket channel successfully negotiated. comet channel deactivated. (reconnect token: " + webSocketToken + ")"); retries = 0; break; case WebsocketNegotiationFailed: hosed = true; unsupportedReason = "Negotiation Failed (Bad Key)"; disconnectSocket(webSocketChannel); webSocketChannel = null; messageBus.reconsiderTransport(); break; } }
subscribe(BuiltInServices.ServerBus.name(), new ServerBusMessageCallback(webSocketPath, webSocketPort));
private Subscription _subscribeNow(final String subject, final MessageCallback callback, final boolean local) { if (BuiltInServices.ServerBus.name().equals(subject) && subscriptions.containsKey(BuiltInServices.ServerBus.name())) return null; final WrappedCallbackHolder wrappedCallbackHolder = new WrappedCallbackHolder(callback); fireAllSubscribeListeners(subject, local, directSubscribe(subject, callback, local, wrappedCallbackHolder)); return new Subscription() { @Override public void remove() { final List<MessageCallback> cbs = local ? localSubscriptions.get(subject) : subscriptions.get(subject); if (cbs != null) { cbs.remove(wrappedCallbackHolder.getWrappedCallback()); if (cbs.isEmpty()) { unsubscribeAll(subject); } } } }; }
private void verifyConnectionToMessageSource(final Message message) { if (message.isFlagSet(RoutingFlag.FromRemote) && !message.isFlagSet(RoutingFlag.FromPeer) && !(BuiltInServices.ServerBus.name().equals(message.getSubject()) && BusCommand.Associate.name().equals(message.getCommandType()))) { // throws an exception if no queue is found getQueueByMessage(message); } }
@Override public void onUnsubscribe(final SubscriptionEvent event) { final String subject = event.getSubject(); if (subject.endsWith(":RespondTo:RPC") || subject.endsWith(":Errors:RPC")) { return; } encodeAndTransmit(CommandMessage.create() .toSubject(BuiltInServices.ServerBus.name()).command(RemoteUnsubscribe) .set(Subject, subject).set(PriorityProcessing, "1")); } });
@Override public void onSubscribe(final SubscriptionEvent event) { final String subject = event.getSubject(); if (event.isLocalOnly() || subject.startsWith("local:") || remotes.containsKey(subject)) { return; } if (subject.endsWith(":RespondTo:RPC") || subject.endsWith(":Errors:RPC")) { return; } if (event.isNew()) { encodeAndTransmit(CommandMessage.create() .toSubject(BuiltInServices.ServerBus.name()).command(RemoteSubscribe) .set(Subject, subject).set(PriorityProcessing, "1")); } } });
@Override public void onUnsubscribe(final SubscriptionEvent event) { if (event.isLocalOnly() || event.isRemote() || event.getSubject().startsWith("local:")) return; if (messageQueues.isEmpty()) return; MessageBuilder.createMessage() .toSubject(BuiltInServices.ClientBus.name()) .command(BusCommand.RemoteUnsubscribe) .with(MessageParts.Subject, event.getSubject()) .noErrorHandling().sendGlobalWith(ServerMessageBusImpl.this); } }
private void stop(final boolean sendDisconnect, final TransportError reason) { logger.info("stopping bus ..."); if (initialConnectTimer != null) { initialConnectTimer.cancel(); } if (degradeToUnitialized()) { setState(BusState.UNINITIALIZED); deferredMessages.clear(); remotes.clear(); deferredSubscriptions.clear(); } else if (state != BusState.LOCAL_ONLY) { setState(BusState.LOCAL_ONLY, reason); } // Optionally tell the server we're going away (this causes two POST requests) if (sendDisconnect && isRemoteCommunicationEnabled()) { encodeAndTransmit(CommandMessage.create() .toSubject(BuiltInServices.ServerBus.name()).command(BusCommand.Disconnect) .set(MessageParts.PriorityProcessing, "1")); } deferredMessages.addAll(transportHandler.stop(true)); }
@Override public void onSubscribe(final SubscriptionEvent event) { if (event.isLocalOnly() || event.isRemote() || event.getSubject().startsWith("local:")) return; MessageBuilder.createMessage() .toSubject(BuiltInServices.ClientBus.name()) .command(BusCommand.RemoteSubscribe) .with(MessageParts.Subject, event.getSubject()) .noErrorHandling().sendGlobalWith(ServerMessageBusImpl.this); } }