@Override public TransportConfiguration getLive() { return connector.getA(); }
@Override public void notifyNodeUp(long uniqueEventID, String nodeID, String backupGroupName, String scaleDownGroupName, Pair<TransportConfiguration, TransportConfiguration> connectorPair, boolean isLast) { try { // if it is our connector then set the live id used for failover if (connectorPair.getA() != null && TransportConfigurationUtil.isSameHost(connectorPair.getA(), currentConnectorConfig)) { liveNodeID = nodeID; } serverLocator.notifyNodeUp(uniqueEventID, nodeID, backupGroupName, scaleDownGroupName, connectorPair, isLast); } finally { if (isLast) { latchFinalTopology.countDown(); } } }
private TransportConfiguration selectConnector() { Pair<TransportConfiguration, TransportConfiguration>[] usedTopology; flushTopology(); synchronized (topologyArrayGuard) { usedTopology = topologyArray; } synchronized (this) { if (usedTopology != null && useTopologyForLoadBalancing) { if (logger.isTraceEnabled()) { logger.trace("Selecting connector from topology."); } int pos = loadBalancingPolicy.select(usedTopology.length); Pair<TransportConfiguration, TransportConfiguration> pair = usedTopology[pos]; return pair.getA(); } else { if (logger.isTraceEnabled()) { logger.trace("Selecting connector from initial connectors."); } int pos = loadBalancingPolicy.select(initialConnectors.length); return initialConnectors[pos]; } } }
private void internalUpdateArray(long time) { synchronized (topologyArrayGuard) { Collection<TopologyMemberImpl> membersCopy = topology.getMembers(); Pair<TransportConfiguration, TransportConfiguration>[] topologyArrayLocal = (Pair<TransportConfiguration, TransportConfiguration>[]) Array.newInstance(Pair.class, membersCopy.size()); int count = 0; for (TopologyMemberImpl pair : membersCopy) { Pair<TransportConfiguration, TransportConfiguration> transportConfigs = pair.getConnector(); topologyArrayLocal[count++] = new Pair<>(protocolManagerFactory.adaptTransportConfiguration(transportConfigs.getA()), protocolManagerFactory.adaptTransportConfiguration(transportConfigs.getB())); } this.topologyArray = topologyArrayLocal; } }
/** * We only need to check if the connection point to the same node, * don't need to compare the whole params map. * @param connection The connection to the target node * @return true if the connection point to the same node * as this member represents. */ @Override public boolean isMember(RemotingConnection connection) { return connection.isSameTarget(getConnector().getA(), getConnector().getB()); }
@Override public int readBytes(final byte[] value) throws JMSException { checkRead(); try { Pair<Integer, Integer> pairRead = streamReadBytes(message.getBodyBuffer(), len, value); len = pairRead.getA(); return pairRead.getB(); } catch (IllegalStateException e) { throw new MessageFormatException(e.getMessage()); } catch (IndexOutOfBoundsException e) { throw new MessageEOFException(""); } }
@Override public void notifyNodeUp(long uniqueEventID, final String nodeID, final String backupGroupName, final String scaleDownGroupName, final Pair<TransportConfiguration, TransportConfiguration> connectorPair, final boolean last) { if (logger.isTraceEnabled()) { logger.trace("NodeUp " + this + "::nodeID=" + nodeID + ", connectorPair=" + connectorPair, new Exception("trace")); } TopologyMemberImpl member = new TopologyMemberImpl(nodeID, backupGroupName, scaleDownGroupName, connectorPair.getA(), connectorPair.getB()); topology.updateMember(uniqueEventID, nodeID, member); TopologyMember actMember = topology.getMember(nodeID); if (actMember != null && actMember.getLive() != null && actMember.getBackup() != null) { HashSet<ClientSessionFactory> clonedFactories = new HashSet<>(); synchronized (factories) { clonedFactories.addAll(factories); } for (ClientSessionFactory factory : clonedFactories) { ((ClientSessionFactoryInternal) factory).setBackupConnector(actMember.getLive(), actMember.getBackup()); } } updateArraysAndPairs(uniqueEventID); if (last) { receivedTopology = true; } }
@Override protected ClusterTopologyChangeMessage updateTransportConfiguration(final ClusterTopologyChangeMessage topMessage) { updateTransportConfiguration(topMessage.getPair().getA()); updateTransportConfiguration(topMessage.getPair().getB()); return super.updateTransportConfiguration(topMessage); }
@Override public void encodeRest(final ActiveMQBuffer buffer) { buffer.writeBoolean(exit); buffer.writeString(nodeID); if (!exit) { if (pair.getA() != null) { buffer.writeBoolean(true); pair.getA().encode(buffer); } else { buffer.writeBoolean(false); } if (pair.getB() != null) { buffer.writeBoolean(true); pair.getB().encode(buffer); } else { buffer.writeBoolean(false); } buffer.writeBoolean(last); } }
@Override public void encodeRest(final ActiveMQBuffer buffer) { buffer.writeBoolean(exit); buffer.writeString(nodeID); buffer.writeLong(uniqueEventID); if (!exit) { if (pair.getA() != null) { buffer.writeBoolean(true); pair.getA().encode(buffer); } else { buffer.writeBoolean(false); } if (pair.getB() != null) { buffer.writeBoolean(true); pair.getB().encode(buffer); } else { buffer.writeBoolean(false); } buffer.writeBoolean(last); } buffer.writeNullableString(backupGroupName); }
if (transportConfig.getA() == null && transportConfig.getB() == null) { transportConfig = new Pair<>(conn.getTransportConnection().getConnectorConfig(), null);
public synchronized void closeConnectionFactory(ConnectionFactoryProperties properties) { Pair<ActiveMQConnectionFactory, AtomicInteger> pair = knownConnectionFactories.get(properties); int references = pair.getB().decrementAndGet(); if (pair.getA() != null && pair.getA() != defaultActiveMQConnectionFactory && references == 0) { knownConnectionFactories.remove(properties).getA().close(); } }
@Override public String getLastSentMessageID(String address) { Pair<Object, AtomicLong> value = targetAddressInfos.get(SimpleString.toSimpleString(address)); if (value != null) { return value.getA().toString(); } else { return null; } }
/** * We only need to check if the connection point to the same node, * don't need to compare the whole params map. * @param connection The connection to the target node * @return true if the connection point to the same node * as this member represents. */ @Override public boolean isMember(RemotingConnection connection) { return connection.isSameTarget(getConnector().getA(), getConnector().getB()); }
@Override protected ClusterTopologyChangeMessage updateTransportConfiguration(final ClusterTopologyChangeMessage topMessage) { updateTransportConfiguration(topMessage.getPair().getA()); updateTransportConfiguration(topMessage.getPair().getB()); return super.updateTransportConfiguration(topMessage); }
@Override public synchronized void start() throws Exception { Collection<Pair<ConnectorServiceFactory, ConnectorServiceConfiguration>> connectorServiceFactories = serviceRegistry.getConnectorServices(configuration.getConnectorServiceConfigurations()); for (Pair<ConnectorServiceFactory, ConnectorServiceConfiguration> pair : connectorServiceFactories) { try { createService(pair.getB(), pair.getA()); } catch (Throwable e) { ActiveMQServerLogger.LOGGER.errorStartingConnectorService(e, pair.getB().getConnectorName()); } } isStarted = true; }
void handlePubAck(int messageId) throws Exception { try { Pair<Long, Long> ref = outboundStore.publishAckd(messageId); if (ref != null) { session.getServerSession().individualAcknowledge(ref.getB(), ref.getA()); } } catch (ActiveMQIllegalStateException e) { log.warn("MQTT Client(" + session.getSessionState().getClientId() + ") attempted to Ack already Ack'd message"); } }