private StorableMessageMetaData getStorableMessageMetaData(final long messageId, final InputStream stream) throws SQLException { try { int typeOrdinal = stream.read() & 0xff; MessageMetaDataType type = MessageMetaDataTypeRegistry.fromOrdinal(typeOrdinal); try (QpidByteBuffer buf = QpidByteBuffer.asQpidByteBuffer(stream)) { return type.createMetaData(buf); } } catch (IOException | RuntimeException e) { throw new StoreException("Failed to stream metadata for message with id " + messageId, e); } }
underlying[0] = (byte) metaData.getType().ordinal(); try (QpidByteBuffer buf = QpidByteBuffer.wrap(underlying))
@Override public boolean handle(StoredMessage<?> message) { StorableMessageMetaData metaData = message.getMetaData(); @SuppressWarnings("rawtypes") MessageMetaDataType type = metaData.getType(); @SuppressWarnings("unchecked") ServerMessage<?> serverMessage = type.createMessage(message); _recoveredMessages.put(message.getMessageNumber(), serverMessage); _unusedMessages.put(message.getMessageNumber(), message); return true; }
@Override public void objectToEntry(final StorableMessageMetaData metaData, final TupleOutput output) { final int bodySize = 1 + metaData.getStorableSize(); byte[] underlying = new byte[bodySize]; underlying[0] = (byte) metaData.getType().ordinal(); QpidByteBuffer buf = QpidByteBuffer.wrap(underlying); buf.position(1); buf = buf.slice(); metaData.writeToBuffer(buf); output.writeInt(bodySize); output.writeFast(underlying); } }
@Override public StorableMessageMetaData entryToObject(DatabaseEntry entry) { try(DataInputStream stream = new DataInputStream(new ByteArrayInputStream(entry.getData(), entry.getOffset(), entry.getSize()))) { final int bodySize = stream.readInt() ^ 0x80000000; final int metaDataType = stream.readByte() & 0xff; MessageMetaDataType type = MessageMetaDataTypeRegistry.fromOrdinal(metaDataType); try (QpidByteBuffer buf = QpidByteBuffer.asQpidByteBuffer(stream)) { return type.createMetaData(buf); } } catch (IOException | RuntimeException e) { throw new StoreException(String.format("Unable to convert entry %s to metadata", entry)); } }
private synchronized ServerMessage<?> getRecoveredMessage(final long messageId) { MessageReference<? extends ServerMessage<?>> ref = _recoveredMessages.get(messageId); if (ref == null) { StoredMessage<?> message = _storeReader.getMessage(messageId); if(message != null) { StorableMessageMetaData metaData = message.getMetaData(); @SuppressWarnings("rawtypes") MessageMetaDataType type = metaData.getType(); @SuppressWarnings("unchecked") ServerMessage<?> serverMessage = type.createMessage(message); ref = serverMessage.newReference(); _recoveredMessages.put(messageId, ref); } } return ref == null ? null : ref.getMessage(); }
@Override public void objectToEntry(StorableMessageMetaData metaData, DatabaseEntry entry) { final int bodySize = 1 + metaData.getStorableSize(); byte[] underlying = new byte[4+bodySize]; underlying[4] = (byte) metaData.getType().ordinal(); try (QpidByteBuffer buf = QpidByteBuffer.wrap(underlying)) { buf.putInt(bodySize ^ 0x80000000); buf.position(5); try (QpidByteBuffer bufSlice = buf.slice()) { metaData.writeToBuffer(bufSlice); } } entry.setData(underlying); } }
StorableMessageMetaData storableMessageMetaData = metaDataType.createMetaData(buf); handle = store.addMessage(storableMessageMetaData);
public MessageRecord(final StoredMessage<?> storedMessage) { _messageNumber = storedMessage.getMessageNumber(); _metaData = new byte[1 + storedMessage.getMetadataSize()]; try (QpidByteBuffer buf = QpidByteBuffer.wrap(_metaData)) { buf.put((byte) storedMessage.getMetaData().getType().ordinal()); storedMessage.getMetaData().writeToBuffer(buf); } _content = new byte[storedMessage.getContentSize()]; try (QpidByteBuffer content = storedMessage.getContent(0, storedMessage.getContentSize())) { content.get(_content); } }