@Override public void disconnect(long consumerId, String queueName) { StompSubscription stompSubscription = subscriptions.remove(consumerId); if (stompSubscription != null) { StompFrame frame = connection.getFrameHandler().createStompFrame(StompCommands.ERROR.toString()); try { frame.setBody("consumer with ID " + consumerId + " disconnected by server"); connection.sendFrame(frame); } catch (UnsupportedEncodingException e) { HornetQServerLogger.LOGGER.errorEncodingStompPacket(e); } } }
StompSession( final StompConnection connection, final StompProtocolManager manager, OperationContext sessionContext) { this.connection = connection; this.manager = manager; this.sessionContext = sessionContext; this.consumerCredits = ConfigurationHelper.getIntProperty( TransportConstants.STOMP_CONSUMERS_CREDIT, TransportConstants.STOMP_DEFAULT_CONSUMERS_CREDIT, connection.getAcceptorUsed().getConfiguration()); }
public void sendInternalLarge(ServerMessageImpl message, boolean direct) throws Exception { int headerSize = message.getHeadersAndPropertiesEncodeSize(); if (headerSize >= connection.getMinLargeMessageSize()) { throw BUNDLE.headerTooBig(); } StorageManager storageManager = ((ServerSessionImpl) session).getStorageManager(); long id = storageManager.generateUniqueID(); LargeServerMessage largeMessage = storageManager.createLargeMessage(id, message); byte[] bytes = new byte[message.getBodyBuffer().writerIndex() - MessageImpl.BODY_OFFSET]; message.getBodyBuffer().readBytes(bytes); largeMessage.addBytes(bytes); largeMessage.releaseResources(); largeMessage.putLongProperty(Message.HDR_LARGE_BODY_SIZE, bytes.length); session.send(largeMessage, direct); largeMessage = null; }
public int sendMessage(ServerMessage serverMessage, long consumerID, int deliveryCount) { LargeServerMessageImpl largeMessage = null; ServerMessage newServerMessage = serverMessage; try { StompSubscription subscription = subscriptions.get(consumerID); StompFrame frame = null; if (serverMessage.isLargeMessage()) { newServerMessage = serverMessage.copy(); largeMessage = (LargeServerMessageImpl) serverMessage; BodyEncoder encoder = largeMessage.getBodyEncoder(); encoder.open(); int bodySize = (int) encoder.getLargeBodySize(); // large message doesn't have a body. ((ServerMessageImpl) newServerMessage).createBody(bodySize); encoder.encode(newServerMessage.getBodyBuffer(), bodySize); encoder.close(); } if (serverMessage.getBooleanProperty(Message.HDR_LARGE_COMPRESSED)) { // decompress HornetQBuffer qbuff = newServerMessage.getBodyBuffer(); int bytesToRead = qbuff.writerIndex() - MessageImpl.BODY_OFFSET; Inflater inflater = new Inflater(); inflater.setInput(qbuff.readBytes(bytesToRead).toByteBuffer().array()); // get the real size of large message long sizeBody = newServerMessage.getLongProperty(Message.HDR_LARGE_BODY_SIZE); byte[] data = new byte[(int) sizeBody]; inflater.inflate(data); inflater.end(); qbuff.resetReaderIndex(); qbuff.resetWriterIndex(); qbuff.writeBytes(data); } frame = connection.createStompMessage(newServerMessage, subscription, deliveryCount); int length = frame.getEncodedSize(); if (subscription.getAck().equals(Stomp.Headers.Subscribe.AckModeValues.AUTO)) { if (manager.send(connection, frame)) { // we ack and commit only if the send is successful session.acknowledge(consumerID, newServerMessage.getMessageID()); session.commit(); } } else { messagesToAck.put( newServerMessage.getMessageID(), new Pair<Long, Integer>(consumerID, length)); // Must send AFTER adding to messagesToAck - or could get acked from client BEFORE it's been // added! manager.send(connection, frame); } return length; } catch (Exception e) { return 0; } finally { if (largeMessage != null) { largeMessage.releaseResources(); largeMessage = null; } } }
public void removeReadyListener(final ReadyListener listener) { connection.getTransportConnection().removeReadyListener(listener); }
public void addReadyListener(final ReadyListener listener) { connection.getTransportConnection().addReadyListener(listener); }