private ActiveMQBuffer inflate(ActiveMQBuffer buffer) throws DataFormatException { int bytesToRead = buffer.readableBytes(); Inflater inflater = new Inflater(); inflater.setInput(ByteUtil.getActiveArray(buffer.readBytes(bytesToRead).toByteBuffer())); //get the real size of large message long sizeBody = getLongProperty(Message.HDR_LARGE_BODY_SIZE); byte[] data = new byte[(int) sizeBody]; inflater.inflate(data); inflater.end(); ActiveMQBuffer qbuff = ActiveMQBuffers.wrappedBuffer(data); qbuff.resetReaderIndex(); qbuff.resetWriterIndex(); qbuff.writeBytes(data); buffer = qbuff; return buffer; }
@Override public void writeBytes(final byte[] value, final int offset, final int length) throws JMSException { checkWrite(); getBuffer().writeByte(DataConstants.BYTES); getBuffer().writeInt(length); getBuffer().writeBytes(value, offset, length); }
@Override public void decodeRest(final ActiveMQBuffer buffer) { // Buffer comes in after having read standard headers and positioned at Beginning of body part receiveMessage(copyMessageBuffer(buffer.byteBuf(), DataConstants.SIZE_LONG + DataConstants.SIZE_INT)); buffer.readerIndex(buffer.capacity() - DataConstants.SIZE_LONG - DataConstants.SIZE_INT); this.consumerID = buffer.readLong(); this.deliveryCount = buffer.readInt(); }
@Override public void decodeRest(final ActiveMQBuffer buffer) { int size = buffer.readInt(); body = new byte[size]; buffer.readBytes(body); continues = buffer.readBoolean(); }
@Override public void encodeRest(final ActiveMQBuffer buffer) { buffer.writeBoolean(exists); buffer.writeBoolean(durable); buffer.writeBoolean(temporary); buffer.writeInt(consumerCount); buffer.writeLong(messageCount); buffer.writeNullableSimpleString(filterString); buffer.writeNullableSimpleString(address); buffer.writeNullableSimpleString(name); }
@Test public void testFlowControlMessageNotRouted() throws Exception { final SimpleString address = new SimpleString("testaddress"); server = createServer(false, isNetty()); AddressSettings addressSettings = new AddressSettings().setMaxSizeBytes(1024).setAddressFullMessagePolicy(AddressFullMessagePolicy.BLOCK); HierarchicalRepository<AddressSettings> repos = server.getAddressSettingsRepository(); repos.addMatch(address.toString(), addressSettings); server.start(); waitForServerToStart(server); locator.setProducerWindowSize(1024).setConsumerWindowSize(1024).setAckBatchSize(1024); sf = createSessionFactory(locator); session = sf.createSession(false, true, true, true); ClientProducer producer = session.createProducer(address); byte[] bytes = new byte[100]; final int numMessages = 1000; for (int i = 0; i < numMessages; i++) { ClientMessage message = session.createMessage(false); message.getBodyBuffer().writeBytes(bytes); producer.send(message); } }
server.getAddressSettingsRepository().addMatch("#", defaultSetting); server.start(); ServerLocator locator = createInVMNonHALocator().setBlockOnNonDurableSend(true).setBlockOnDurableSend(true).setBlockOnAcknowledge(true); ClientSession session = addClientSession(factory.createSession(false, true, true)); session.createQueue(MY_ADDRESS, MY_QUEUE, true); ClientProducer producer = addClientProducer(session.createProducer(MY_ADDRESS)); ClientMessage message = session.createMessage(true); message.getBodyBuffer().writeBytes(new byte[1024]); message.putIntProperty("order", i); producer.send(message); session.close(); factory.close(); locator.close(); Queue queue = ((LocalQueueBinding) server.getPostOffice().getBinding(new SimpleString(MY_QUEUE))).getQueue(); LinkedListIterator<MessageReference> totalIterator = queue.browserIterator();
final int numberOfMessages = 10; server.start(); locator.setConsumerWindowSize(0).setMinLargeMessageSize(100); session1 = sf.createSession(false, true, true); session1.start(); SimpleString ADDRESS = new SimpleString("some-queue"); session1.createQueue(ADDRESS, ADDRESS, true); ClientConsumerInternal cons1 = (ClientConsumerInternal) session1.createConsumer(ADDRESS); ClientMessage msg = session1.createMessage(true); msg.getBodyBuffer().writeBytes(new byte[600]); prod.send(msg); session1.close(); session1 = null; Assert.assertEquals(0, getMessageCount(server, ADDRESS.toString()));
@Test public void testPaging() throws Exception { final int CHUNK_SIZE = 50; int messageCount = 0; final String addressName = "testAddress"; final String queueName = "testQueue"; createQueue(0, addressName, queueName, null, false); createQueue(1, addressName, queueName, null, false); ClientSessionFactory sf = sfs[0]; ClientSession session = addClientSession(sf.createSession(false, false)); ClientProducer producer = addClientProducer(session.createProducer(addressName)); AddressSettings defaultSetting = new AddressSettings().setPageSizeBytes(10 * 1024).setMaxSizeBytes(20 * 1024); servers[0].getAddressSettingsRepository().addMatch("#", defaultSetting); while (!servers[0].getPagingManager().getPageStore(new SimpleString(addressName)).isPaging()) { for (int i = 0; i < CHUNK_SIZE; i++) { ClientMessage message = session.createMessage(true); message.getBodyBuffer().writeBytes(new byte[1024]); producer.send(message); messageCount++; } session.commit(); } servers[0].stop(); addConsumer(0, 1, queueName, null); for (int i = 0; i < messageCount; i++) { Assert.assertNotNull(consumers[0].getConsumer().receive(250)); } Assert.assertNull(consumers[0].getConsumer().receive(250)); removeConsumer(0); }
@Test public void testNoCursors() throws Exception { Configuration config = createDefaultInVMConfig().setJournalSyncNonTransactional(false); server = createServer(true, config, PagingTest.PAGE_SIZE, PagingTest.PAGE_MAX); server.start(); ServerLocator locator = createInVMNonHALocator(); ClientSessionFactory sf = locator.createSessionFactory(); ClientSession session = sf.createSession(); session.createQueue(ADDRESS, ADDRESS, true); ClientProducer prod = session.createProducer(ADDRESS); for (int i = 0; i < 100; i++) { Message msg = session.createMessage(true); msg.toCore().getBodyBuffer().writeBytes(new byte[1024]); prod.send(msg); } session.commit(); session.deleteQueue(ADDRESS); session.close(); sf.close(); locator.close(); server.stop(); server.start(); waitForNotPaging(server.getPagingManager().getPageStore(ADDRESS)); server.stop(); }
server.start(); locator = createInVMNonHALocator().setBlockOnNonDurableSend(true).setBlockOnDurableSend(true).setBlockOnAcknowledge(true); ClientSession session = sf.createSession(false, true, true); session.createQueue(PagingTest.ADDRESS, RoutingType.MULTICAST, PagingTest.ADDRESS, null, true); ClientProducer producer = session.createProducer(PagingTest.ADDRESS); message = session.createMessage(true); bodyLocal.writeBytes(body); message.putIntProperty(new SimpleString("id"), i); assertTrue(Wait.waitFor(() -> server.getState() == ActiveMQServer.SERVER_STATE.STOPPED, 5000, 200)); session.close(); sf.close(); locator.close();
@Test public void testOrder1() throws Throwable { boolean persistentMessages = true; Configuration config = createDefaultInVMConfig().setJournalSyncNonTransactional(false); ActiveMQServer server = createServer(true, config, PAGE_SIZE, PAGE_MAX, new HashMap<String, AddressSettings>()); server.start(); final int messageSize = 1024; final int numberOfMessages = 500; ServerLocator locator = createInVMNonHALocator().setClientFailureCheckPeriod(1000).setConnectionTTL(2000).setReconnectAttempts(0).setBlockOnNonDurableSend(false).setBlockOnDurableSend(false).setBlockOnAcknowledge(false).setConsumerWindowSize(1024 * 1024); ClientSessionFactory sf = createSessionFactory(locator); ClientSession session = sf.createSession(false, false, false); server.addAddressInfo(new AddressInfo(ADDRESS, RoutingType.ANYCAST)); server.createQueue(ADDRESS, RoutingType.ANYCAST, ADDRESS, null, true, false); ClientProducer producer = session.createProducer(PagingTest.ADDRESS); byte[] body = new byte[messageSize]; ByteBuffer bb = ByteBuffer.wrap(body); for (int j = 1; j <= messageSize; j++) { bb.put(getSamplebyte(j)); } for (int i = 0; i < numberOfMessages; i++) { ClientMessage message = session.createMessage(persistentMessages); ActiveMQBuffer bodyLocal = message.getBodyBuffer(); bodyLocal.writeBytes(body); message.putIntProperty(new SimpleString("id"), i); producer.send(message); } session.commit(); session.close(); }
@Test public void testRollbackOnSend() throws Exception { clearDataRecreateServerDirs(); Configuration config = createDefaultInVMConfig(); server = createServer(true, config, PagingTest.PAGE_SIZE, PagingTest.PAGE_MAX); server.start(); final int numberOfIntegers = 256; final int numberOfMessages = 10; locator.setBlockOnNonDurableSend(true).setBlockOnDurableSend(true).setBlockOnAcknowledge(true); sf = createSessionFactory(locator); ClientSession session = sf.createSession(null, null, false, false, true, false, 0); session.createQueue(PagingTest.ADDRESS, PagingTest.ADDRESS, null, true); ClientProducer producer = session.createProducer(PagingTest.ADDRESS); ClientMessage message = null; for (int i = 0; i < numberOfMessages; i++) { message = session.createMessage(true); ActiveMQBuffer bodyLocal = message.getBodyBuffer(); for (int j = 1; j <= numberOfIntegers; j++) { bodyLocal.writeInt(j); } message.putIntProperty(new SimpleString("id"), i); producer.send(message); } session.rollback(); ClientConsumer consumer = session.createConsumer(PagingTest.ADDRESS); session.start(); Assert.assertNull(consumer.receiveImmediate()); session.close(); }
server.start(); server.getAddressSettingsRepository().getMatch("#").setAddressFullMessagePolicy(AddressFullMessagePolicy.DROP); locator = createInVMNonHALocator().setBlockOnNonDurableSend(true).setBlockOnDurableSend(true).setBlockOnAcknowledge(true); ClientSession session = sf.createSession(false, false, false); session.createQueue(ADDRESS, ADDRESS, null, true); ClientProducer producer = session.createProducer(ADDRESS); message = session.createMessage(true); bodyLocal.writeBytes(body); message.putIntProperty(new SimpleString("id"), i);
server.start(); SimpleString[] queue = new SimpleString[]{new SimpleString("queue1"), new SimpleString("queue2")}; ClientSession session = sf.createSession(null, null, false, true, true, false, 0); session.createQueue(ADDRESS, queue[0], null, true); session.createQueue(ADDRESS, queue[1], null, true); ClientProducer producer = session.createProducer(ADDRESS); session.start(); ClientConsumer consumer = session.createConsumer(queue[1]); ClientMessage msg = consumer.receive(LargeMessageTest.RECEIVE_WAIT_TIME); msg.getBodyBuffer().readByte(); Assert.assertNull(consumer.receiveImmediate()); Assert.assertNotNull(msg);
@Test public void testBrowseWithZeroConsumerWindowSize() throws Exception { locator.setConsumerWindowSize(0); ClientSessionFactory sf = createSessionFactory(locator); ClientSession session = sf.createSession(false, true, true); session.createQueue(QUEUE, QUEUE, null, false); ClientProducer producer = session.createProducer(QUEUE); final int numMessages = 100; byte[] bytes = new byte[240]; for (int i = 0; i < numMessages; i++) { ClientMessage message = session.createMessage(false); message.getBodyBuffer().writeBytes(bytes); message.putIntProperty("foo", i); producer.send(message); } //Create a normal non browsing consumer session.createConsumer(QUEUE); session.start(); ClientConsumer browser = session.createConsumer(QUEUE, true); for (int i = 0; i < numMessages; i++) { ClientMessage message2 = browser.receive(1000); assertEquals(i, message2.getIntProperty("foo").intValue()); } session.close(); }
@Test public void testSimpleSendOnAvoid() throws Exception { ActiveMQServer server = createServer(true, isNetty()); server.start(); ClientSessionFactory sf = createSessionFactory(locator); ClientSession session = addClientSession(sf.createSession(false, true, true)); session.createQueue(ADDRESS, ADDRESS, true); ClientProducer producer = session.createProducer(ADDRESS); int minLargeSize = locator.getMinLargeMessageSize(); TestLargeMessageInputStream input = new TestLargeMessageInputStream(minLargeSize); ClientMessage clientFile = session.createMessage(true); clientFile.setBodyInputStream(input.clone()); producer.send(clientFile); session.start(); //no file should be in the dir as we send it as regular validateNoFilesOnLargeDir(); ClientConsumer consumer = session.createConsumer(ADDRESS); ClientMessage msg1 = consumer.receive(1000); Assert.assertNotNull(msg1); for (int i = 0; i < input.getSize(); i++) { byte b = msg1.getBodyBuffer().readByte(); Assert.assertEquals("incorrect char ", input.getChar(i), b); } msg1.acknowledge(); consumer.close(); session.close(); }
@Test public void testProducerWithSmallWindowSizeAndLargeMessage() throws Exception { final CountDownLatch latch = new CountDownLatch(1); server.getRemotingService().addIncomingInterceptor(new Interceptor() { @Override public boolean intercept(final Packet packet, final RemotingConnection connection) throws ActiveMQException { if (packet.getType() == PacketImpl.SESS_SEND) { latch.countDown(); } return true; } }); ServerLocator locator = createInVMNonHALocator().setConfirmationWindowSize(100); ClientSessionFactory cf = locator.createSessionFactory(); ClientSession session = cf.createSession(false, true, true); ClientProducer producer = session.createProducer(QUEUE); ClientMessage message = session.createMessage(true); byte[] body = new byte[1000]; message.getBodyBuffer().writeBytes(body); producer.send(message); Assert.assertTrue(latch.await(5, TimeUnit.SECONDS)); session.close(); locator.close(); }
public ArtemisBenchmarkConsumer(String topic, String queueName, ClientSessionFactory sessionFactory, ConsumerCallback callback) throws ActiveMQException { session = sessionFactory.createSession(); session.createQueue(SimpleString.toSimpleString(topic), RoutingType.MULTICAST, SimpleString.toSimpleString(queueName), true /* durable */); consumer = session.createConsumer(queueName); consumer.setMessageHandler(message -> { byte[] payload = new byte[message.getBodyBuffer().readableBytes()]; message.getBodyBuffer().readBytes(payload); callback.messageReceived(payload, message.getTimestamp()); try { message.acknowledge(); } catch (ActiveMQException e) { log.warn("Failed to acknowledge message", e); } }); session.start(); }