/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.activemq.artemis.tests.integration.client;
import org.apache.activemq.artemis.api.core.ActiveMQException;
import org.apache.activemq.artemis.api.core.ActiveMQExceptionType;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.api.core.client.ClientConsumer;
import org.apache.activemq.artemis.api.core.client.ClientMessage;
import org.apache.activemq.artemis.api.core.client.ClientProducer;
import org.apache.activemq.artemis.api.core.client.ClientRequestor;
import org.apache.activemq.artemis.api.core.client.ClientSession;
import org.apache.activemq.artemis.api.core.client.ClientSessionFactory;
import org.apache.activemq.artemis.api.core.client.MessageHandler;
import org.apache.activemq.artemis.api.core.client.ServerLocator;
import org.apache.activemq.artemis.core.client.impl.ClientMessageImpl;
import org.apache.activemq.artemis.core.server.ActiveMQServer;
import org.apache.activemq.artemis.core.settings.impl.AddressFullMessagePolicy;
import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
import org.apache.activemq.artemis.tests.util.ActiveMQTestBase;
import org.apache.activemq.artemis.utils.RandomUtil;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class RequestorTest extends ActiveMQTestBase {
private ActiveMQServer server;
private ClientSessionFactory sf;
private ServerLocator locator;
@Test
public void testRequest() throws Exception {
final SimpleString key = RandomUtil.randomSimpleString();
long value = RandomUtil.randomLong();
SimpleString requestAddress = new SimpleString("AdTest");
SimpleString requestQueue = RandomUtil.randomSimpleString();
final ClientSession session = sf.createSession(false, true, true);
session.start();
session.createTemporaryQueue(requestAddress, requestQueue);
ClientConsumer requestConsumer = session.createConsumer(requestQueue);
requestConsumer.setMessageHandler(new SimpleMessageHandler(key, session));
ClientRequestor requestor = new ClientRequestor(session, requestAddress);
ClientMessage request = session.createMessage(false);
request.putLongProperty(key, value);
ClientMessage reply = requestor.request(request, 500);
Assert.assertNotNull("reply was not received", reply);
Assert.assertEquals(value, reply.getObjectProperty(key));
Thread.sleep(5000);
session.close();
}
@Test
public void testManyRequestsOverBlocked() throws Exception {
final SimpleString key = RandomUtil.randomSimpleString();
long value = RandomUtil.randomLong();
AddressSettings settings = new AddressSettings().setAddressFullMessagePolicy(AddressFullMessagePolicy.BLOCK).setMaxSizeBytes(1024);
server.getAddressSettingsRepository().addMatch("#", settings);
SimpleString requestAddress = new SimpleString("RequestAddress");
SimpleString requestQueue = new SimpleString("RequestAddress Queue");
final ClientSession sessionRequest = sf.createSession(false, true, true);
sessionRequest.createQueue(requestAddress, requestQueue);
sessionRequest.start();
ClientConsumer requestConsumer = sessionRequest.createConsumer(requestQueue);
requestConsumer.setMessageHandler(new SimpleMessageHandler(key, sessionRequest));
for (int i = 0; i < 2000; i++) {
if (i % 100 == 0) {
System.out.println(i);
}
final ClientSession session = sf.createSession(false, true, true);
session.start();
ClientRequestor requestor = new ClientRequestor(session, requestAddress);
ClientMessage request = session.createMessage(false);
request.putLongProperty(key, value);
ClientMessage reply = requestor.request(request, 5000);
Assert.assertNotNull("reply was not received", reply);
reply.acknowledge();
Assert.assertEquals(value, reply.getObjectProperty(key));
requestor.close();
session.close();
}
sessionRequest.close();
}
@Test
public void testTwoRequests() throws Exception {
final SimpleString key = RandomUtil.randomSimpleString();
long value = RandomUtil.randomLong();
SimpleString requestAddress = RandomUtil.randomSimpleString();
SimpleString requestQueue = RandomUtil.randomSimpleString();
ClientSessionFactory sf = createSessionFactory(locator);
final ClientSession session = sf.createSession(false, true, true);
session.start();
session.createTemporaryQueue(requestAddress, requestQueue);
ClientConsumer requestConsumer = session.createConsumer(requestQueue);
requestConsumer.setMessageHandler(new SimpleMessageHandler(key, session));
ClientRequestor requestor = new ClientRequestor(session, requestAddress);
ClientMessage request = session.createMessage(false);
request.putLongProperty(key, value);
ClientMessage reply = requestor.request(request, 500);
Assert.assertNotNull("reply was not received", reply);
Assert.assertEquals(value, reply.getObjectProperty(key));
request = session.createMessage(false);
request.putLongProperty(key, value + 1);
reply = requestor.request(request, 500);
Assert.assertNotNull("reply was not received", reply);
Assert.assertEquals(value + 1, reply.getObjectProperty(key));
session.close();
}
@Test
public void testRequestWithRequestConsumerWhichDoesNotReply() throws Exception {
SimpleString requestAddress = RandomUtil.randomSimpleString();
SimpleString requestQueue = RandomUtil.randomSimpleString();
ClientSessionFactory sf = createSessionFactory(locator);
final ClientSession session = sf.createSession(false, true, true);
session.start();
session.createTemporaryQueue(requestAddress, requestQueue);
ClientConsumer requestConsumer = session.createConsumer(requestQueue);
requestConsumer.setMessageHandler(new MessageHandler() {
// return a message with the negative request's value
@Override
public void onMessage(final ClientMessage request) {
// do nothing -> no reply
}
});
ClientRequestor requestor = new ClientRequestor(session, requestAddress);
ClientMessage request = session.createMessage(false);
ClientMessage reply = requestor.request(request, 500);
Assert.assertNull(reply);
session.close();
}
@Test
public void testClientRequestorConstructorWithClosedSession() throws Exception {
final SimpleString requestAddress = RandomUtil.randomSimpleString();
ClientSessionFactory sf = createSessionFactory(locator);
final ClientSession session = sf.createSession(false, true, true);
session.close();
ActiveMQAction activeMQAction = new ActiveMQAction() {
@Override
public void run() throws Exception {
new ClientRequestor(session, requestAddress);
}
};
ActiveMQTestBase.expectActiveMQException("ClientRequestor's session must not be closed", ActiveMQExceptionType.OBJECT_CLOSED, activeMQAction);
}
@Test
public void testClose() throws Exception {
final SimpleString key = RandomUtil.randomSimpleString();
long value = RandomUtil.randomLong();
SimpleString requestAddress = RandomUtil.randomSimpleString();
SimpleString requestQueue = RandomUtil.randomSimpleString();
ClientSessionFactory sf = createSessionFactory(locator);
final ClientSession session = sf.createSession(false, true, true);
session.start();
session.createTemporaryQueue(requestAddress, requestQueue);
ClientConsumer requestConsumer = session.createConsumer(requestQueue);
requestConsumer.setMessageHandler(new SimpleMessageHandler(key, session));
final ClientRequestor requestor = new ClientRequestor(session, requestAddress);
ClientMessage request = session.createMessage(false);
request.putLongProperty(key, value);
ClientMessage reply = requestor.request(request, 500);
Assert.assertNotNull("reply was not received", reply);
Assert.assertEquals(value, reply.getObjectProperty(key));
request = session.createMessage(false);
request.putLongProperty(key, value + 1);
requestor.close();
ActiveMQAction activeMQAction = new ActiveMQAction() {
@Override
public void run() throws Exception {
requestor.request(session.createMessage(false), 500);
}
};
ActiveMQTestBase.expectActiveMQException("can not send a request on a closed ClientRequestor", ActiveMQExceptionType.OBJECT_CLOSED, activeMQAction);
}
@Override
@Before
public void setUp() throws Exception {
super.setUp();
server = createServer(false, createDefaultInVMConfig());
server.start();
locator = createInVMNonHALocator().setAckBatchSize(0);
sf = createSessionFactory(locator);
}
private final class SimpleMessageHandler implements MessageHandler {
private final SimpleString key;
private final ClientSession session;
private SimpleMessageHandler(final SimpleString key, final ClientSession session) {
this.key = key;
this.session = session;
}
@Override
public void onMessage(final ClientMessage request) {
try {
ClientMessage reply = session.createMessage(false);
SimpleString replyTo = (SimpleString) request.getObjectProperty(ClientMessageImpl.REPLYTO_HEADER_NAME);
long value = (Long) request.getObjectProperty(key);
reply.putLongProperty(key, value);
ClientProducer replyProducer = session.createProducer(replyTo);
replyProducer.send(reply);
request.acknowledge();
} catch (ActiveMQException e) {
e.printStackTrace();
}
}
}
}