use of org.apache.activemq.artemis.api.core.client.ClientProducer in project activemq-artemis by apache.
the class ConsumerWindowSizeTest method testReceiveImmediateWithZeroWindow3.
// https://jira.jboss.org/jira/browse/HORNETQ-385
@Test
public void testReceiveImmediateWithZeroWindow3() throws Exception {
ActiveMQServer server = createServer(false, isNetty());
server.start();
locator.setConsumerWindowSize(0);
ClientSessionFactory sf = createSessionFactory(locator);
ClientSession session = sf.createSession(false, false, false);
session.createQueue("testWindow", "testWindow", true);
session.close();
int numConsumers = 5;
ArrayList<ClientConsumer> consumers = new ArrayList<>();
ArrayList<ClientSession> sessions = new ArrayList<>();
for (int i = 0; i < numConsumers; i++) {
ClientSession session1 = sf.createSession();
ClientConsumer consumer = session1.createConsumer("testWindow");
consumers.add(consumer);
session1.start();
sessions.add(session1);
consumer.receive(10);
}
ClientSession senderSession = sf.createSession(false, false);
ClientProducer producer = senderSession.createProducer("testWindow");
ClientMessage sent = senderSession.createMessage(true);
sent.putStringProperty("hello", "world");
producer.send(sent);
senderSession.commit();
senderSession.start();
ClientConsumer consumer = consumers.get(2);
ClientMessage received = consumer.receive(1000);
Assert.assertNotNull(received);
for (ClientSession tmpSess : sessions) {
tmpSess.close();
}
senderSession.close();
}
use of org.apache.activemq.artemis.api.core.client.ClientProducer in project activemq-artemis by apache.
the class ConsumerWindowSizeTest method testReceiveImmediateWithZeroWindow4.
@Test
public void testReceiveImmediateWithZeroWindow4() throws Exception {
ActiveMQServer server = createServer(false, isNetty());
server.start();
locator.setConsumerWindowSize(0);
ClientSessionFactory sf = createSessionFactory(locator);
ClientSession session = sf.createSession(false, false, false);
session.createQueue("testWindow", "testWindow", true);
session.close();
int numConsumers = 5;
ArrayList<ClientConsumer> consumers = new ArrayList<>();
ArrayList<ClientSession> sessions = new ArrayList<>();
for (int i = 0; i < numConsumers; i++) {
ClientSession session1 = sf.createSession();
ClientConsumer consumer = session1.createConsumer("testWindow");
consumers.add(consumer);
session1.start();
sessions.add(session1);
Assert.assertNull(consumer.receive(10));
}
ClientSession senderSession = sf.createSession(false, false);
ClientProducer producer = senderSession.createProducer("testWindow");
ClientMessage sent = senderSession.createMessage(true);
sent.putStringProperty("hello", "world");
producer.send(sent);
senderSession.commit();
senderSession.start();
ClientConsumer consumer = consumers.get(2);
ClientMessage received = consumer.receive(5000);
Assert.assertNotNull(received);
for (ClientSession tmpSess : sessions) {
tmpSess.close();
}
senderSession.close();
}
use of org.apache.activemq.artemis.api.core.client.ClientProducer in project activemq-artemis by apache.
the class ConsumerWindowSizeTest method internalTestSlowConsumerOnMessageHandlerNoBuffers.
public void internalTestSlowConsumerOnMessageHandlerNoBuffers(final boolean largeMessages) throws Exception {
ActiveMQServer server = createServer(false, isNetty());
ClientSession sessionB = null;
ClientSession session = null;
try {
final int numberOfMessages = 100;
server.start();
locator.setConsumerWindowSize(0);
if (largeMessages) {
locator.setMinLargeMessageSize(100);
}
ClientSessionFactory sf = createSessionFactory(locator);
session = sf.createSession(false, true, true);
SimpleString ADDRESS = new SimpleString("some-queue");
session.createQueue(ADDRESS, ADDRESS, true);
sessionB = sf.createSession(false, true, true);
sessionB.start();
session.start();
ClientConsumerInternal consReceiveOneAndHold = (ClientConsumerInternal) sessionB.createConsumer(ADDRESS);
final CountDownLatch latchReceived = new CountDownLatch(2);
final CountDownLatch latchDone = new CountDownLatch(1);
// It can't close the session while the large message is being read
final CountDownLatch latchRead = new CountDownLatch(1);
// It should receive two messages and then give up
class LocalHandler implements MessageHandler {
boolean failed = false;
int count = 0;
/* (non-Javadoc)
* @see MessageHandler#onMessage(ClientMessage)
*/
@Override
public synchronized void onMessage(final ClientMessage message) {
try {
String str = getTextMessage(message);
failed = failed || !str.equals("Msg" + count);
message.acknowledge();
latchReceived.countDown();
if (count++ == 1) {
// it will hold here for a while
if (!latchDone.await(TIMEOUT, TimeUnit.SECONDS)) {
// a timed wait, so if the test fails, one less thread around
new Exception("ClientConsuemrWindowSizeTest Handler couldn't receive signal in less than 5 seconds").printStackTrace();
failed = true;
}
if (largeMessages) {
message.getBodyBuffer().readBytes(new byte[600]);
}
latchRead.countDown();
}
} catch (Exception e) {
// Hudson / JUnit report
e.printStackTrace();
failed = true;
}
}
}
LocalHandler handler = new LocalHandler();
ClientConsumer cons1 = session.createConsumer(ADDRESS);
ClientProducer prod = session.createProducer(ADDRESS);
for (int i = 0; i < numberOfMessages; i++) {
ClientMessage msg = createTextMessage(session, "Msg" + i);
if (largeMessages) {
msg.getBodyBuffer().writeBytes(new byte[600]);
}
prod.send(msg);
}
consReceiveOneAndHold.setMessageHandler(handler);
Assert.assertTrue(latchReceived.await(TIMEOUT, TimeUnit.SECONDS));
Assert.assertEquals(0, consReceiveOneAndHold.getBufferSize());
for (int i = 2; i < numberOfMessages; i++) {
ClientMessage msg = cons1.receive(1000);
Assert.assertNotNull("expected message at i = " + i, msg);
Assert.assertEquals("Msg" + i, getTextMessage(msg));
msg.acknowledge();
}
Assert.assertEquals(0, consReceiveOneAndHold.getBufferSize());
latchDone.countDown();
// The test can' t close the session while the message is still being read, or it could interrupt the data
Assert.assertTrue(latchRead.await(10, TimeUnit.SECONDS));
session.close();
session = null;
sessionB.close();
sessionB = null;
Assert.assertEquals(0, getMessageCount(server, ADDRESS.toString()));
Assert.assertFalse("MessageHandler received a failure", handler.failed);
} finally {
try {
if (session != null) {
session.close();
}
if (sessionB != null) {
sessionB.close();
}
} catch (Exception ignored) {
}
}
}
use of org.apache.activemq.artemis.api.core.client.ClientProducer in project activemq-artemis by apache.
the class ConsumerWindowSizeTest method testSingleImmediate.
@Test
public void testSingleImmediate() throws Exception {
final int NUMBER_OF_MESSAGES = 200;
ActiveMQServer server = createServer(false, isNetty());
server.start();
locator.setConsumerWindowSize(0);
final ClientSessionFactory sf = createSessionFactory(locator);
{
ClientSession session = sf.createSession(false, false, false);
session.createQueue("testWindow", "testWindow", true);
session.close();
}
final AtomicInteger received = new AtomicInteger(0);
ClientSession senderSession = sf.createSession(false, false);
ClientProducer producer = senderSession.createProducer("testWindow");
ClientMessage sent = senderSession.createMessage(true);
sent.putStringProperty("hello", "world");
for (int i = 0; i < NUMBER_OF_MESSAGES; i++) {
producer.send(sent);
}
senderSession.commit();
ClientSession session = sf.createSession(false, false);
ClientConsumer consumer = session.createConsumer("testWindow");
session.start();
while (true) {
ClientMessage msg = consumer.receiveImmediate();
if (msg == null) {
System.out.println("Returning null");
break;
}
msg.acknowledge();
session.commit();
received.incrementAndGet();
}
Assert.assertEquals(NUMBER_OF_MESSAGES, received.get());
}
use of org.apache.activemq.artemis.api.core.client.ClientProducer in project activemq-artemis by apache.
the class ConsumerWindowSizeTest method internalTestFlowControlOnRollback.
private void internalTestFlowControlOnRollback(final boolean isLargeMessage) throws Exception {
ActiveMQServer server = createServer(false, isNetty());
AddressSettings settings = new AddressSettings().setMaxDeliveryAttempts(-1);
server.getAddressSettingsRepository().addMatch("#", settings);
ClientSession session = null;
try {
final int numberOfMessages = 100;
server.start();
locator.setConsumerWindowSize(300000);
if (isLargeMessage) {
// something to ensure we are using large messages
locator.setMinLargeMessageSize(100);
} else {
// To make sure large messages won't kick in, we set anything large
locator.setMinLargeMessageSize(Integer.MAX_VALUE);
}
ClientSessionFactory sf = createSessionFactory(locator);
session = sf.createSession(false, false, false);
SimpleString ADDRESS = new SimpleString("some-queue");
session.createQueue(ADDRESS, ADDRESS, true);
ClientProducer producer = session.createProducer(ADDRESS);
for (int i = 0; i < numberOfMessages; i++) {
ClientMessage msg = session.createMessage(true);
msg.putIntProperty("count", i);
msg.getBodyBuffer().writeBytes(new byte[1024]);
producer.send(msg);
}
session.commit();
ClientConsumerInternal consumer = (ClientConsumerInternal) session.createConsumer(ADDRESS);
session.start();
for (int repeat = 0; repeat < 100; repeat++) {
long timeout = System.currentTimeMillis() + 2000;
// At least 10 messages on the buffer
while (timeout > System.currentTimeMillis() && consumer.getBufferSize() <= 10) {
Thread.sleep(10);
}
Assert.assertTrue(consumer.getBufferSize() >= 10);
ClientMessage msg = consumer.receive(500);
msg.getBodyBuffer().readByte();
Assert.assertNotNull(msg);
msg.acknowledge();
session.rollback();
}
for (int i = 0; i < numberOfMessages; i++) {
ClientMessage msg = consumer.receive(5000);
Assert.assertNotNull(msg);
msg.getBodyBuffer().readByte();
msg.acknowledge();
session.commit();
}
} finally {
try {
if (session != null) {
session.close();
}
} catch (Exception ignored) {
}
}
}
Aggregations