@Override public synchronized void deleteFile() throws Exception { validateFile(); releaseResources(); storageManager.deleteLargeMessageFile(this); }
@Override public LargeServerMessage createLargeMessage() { return new LargeServerMessageImpl(this); }
private void checkDelete() throws Exception { if (getRefCount() <= 0) { if (logger.isTraceEnabled()) { logger.trace("Deleting file " + file + " as the usage was complete"); } try { deleteFile(); } catch (Exception e) { ActiveMQServerLogger.LOGGER.error(e.getMessage(), e); } } }
@Override public synchronized void decrementDelayDeletionCount() throws Exception { int count = delayDeletionCount.decrementAndGet(); decrementRefCount(); if (count == 0) { checkDelete(); } }
LargeServerMessageImpl largeServerMessage = new LargeServerMessageImpl(storageManager); largeServerMessage.setMessageID(1234); largeServerMessage.addBytes(new byte[0]); assertTrue(open.get()); largeServerMessage.releaseResources(); assertTrue(sync.get());
@Test public void testLargeMessageBodySize() throws Exception { ActiveMQServer server = createServer(true, isNetty(), storeType); server.start(); LargeServerMessageImpl fileMessage = new LargeServerMessageImpl((JournalStorageManager) server.getStorageManager()); fileMessage.setMessageID(1005); Assert.assertEquals(0, fileMessage.getBodyBufferSize()); for (int i = 0; i < largeMessageSize; i++) { fileMessage.addBytes(new byte[]{ActiveMQTestBase.getSamplebyte(i)}); } Assert.assertEquals(largeMessageSize, fileMessage.getBodyBufferSize()); // The server would be doing this fileMessage.putLongProperty(Message.HDR_LARGE_BODY_SIZE, largeMessageSize); fileMessage.releaseResources(); Assert.assertEquals(largeMessageSize, fileMessage.getBodyBufferSize()); }
@Override public LargeServerMessage createLargeMessage(final long id, final Message message) throws Exception { readLock(); try { if (isReplicated()) { replicator.largeMessageBegin(id); } LargeServerMessageImpl largeMessage = (LargeServerMessageImpl) createLargeMessage(); largeMessage.copyHeadersAndProperties(message); largeMessage.setMessageID(id); // We do this here to avoid a case where the replication gets a list without this file // to avoid a race largeMessage.validateFile(); if (largeMessage.isDurable()) { // We store a marker on the journal that the large file is pending long pendingRecordID = storePendingLargeMessage(id, LargeServerMessage.NO_PENDING_ID); largeMessage.setPendingRecordID(pendingRecordID); } return largeMessage; } finally { readUnLock(); } }
} finally { if (largeMessage != null) { largeMessage.releaseResources(); largeMessage = null;
/** * Copy constructor * * @param properties * @param copy * @param fileCopy */ private LargeServerMessageImpl(final LargeServerMessageImpl copy, TypedProperties properties, final SequentialFile fileCopy, final long newID) { super(copy, properties); storageManager = copy.storageManager; file = fileCopy; bodySize = copy.bodySize; setMessageID(newID); }
@Override public synchronized int decrementRefCount() throws Exception { int currentRefCount; if (paged) { RefCountMessageListener tmpContext = super.getContext(); setContext(null); currentRefCount = super.decrementRefCount(); setContext(tmpContext); } else { currentRefCount = super.decrementRefCount(); } // We use <= as this could be used by load. // because of a failure, no references were loaded, so we have 0... and we still need to delete the associated // files if (delayDeletionCount.get() <= 0) { checkDelete(); } return currentRefCount; }
/** This will check if a regular message needs to be converted as large message */ public static Message checkLargeMessage(Message message, StorageManager storageManager) throws Exception { if (message.isLargeMessage()) { return message; // nothing to be done on this case } if (message.getEncodeSize() > storageManager.getMaxRecordSize()) { return asLargeMessage(message, storageManager); } else { return message; } }
RoutingContext routingContext) throws Exception { final Message message = LargeServerMessageImpl.checkLargeMessage(messageParameter, storageManager);
@Test public void testSendServerMessage() throws Exception { ActiveMQServer server = createServer(true, isNetty(), storeType); server.start(); ClientSessionFactory sf = addSessionFactory(createSessionFactory(locator)); ClientSession session = sf.createSession(false, false); LargeServerMessageImpl fileMessage = new LargeServerMessageImpl((JournalStorageManager) server.getStorageManager()); fileMessage.setMessageID(1005); for (int i = 0; i < largeMessageSize; i++) { fileMessage.addBytes(new byte[]{ActiveMQTestBase.getSamplebyte(i)}); } // The server would be doing this fileMessage.putLongProperty(Message.HDR_LARGE_BODY_SIZE, largeMessageSize); fileMessage.releaseResources(); session.createQueue(ADDRESS, ADDRESS, true); ClientProducer prod = session.createProducer(ADDRESS); prod.send(fileMessage); fileMessage.deleteFile(); session.commit(); session.start(); ClientConsumer cons = session.createConsumer(ADDRESS); ClientMessage msg = cons.receive(5000); Assert.assertNotNull(msg); Assert.assertEquals(msg.getBodySize(), largeMessageSize); for (int i = 0; i < largeMessageSize; i++) { Assert.assertEquals(ActiveMQTestBase.getSamplebyte(i), msg.getBodyBuffer().readByte()); } msg.acknowledge(); session.commit(); }
} finally { if (largeMessage != null) { largeMessage.releaseResources(); largeMessage = null;
LargeServerMessageImpl fileMessage = new LargeServerMessageImpl((JournalStorageManager) server.getStorageManager()); fileMessage.setMessageID(1005); fileMessage.addBytes(new byte[]{ActiveMQTestBase.getSamplebyte(i)}); fileMessage.putLongProperty(Message.HDR_LARGE_BODY_SIZE, 2 * ActiveMQClient.DEFAULT_MIN_LARGE_MESSAGE_SIZE); fileMessage.releaseResources(); fileMessage.deleteFile();
@Override public Message copy() { SequentialFile newfile = storageManager.createFileForLargeMessage(messageID, durable); Message newMessage = new LargeServerMessageImpl(this, properties, newfile, messageID); return newMessage; }
ClientSession session = factory.createSession(false, false); LargeServerMessageImpl fileMessage = new LargeServerMessageImpl((JournalStorageManager) server.getStorageManager()); fileMessage.setMessageID(1005); fileMessage.setDurable(true); fileMessage.addBytes(new byte[]{getSamplebyte(i)}); fileMessage.putLongProperty(Message.HDR_LARGE_BODY_SIZE, 2 * ActiveMQClient.DEFAULT_MIN_LARGE_MESSAGE_SIZE); fileMessage.releaseResources(); fileMessage.deleteFile();
LargeServerMessage largeMessage = new LargeServerMessageImpl(storageManager);
ClientSession session = factory.createSession(false, false); LargeServerMessageImpl fileMessage = new LargeServerMessageImpl((JournalStorageManager) server.getStorageManager()); fileMessage.setMessageID(1005); fileMessage.setDurable(true); fileMessage.addBytes(new byte[]{getSamplebyte(i)}); fileMessage.putLongProperty(Message.HDR_LARGE_BODY_SIZE, 2 * ActiveMQClient.DEFAULT_MIN_LARGE_MESSAGE_SIZE); fileMessage.releaseResources(); prod.send(fileMessage); fileMessage.deleteFile();
LargeServerMessageImpl fileMessage = new LargeServerMessageImpl((JournalStorageManager) server.getStorageManager()); fileMessage.setMessageID(1005); fileMessage.setDurable(true); fileMessage.addBytes(new byte[]{getSamplebyte(i)}); fileMessage.putLongProperty(Message.HDR_LARGE_BODY_SIZE, 2 * ActiveMQClient.DEFAULT_MIN_LARGE_MESSAGE_SIZE); fileMessage.releaseResources(); fileMessage.deleteFile();