/* * 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.junit; import java.util.Map; import org.apache.activemq.artemis.api.core.ActiveMQException; import org.apache.activemq.artemis.api.core.SimpleString; import org.apache.activemq.artemis.api.core.client.ClientMessage; import org.apache.activemq.artemis.api.core.client.ServerLocator; /** * A JUnit Rule that embeds an dynamic (i.e. unbound) ActiveMQ Artemis ClientProducer into a test. * * This JUnit Rule is designed to simplify using ActiveMQ Artemis clients in unit tests. Adding the rule to a test will startup * an unbound ClientProducer, which can then be used to feed messages to any address on the ActiveMQ Artemis server. * * <pre><code> * public class SimpleTest { * @Rule * public ActiveMQDynamicProducerResource producer = new ActiveMQDynamicProducerResource( "vm://0"); * * @Test * public void testSomething() throws Exception { * // Use the embedded ClientProducer here * producer.sendMessage( "test.address", "String Body" ); * } * } * </code></pre> */ public class ActiveMQDynamicProducerResource extends ActiveMQProducerResource { public ActiveMQDynamicProducerResource(String url) { super(url); } public ActiveMQDynamicProducerResource(ServerLocator serverLocator) { super(serverLocator); } public ActiveMQDynamicProducerResource(String url, SimpleString address) { super(url, address); } public ActiveMQDynamicProducerResource(ServerLocator serverLocator, SimpleString address) { super(serverLocator, address); } @Override protected void createClient() { try { if (address != null && !session.addressQuery(address).isExists() && autoCreateQueue) { log.warn("queue does not exist - creating queue: address = {}, name = {}", address.toString(), address.toString()); session.createQueue(address, address); } producer = session.createProducer((SimpleString) null); } catch (ActiveMQException amqEx) { if (address == null) { throw new ActiveMQClientResourceException(String.format("Error creating producer for address %s", address.toString()), amqEx); } else { throw new ActiveMQClientResourceException("Error creating producer", amqEx); } } } /** * Send a ClientMessage to the default address on the server * * @param message the message to send */ @Override public void sendMessage(ClientMessage message) { sendMessage(address, message); } /** * Send a ClientMessage to the specified address on the server * * @param targetAddress the target address * @param message the message to send */ public void sendMessage(SimpleString targetAddress, ClientMessage message) { if (targetAddress == null) { throw new IllegalArgumentException(String.format("%s error - address cannot be null", this.getClass().getSimpleName())); } try { if (autoCreateQueue && !session.addressQuery(targetAddress).isExists()) { log.warn("queue does not exist - creating queue: address = {}, name = {}", address.toString(), address.toString()); session.createQueue(targetAddress, targetAddress); } } catch (ActiveMQException amqEx) { throw new ActiveMQClientResourceException(String.format("Queue creation failed for queue: address = %s, name = %s", address.toString(), address.toString())); } try { producer.send(targetAddress, message); } catch (ActiveMQException amqEx) { throw new ActiveMQClientResourceException(String.format("Failed to send message to %s", targetAddress.toString()), amqEx); } } /** * Create a new ClientMessage with the specified body and send to the specified address on the server * * @param targetAddress the target address * @param body the body for the new message * @return the message that was sent */ public ClientMessage sendMessage(SimpleString targetAddress, byte[] body) { ClientMessage message = createMessage(body); sendMessage(targetAddress, message); return message; } /** * Create a new ClientMessage with the specified body and send to the server * * @param targetAddress the target address * @param body the body for the new message * @return the message that was sent */ public ClientMessage sendMessage(SimpleString targetAddress, String body) { ClientMessage message = createMessage(body); sendMessage(targetAddress, message); return message; } /** * Create a new ClientMessage with the specified properties and send to the server * * @param targetAddress the target address * @param properties the properties for the new message * @return the message that was sent */ public ClientMessage sendMessage(SimpleString targetAddress, Map<String, Object> properties) { ClientMessage message = createMessage(properties); sendMessage(targetAddress, message); return message; } /** * Create a new ClientMessage with the specified body and and properties and send to the server * * @param targetAddress the target address * @param properties the properties for the new message * @return the message that was sent */ public ClientMessage sendMessage(SimpleString targetAddress, byte[] body, Map<String, Object> properties) { ClientMessage message = createMessage(body); sendMessage(targetAddress, message); return message; } /** * Create a new ClientMessage with the specified body and and properties and send to the server * * @param targetAddress the target address * @param properties the properties for the new message * @return the message that was sent */ public ClientMessage sendMessage(SimpleString targetAddress, String body, Map<String, Object> properties) { ClientMessage message = createMessage(body); sendMessage(targetAddress, message); return message; } }