private NetworkBridgeConfiguration getNetworkConfiguration(final BrokerInfo info) throws IOException { Properties properties = MarshallingSupport.stringToProperties(info.getNetworkProperties()); Map<String, String> props = createMap(properties); NetworkBridgeConfiguration config = new NetworkBridgeConfiguration(); IntrospectionSupport.setProperties(config, props, ""); return config; }
protected void startRemoteBridge() throws Exception { if (!bridgeFailed.get() && remoteBridgeStarted.compareAndSet(false, true)) { LOG.trace("{} starting remote Bridge, remoteBroker={}", configuration.getBrokerName(), remoteBroker); synchronized (this) { if (!isCreatedByDuplex()) { BrokerInfo brokerInfo = new BrokerInfo(); brokerInfo.setBrokerName(configuration.getBrokerName()); brokerInfo.setBrokerURL(configuration.getBrokerURL()); brokerInfo.setNetworkConnection(true); brokerInfo.setDuplexConnection(configuration.isDuplex()); if (!configuration.getDynamicallyIncludedDestinations().isEmpty()) { props.put(dynamicallyIncludedDestinationsKey, StringToListOfActiveMQDestinationConverter. convertFromActiveMQDestination(configuration.getDynamicallyIncludedDestinations(), true)); if (!configuration.getStaticallyIncludedDestinations().isEmpty()) { props.put(staticallyIncludedDestinationsKey, StringToListOfActiveMQDestinationConverter. convertFromActiveMQDestination(configuration.getStaticallyIncludedDestinations(), true)); brokerInfo.setBrokerId(this.localBrokerId); remoteBroker.oneway(brokerInfo); if (configuration.isSyncDurableSubs() && remoteBroker.getWireFormat().getVersion() >= CommandTypes.PROTOCOL_VERSION_DURABLE_SYNC) { remoteBroker.oneway(NetworkBridgeUtils.getBrokerSubscriptionInfo(brokerService, remoteConnectionInfo.setClientId(configuration.getName() + configuration.getClientIdToken() + configuration.getBrokerName() + configuration.getClientIdToken() + "outbound"); remoteConnectionInfo.setUserName(configuration.getUserName()); remoteConnectionInfo.setPassword(configuration.getPassword());
props = MarshallingSupport.stringToProperties(remoteBrokerInfo.getNetworkProperties()); IntrospectionSupport.getProperties(configuration, props, null); if (configuration.getExcludedDestinations() != null) { excludedDestinations = configuration.getExcludedDestinations().toArray( new ActiveMQDestination[configuration.getExcludedDestinations().size()]); if (configuration.getStaticallyIncludedDestinations() != null) { staticallyIncludedDestinations = configuration.getStaticallyIncludedDestinations().toArray( new ActiveMQDestination[configuration.getStaticallyIncludedDestinations().size()]); if (configuration.getDynamicallyIncludedDestinations() != null) { dynamicallyIncludedDestinations = configuration.getDynamicallyIncludedDestinations().toArray( new ActiveMQDestination[configuration.getDynamicallyIncludedDestinations().size()]);
protected void configureConsumerPrefetch(ConsumerInfo consumerInfo) { //If a consumer on an advisory topic and advisoryPrefetchSize has been explicitly //set then use it, else default to the prefetchSize setting if (AdvisorySupport.isAdvisoryTopic(consumerInfo.getDestination()) && configuration.getAdvisoryPrefetchSize() > 0) { consumerInfo.setPrefetchSize(configuration.getAdvisoryPrefetchSize()); } else { consumerInfo.setPrefetchSize(configuration.getPrefetchSize()); } }
private void startLocalBridge() throws Throwable { if (!bridgeFailed.get() && localBridgeStarted.compareAndSet(false, true)) { synchronized (this) { LOG.trace("{} starting local Bridge, localBroker={}", configuration.getBrokerName(), localBroker); if (!disposed.get()) { localClientId = configuration.getName() + configuration.getClientIdToken() + remoteBrokerName + configuration.getClientIdToken() + "inbound" + configuration.getClientIdToken() + configuration.getBrokerName(); localConnectionInfo.setClientId(localClientId); localConnectionInfo.setUserName(configuration.getUserName()); localConnectionInfo.setPassword(configuration.getPassword()); Transport originalTransport = remoteBroker; while (originalTransport instanceof TransportFilter) { localBroker.oneway(localSessionInfo); if (configuration.isDuplex()) { duplexLocalConnectionInfo.setClientId(configuration.getName() + configuration.getClientIdToken() + remoteBrokerName + configuration.getClientIdToken() + "inbound" + configuration.getClientIdToken() + "duplex" + configuration.getClientIdToken() + configuration.getBrokerName()); duplexLocalConnectionInfo.setUserName(configuration.getUserName()); duplexLocalConnectionInfo.setPassword(configuration.getPassword()); }); LOG.trace("{} register bridge ({}) to {}", new Object[]{ configuration.getBrokerName(), this, remoteBrokerName }); } else {
protected void startRemoteBridge() throws Exception { if (remoteBridgeStarted.compareAndSet(false, true)) { if (LOG.isTraceEnabled()) { LOG.trace(configuration.getBrokerName() + " starting remote Bridge, localBroker=" + localBroker); brokerInfo.setBrokerName(configuration.getBrokerName()); brokerInfo.setBrokerURL(configuration.getBrokerURL()); brokerInfo.setNetworkConnection(true); brokerInfo.setDuplexConnection(configuration.isDuplex()); remoteConnectionInfo.setClientId(configuration.getName() + "_" + configuration.getBrokerName() + "_outbound"); remoteConnectionInfo.setUserName(configuration.getUserName()); remoteConnectionInfo.setPassword(configuration.getPassword()); remoteBroker.oneway(remoteConnectionInfo); demandConsumerInfo.setDispatchAsync(configuration.isDispatchAsync()); String advisoryTopic = AdvisorySupport.CONSUMER_ADVISORY_TOPIC_PREFIX + configuration.getDestinationFilter(); if (configuration.isBridgeTempDestinations()) { advisoryTopic += "," + AdvisorySupport.TEMP_DESTINATION_COMPOSITE_ADVISORY_TOPIC; demandConsumerInfo.setPrefetchSize(configuration.getPrefetchSize()); remoteBroker.oneway(demandConsumerInfo); startedLatch.countDown();
try { NetworkBridgeConfiguration config = getNetworkConfiguration(info); if (config.isSyncDurableSubs() && protocolVersion.get() >= CommandTypes.PROTOCOL_VERSION_DURABLE_SYNC) { LOG.debug("SyncDurableSubs is enabled, Sending BrokerSubscriptionInfo"); dispatchSync(NetworkBridgeUtils.getBrokerSubscriptionInfo(this.broker.getBrokerService(), config)); config.setBrokerName(broker.getBrokerName()); if (config.isSyncDurableSubs() && protocolVersion.get() >= CommandTypes.PROTOCOL_VERSION_DURABLE_SYNC) { LOG.debug("SyncDurableSubs is enabled, Sending BrokerSubscriptionInfo"); dispatchSync(NetworkBridgeUtils.getBrokerSubscriptionInfo(this.broker.getBrokerService(), config)); String duplexNetworkConnectorId = config.getName() + "@" + info.getBrokerId(); CopyOnWriteArrayList<TransportConnection> connections = this.connector.getConnections(); synchronized (connections) { duplexBridge = config.getBridgeFactory().createNetworkBridge(config, localTransport, remoteBridgeTransport, listener); duplexBridge.setBrokerService(brokerService);
@Override public String toString() { return "DurableConduitBridge:" + configuration.getBrokerName() + "->" + getRemoteBrokerName(); } /**
protected DemandSubscription doCreateDemandSubscription(ConsumerInfo info) throws IOException { DemandSubscription result = new DemandSubscription(info); result.getLocalInfo().setConsumerId(new ConsumerId(localSessionInfo.getSessionId(), consumerIdGenerator.getNextSequenceId())); if (info.getDestination().isTemporary()) { // reset the local connection Id ActiveMQTempDestination dest = (ActiveMQTempDestination) result.getLocalInfo().getDestination(); dest.setConnectionId(localConnectionInfo.getConnectionId().toString()); } if (configuration.isDecreaseNetworkConsumerPriority()) { byte priority = (byte) configuration.getConsumerPriorityBase(); if (info.getBrokerPath() != null && info.getBrokerPath().length > 1) { // The longer the path to the consumer, the less it's consumer priority. priority -= info.getBrokerPath().length + 1; } result.getLocalInfo().setPriority(priority); LOG.debug("{} using priority: {} for subscription: {}", new Object[]{configuration.getBrokerName(), priority, info}); } configureDemandSubscription(info, result); return result; }
protected void setupStaticDestinations() { super.setupStaticDestinations(); ActiveMQDestination[] dests = configuration.isDynamicOnly() ? null : durableDestinations; if (dests != null) { for (ActiveMQDestination dest : dests) { String subName = subscription.getConsumerInfo().getSubscriptionName(); String clientId = subscription.getContext().getClientId(); if (subName != null && subName.equals(candidateSubName) && clientId.startsWith(configuration.getName())) { DemandSubscription sub = createDemandSubscription(dest, subName); if (sub != null) { } else if (configuration.isSyncDurableSubs() && !isPermissableDestination(dest)) { if (dest.isTopic()) { RegionBroker regionBroker = (RegionBroker) brokerService.getRegionBroker();
configuration.getBrokerName(), remoteBrokerName, Arrays.toString(md.getMessage().getBrokerPath()), md.getMessage() }); configuration.getBrokerName(), remoteBrokerName, md.getConsumerId(), message.getDestination(), Arrays.toString(message.getBrokerPath()), (LOG.isTraceEnabled() ? message : message.getMessageId()) }); if (isDuplex() && NetworkBridgeFilter.isAdvisoryInterpretedByNetworkBridge(message)) { if (message.isPersistent() || configuration.isAlwaysSyncSend()) { futureLocalBrokerInfo.set((BrokerInfo) command); } else if (command.isShutdownInfo()) { LOG.info("{} Shutting down {}", configuration.getBrokerName(), configuration.getName()); stop(); } else if (command.getClass() == ConnectionError.class) {
synchronized (this) { if (LOG.isTraceEnabled()) { LOG.trace(configuration.getBrokerName() + " starting local Bridge, localBroker=" + localBroker); localConnectionInfo = new ConnectionInfo(); localConnectionInfo.setConnectionId(new ConnectionId(idGenerator.generateId())); localClientId = configuration.getName() + "_" + remoteBrokerName + "_inbound_" + configuration.getBrokerName(); localConnectionInfo.setClientId(localClientId); localConnectionInfo.setUserName(configuration.getUserName()); localConnectionInfo.setPassword(configuration.getPassword()); Transport originalTransport = remoteBroker; while (originalTransport instanceof TransportFilter) {
config.getDynamicallyIncludedDestinations())) { subscriptionInfos.add(sub.getConsumerInfo().copy()); if (ab != null && brokerService.isUseVirtualDestSubs() && config.isUseVirtualDestSubs()) { for (ConsumerInfo info : ab.getVirtualDestinationConsumers().keySet()) { if (NetworkBridgeUtils.isForcedDurable(info, config.getDynamicallyIncludedDestinations())) { subscriptionInfos.add(info.copy());
Properties properties = MarshallingSupport.stringToProperties(info.getNetworkProperties()); Map<String, String> props = createMap(properties); NetworkBridgeConfiguration config = new NetworkBridgeConfiguration(); IntrospectionSupport.setProperties(config, props, ""); config.setBrokerName(broker.getBrokerName()); String duplexNetworkConnectorId = config.getName() + "@" + info.getBrokerId(); CopyOnWriteArrayList<TransportConnection> connections = this.connector.getConnections(); synchronized (connections) {
protected boolean isProxyBridgeSubscription(String clientId, String subName) { if (subName != null && clientId != null) { if (subName.startsWith(DURABLE_SUB_PREFIX) && !clientId.startsWith(configuration.getName())) { return true; } } return false; }
private void serviceRemoteConsumerAdvisory(DataStructure data) throws IOException { final int networkTTL = configuration.getConsumerTTL(); if (data.getClass() == ConsumerInfo.class) { LOG.debug("{} Ignoring sub from {}, browsers explicitly suppressed", configuration.getBrokerName(), remoteBrokerName); return; configuration.getBrokerName(), remoteBrokerName, networkTTL, info }); return; configuration.getBrokerName(), remoteBrokerName, info }); return; configuration.getBrokerName(), remoteBrokerName, info.getDestination(), info }); return; if (path != null && networkTTL > -1 && path.length >= networkTTL) { LOG.debug("{} Ignoring destination {} restricted to {} network hops only", new Object[]{ configuration.getBrokerName(), destInfo, networkTTL }); return; LOG.debug("{} Ignoring destination {} already routed through this broker once", configuration.getBrokerName(), destInfo); return; configuration.getBrokerName(), (destInfo.isAddOperation() ? "add" : "remove"), localBroker, remoteBrokerName, destInfo });
if (localBrokerId.equals(remoteBrokerId)) { LOG.trace("{} disconnecting remote loop back connector for: {}, with id: {}", new Object[]{ configuration.getBrokerName(), remoteBrokerName, remoteBrokerId }); ServiceSupport.dispose(localBroker); if (configuration.isUseBrokerNamesAsIdSeed()) { idGenerator = new IdGenerator(brokerService.getBrokerName() + "->" + remoteBrokerName);
} else { if (isDuplex()) { LOG.trace("{} duplex command type: {}", configuration.getBrokerName(), command.getDataStructureType()); if (command.isMessage()) { final ActiveMQMessage message = (ActiveMQMessage) command; if (message.isResponseRequired() || configuration.isAlwaysSyncSend()) { duplexInboundLocalBroker.asyncRequest(message, new ResponseCallback() { final int correlationId = message.getCommandId(); if (message.isResponseRequired() || configuration.isAlwaysSyncSend()) { Response reply = new Response(); reply.setCorrelationId(message.getCommandId());
!configuration.isConduitNetworkQueueSubscriptions()) { return false; if (canConduit(ds) && filter.matches(info.getDestination())) { LOG.debug("{} {} with ids {} matched (add interest) {}", new Object[]{ configuration.getBrokerName(), info, info.getNetworkConsumerIds(), ds });
protected void configureDemandSubscription(ConsumerInfo info, DemandSubscription sub) throws IOException { sub.getLocalInfo().setDispatchAsync(configuration.isDispatchAsync()); sub.getLocalInfo().setPrefetchSize(configuration.getPrefetchSize()); subscriptionMapByLocalId.put(sub.getLocalInfo().getConsumerId(), sub); subscriptionMapByRemoteId.put(sub.getRemoteInfo().getConsumerId(), sub); if (!info.isDurable()) { // This works for now since we use a VM connection to the local broker. // may need to change if we ever subscribe to a remote broker. sub.getLocalInfo().setAdditionalPredicate(createNetworkBridgeFilter(info)); } else { // need to ack this message if it is ignored as it is durable so // we check before we send. see: suppressMessageDispatch() } }