@Override public synchronized Channel getChannel(final long channelID, final int confWindowSize) { Channel channel = channels.get(channelID); if (channel == null) { channel = new ChannelImpl(this, channelID, confWindowSize, outgoingInterceptors); channels.put(channelID, channel); } return channel; }
@Override public boolean send(final Packet packet) { return send(packet, -1, false, false); }
private boolean send(final Packet packet, final int reconnectID, final boolean flush, final boolean batch) { if (invokeInterceptors(packet, interceptors, connection) != null) { return false; waitForFailOver("RemotingConnectionID=" + (connection == null ? "NULL" : connection.getID()) + " timed-out waiting for fail-over condition on non-blocking send"); addResendPacket(packet); checkReconnectID(reconnectID);
@Override public void replayCommands(final int otherLastConfirmedCommandID) { if (resendCache != null) { if (logger.isTraceEnabled()) { logger.trace("RemotingConnectionID=" + (connection == null ? "NULL" : connection.getID()) + " Replaying commands on channelID=" + id); } clearUpTo(otherLastConfirmedCommandID); for (final Packet packet : resendCache) { doWrite(packet); } } }
@Override public void handlePacket(final Packet packet) { if (packet.getType() == PacketImpl.PACKETS_CONFIRMED) { if (resendCache != null) { final PacketsConfirmedMessage msg = (PacketsConfirmedMessage) packet; clearUpTo(msg.getCommandID()); } if (!connection.isClient()) { handler.handlePacket(packet); } return; } else { if (packet.isResponse()) { confirm(packet); lock.lock(); try { response = packet; sendCondition.signal(); } finally { lock.unlock(); } } else if (handler != null) { handler.handlePacket(packet); } } }
@Override public void handlePacket(final Packet packet) { if (packet.getType() == PacketImpl.PACKETS_CONFIRMED) { if (resendCache != null) { final PacketsConfirmedMessage msg = (PacketsConfirmedMessage) packet; clearUpTo(msg.getCommandID()); } if (!connection.isClient() && handler != null) { handler.handlePacket(packet); } return; } else { if (packet.isResponse()) { confirm(packet); handleAsyncResponse(packet); lock.lock(); try { response = packet; sendCondition.signal(); } finally { lock.unlock(); } } else if (handler != null) { handler.handlePacket(packet); } } }
@Override public synchronized void flushConfirmations() { if (resendCache != null && receivedBytes != 0) { receivedBytes = 0; final Packet confirmed = new PacketsConfirmedMessage(lastConfirmedCommandID.get()); confirmed.setChannelID(id); if (logger.isTraceEnabled()) { logger.trace("RemotingConnectionID=" + (connection == null ? "NULL" : connection.getID()) + " ChannelImpl::flushConfirmation flushing confirmation " + confirmed); } doWrite(confirmed); } }
private void doBufferReceived(final Packet packet) { if (ChannelImpl.invokeInterceptors(packet, incomingInterceptors, this) != null) { return; } synchronized (transferLock) { final Channel channel = channels.get(packet.getChannelID()); if (channel != null) { channel.handlePacket(packet); } } }
@Override public void returnBlocking() { returnBlocking(null); }
@Override public Packet sendBlocking(final Packet packet, byte expectedPacket) throws ActiveMQException { return sendBlocking(packet, -1, expectedPacket); }
@Test public void testPacketsConfirmedMessage() { AtomicInteger handleResponseCount = new AtomicInteger(); RequestPacket requestPacket = new RequestPacket((byte) 1); setResponseHandlerAsPerActiveMQSessionContext((packet, response) -> handleResponseCount.incrementAndGet()); channel.send(requestPacket); PacketsConfirmedMessage responsePacket = new PacketsConfirmedMessage((byte) 2); channel.handlePacket(responsePacket); assertEquals(0, channel.getCache().size()); }
@Override public void replayCommands(final int otherLastConfirmedCommandID) { if (resendCache != null) { if (logger.isTraceEnabled()) { logger.trace("RemotingConnectionID=" + (connection == null ? "NULL" : connection.getID()) + " Replaying commands on channelID=" + id); } clearUpTo(otherLastConfirmedCommandID); for (final Packet packet : resendCache) { doWrite(packet); } } }
@Override public void handlePacket(final Packet packet) { if (packet.getType() == PacketImpl.PACKETS_CONFIRMED) { if (resendCache != null) { final PacketsConfirmedMessage msg = (PacketsConfirmedMessage) packet; clearUpTo(msg.getCommandID()); } if (!connection.isClient() && handler != null) { handler.handlePacket(packet); } return; } else { if (packet.isResponse()) { confirm(packet); handleAsyncResponse(packet); lock.lock(); try { response = packet; sendCondition.signal(); } finally { lock.unlock(); } } else if (handler != null) { handler.handlePacket(packet); } } }
@Override public void handlePacket(final Packet packet) { if (packet.getType() == PacketImpl.PACKETS_CONFIRMED) { if (resendCache != null) { final PacketsConfirmedMessage msg = (PacketsConfirmedMessage) packet; clearUpTo(msg.getCommandID()); } if (!connection.isClient()) { handler.handlePacket(packet); } return; } else { if (packet.isResponse()) { confirm(packet); lock.lock(); try { response = packet; sendCondition.signal(); } finally { lock.unlock(); } } else if (handler != null) { handler.handlePacket(packet); } } }
@Override public void confirm(final Packet packet) { if (resendCache != null && packet.isRequiresConfirmations()) { lastConfirmedCommandID.incrementAndGet(); if (logger.isTraceEnabled()) { logger.trace("RemotingConnectionID=" + (connection == null ? "NULL" : connection.getID()) + " ChannelImpl::confirming packet " + packet + " last commandID=" + lastConfirmedCommandID); } receivedBytes += packet.getPacketSize(); if (receivedBytes >= confWindowSize) { receivedBytes = 0; final Packet confirmed = new PacketsConfirmedMessage(lastConfirmedCommandID.get()); confirmed.setChannelID(id); doWrite(confirmed); } } }
private void doBufferReceived(final Packet packet) { if (ChannelImpl.invokeInterceptors(packet, incomingInterceptors, this) != null) { return; } synchronized (transferLock) { final Channel channel = channels.get(packet.getChannelID()); if (channel != null) { channel.handlePacket(packet); } } }
@Override public void returnBlocking() { returnBlocking(null); }
@Override public Packet sendBlocking(final Packet packet, byte expectedPacket) throws ActiveMQException { return sendBlocking(packet, -1, expectedPacket); }
@Test public void testCorrelation() { AtomicInteger handleResponseCount = new AtomicInteger(); RequestPacket requestPacket = new RequestPacket((byte) 1); setResponseHandlerAsPerActiveMQSessionContext((packet, response) -> handleResponseCount.incrementAndGet()); channel.send(requestPacket); assertEquals(1, channel.getCache().size()); ResponsePacket responsePacket = new ResponsePacket((byte) 1); responsePacket.setCorrelationID(requestPacket.getCorrelationID()); channel.handlePacket(responsePacket); assertEquals(1, handleResponseCount.get()); assertEquals(0, channel.getCache().size()); }
final int reconnectID, byte expectedPacket) throws ActiveMQException { String interceptionResult = invokeInterceptors(packet, interceptors, connection); waitForFailOver("RemotingConnectionID=" + (connection == null ? "NULL" : connection.getID()) + " timed-out waiting for fail-over condition on blocking send"); addResendPacket(packet); checkReconnectID(reconnectID);