Added: synapse/trunk/java/modules/transports/optional/amqp/src/main/java/org/apache/synapse/transport/amqp/tx/AMQPTransportProducerTx.java URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/optional/amqp/src/main/java/org/apache/synapse/transport/amqp/tx/AMQPTransportProducerTx.java?rev=1507855&view=auto ============================================================================== --- synapse/trunk/java/modules/transports/optional/amqp/src/main/java/org/apache/synapse/transport/amqp/tx/AMQPTransportProducerTx.java (added) +++ synapse/trunk/java/modules/transports/optional/amqp/src/main/java/org/apache/synapse/transport/amqp/tx/AMQPTransportProducerTx.java Sun Jul 28 21:35:59 2013 @@ -0,0 +1,69 @@ +/* + * ==================================================================== + * 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. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * <http://www.apache.org/>. + * + */ +package org.apache.synapse.transport.amqp.tx; + +import com.rabbitmq.client.Channel; + +import java.io.IOException; + +/** + * Wrap the normal transaction API and the light weight publisher confirm apis'. + * See http://www.rabbitmq.com/blog/2011/02/10/introducing-publisher-confirms/, + * + */ +public class AMQPTransportProducerTx { + + /** + * Use light weight publisher confirm to handle transaction ? Default is + * set to true for high performance + */ + private boolean isLightWeightPublisherConfirm = true; + + private Channel channel; + + public AMQPTransportProducerTx(boolean lightWeightPublisherConfirm, + Channel channel) { + isLightWeightPublisherConfirm = lightWeightPublisherConfirm; + this.channel = channel; + } + + public void start() throws IOException { + if (isLightWeightPublisherConfirm) { + channel.confirmSelect(); + } else { + channel.txSelect(); + } + } + + public void end() throws InterruptedException, IOException { + if (isLightWeightPublisherConfirm) { + channel.waitForConfirms(); + } else { + channel.txCommit(); + } + } +} \ No newline at end of file
Added: synapse/trunk/java/modules/transports/optional/amqp/src/test/java/org/apache/synapse/tranport/amqp/AMQPConsumerClient.java URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/optional/amqp/src/test/java/org/apache/synapse/tranport/amqp/AMQPConsumerClient.java?rev=1507855&view=auto ============================================================================== --- synapse/trunk/java/modules/transports/optional/amqp/src/test/java/org/apache/synapse/tranport/amqp/AMQPConsumerClient.java (added) +++ synapse/trunk/java/modules/transports/optional/amqp/src/test/java/org/apache/synapse/tranport/amqp/AMQPConsumerClient.java Sun Jul 28 21:35:59 2013 @@ -0,0 +1,34 @@ +package org.apache.synapse.tranport.amqp; + +import com.rabbitmq.client.Channel; +import com.rabbitmq.client.Connection; +import com.rabbitmq.client.ConnectionFactory; +import com.rabbitmq.client.QueueingConsumer; + +import java.io.IOException; + +/** + * The consumer client for AMQP transport + */ +public class AMQPConsumerClient { + + public static final String QUEUE_NAME = "ProducerProxy"; + + public static void main(String[] args) throws IOException, InterruptedException { + + ConnectionFactory factory = new ConnectionFactory(); + factory.setHost("localhost"); + Connection connection = factory.newConnection(); + + Channel channel = connection.createChannel(); + channel.queueDeclare(QUEUE_NAME, false, false, false, null); + + QueueingConsumer consumer = new QueueingConsumer(channel); + channel.basicConsume(QUEUE_NAME, true, consumer); + System.out.println("Waiting for message on queue '" + QUEUE_NAME + "'"); + + QueueingConsumer.Delivery delivery = consumer.nextDelivery(); + String message = new String(delivery.getBody()); + System.out.println("[x] received '" + message + "'"); + } +} Added: synapse/trunk/java/modules/transports/optional/amqp/src/test/java/org/apache/synapse/tranport/amqp/AMQPProducerClient.java URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/optional/amqp/src/test/java/org/apache/synapse/tranport/amqp/AMQPProducerClient.java?rev=1507855&view=auto ============================================================================== --- synapse/trunk/java/modules/transports/optional/amqp/src/test/java/org/apache/synapse/tranport/amqp/AMQPProducerClient.java (added) +++ synapse/trunk/java/modules/transports/optional/amqp/src/test/java/org/apache/synapse/tranport/amqp/AMQPProducerClient.java Sun Jul 28 21:35:59 2013 @@ -0,0 +1,75 @@ +package org.apache.synapse.tranport.amqp; + +import com.rabbitmq.client.Channel; +import com.rabbitmq.client.Connection; +import com.rabbitmq.client.ConnectionFactory; + +import java.io.IOException; + +/** + * The producer for AMQP transport. + */ +public class AMQPProducerClient { + + // private static final String QUEUE_NAME = "ConsumerTxProxy"; +// private static final String QUEUE_NAME = "worker-queue"; + private static final String QUEUE_NAME = "ProducerProxy"; + + private static final String MESSAGE = + "<?xml version='1.0' encoding='UTF-8'?>\n" + + " <soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" + + " <soapenv:Header xmlns:wsa=\"http://www.w3.org/2005/08/addressing\">\n" + + " <wsa:To>http://localhost:8281/services/StockQuoteProxy</wsa:To>\n" + + " <wsa:MessageID>urn:uuid:44d578a8-20e9-4ee4-8407-9b0a0768e5a8</wsa:MessageID>\n" + + " <wsa:Action>urn:getQuote</wsa:Action>\n" + + " </soapenv:Header>\n" + + " <soapenv:Body>\n" + + " <m0:getQuote xmlns:m0=\"http://services.samples\">\n" + + " <m0:request>\n" + + " <m0:symbol>IBM</m0:symbol>\n" + + " </m0:request>\n" + + " </m0:getQuote>\n" + + " </soapenv:Body>\n" + + " </soapenv:Envelope>"; + + private static final String MESSAGE2 = + "<?xml version='1.0' encoding='UTF-8'?>\n" + + " <m0:getQuote xmlns:m0=\"http://services.samples\">\n" + + " <m0:request>\n" + + " <m0:symbol>IBM</m0:symbol>\n" + + " </m0:request>\n" + + " </m0:getQuote>"; + + public static void main(String[] args) throws IOException { + + ConnectionFactory factory = new ConnectionFactory(); + factory.setHost("localhost"); + Connection connection = factory.newConnection(); + + Channel channel = connection.createChannel(); + + //channel.queueDeclare(QUEUE_NAME, false, false, false, null); + AMQPProducerClient.produce(MESSAGE2, channel, QUEUE_NAME); +// AMQPProducerClient.publish(MESSAGE2, channel, "subscriber-exchange"); +// AMQPProducerClient.route(MESSAGE2, channel, "route-exchange", "fatal"); +// AMQPProducerClient.route(MESSAGE2, channel, "topic-exchange", "kern.critical"); + + channel.close(); + connection.close(); + + } + + + private static void produce(String message, Channel channel, String queueName) throws IOException { + channel.basicPublish("", queueName, null, message.getBytes()); + } + + private static void publish(String message, Channel channel, String exchangeName) throws IOException { + channel.basicPublish(exchangeName, "", null, message.getBytes()); + } + + private static void route(String message, Channel channel, String exchangeName, String routeKey) throws IOException { + channel.basicPublish(exchangeName, routeKey, null, message.getBytes()); + } + +} Added: synapse/trunk/java/modules/transports/optional/amqp/src/test/java/org/apache/synapse/tranport/amqp/AMQPTransportUtilsTest.java URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/optional/amqp/src/test/java/org/apache/synapse/tranport/amqp/AMQPTransportUtilsTest.java?rev=1507855&view=auto ============================================================================== --- synapse/trunk/java/modules/transports/optional/amqp/src/test/java/org/apache/synapse/tranport/amqp/AMQPTransportUtilsTest.java (added) +++ synapse/trunk/java/modules/transports/optional/amqp/src/test/java/org/apache/synapse/tranport/amqp/AMQPTransportUtilsTest.java Sun Jul 28 21:35:59 2013 @@ -0,0 +1,155 @@ +/* + * Copyright WSO2, Inc. (http://wso2.com) + * + * Licensed 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.synapse.tranport.amqp; + +import com.rabbitmq.client.Address; +import junit.framework.TestCase; +import org.apache.axis2.description.AxisService; +import org.apache.synapse.transport.amqp.AMQPTransportConstant; +import org.apache.synapse.transport.amqp.AMQPTransportUtils; + +import java.util.HashMap; +import java.util.Map; + +public class AMQPTransportUtilsTest extends TestCase { + + private Map<String, String> svcMap = new HashMap<String, String>(); + + private Map<String, String> cfMap = new HashMap<String, String>(); + + @Override + public void setUp() throws Exception { + super.setUp(); + // Do not edit the values, test may fail! + svcMap.put(AMQPTransportConstant.PARAMETER_EXCHANGE_NAME, "directExchange"); + svcMap.put(AMQPTransportConstant.PARAMETER_EXCHANGE_INTERNAL, "true"); + svcMap.put(AMQPTransportConstant.PARAMETER_NO_OF_CONCURRENT_CONSUMERS, "2"); + + cfMap.put(AMQPTransportConstant.PARAMETER_EXCHANGE_TYPE, "direct"); + cfMap.put(AMQPTransportConstant.PARAMETER_QUEUE_DURABLE, "true"); + cfMap.put(AMQPTransportConstant.PARAMETER_INITIAL_RE_CONNECTION_DURATION, "10"); + } + + public void testGetStringProperty() throws Exception { + assertEquals("In valid string value received,", + "[email protected]", AMQPTransportUtils.getStringProperty("string", null)); + } + + public void testGetIntProperty() throws Exception { + assertEquals("In valid int value received,", 10, AMQPTransportUtils.getIntProperty("int", -1)); + } + + public void testGetLongProperty() throws Exception { + assertEquals("In valid long value received,", 13, AMQPTransportUtils.getLongProperty("long", -1)); + } + + public void testGetDoubleProperty() throws Exception { + assertEquals("In valid double value received,", 14.4, AMQPTransportUtils.getDoubleProperty("double", -1)); + } + + public void testGetBooleanProperty() throws Exception { + assertEquals( + "In valid boolean value received,", + false, + AMQPTransportUtils.getBooleanProperty("boolean2", true).booleanValue()); + + assertEquals( + "In valid boolean value received,", + true, + AMQPTransportUtils.getBooleanProperty("boolean1", false).booleanValue()); + } + + public void testGetServiceStringParameters() throws Exception { + AxisService service = new AxisService(); + service.addParameter("param1", "value1"); + + Map<String, String> paramMap = + AMQPTransportUtils.getServiceStringParameters(service.getParameters()); + assertEquals("In valid parameter for key param1", "value1", paramMap.get("param1")); + } + + public void testGetOptionalStringParameter() throws Exception { + assertEquals( + "In valid value received", + svcMap.get(AMQPTransportConstant.PARAMETER_EXCHANGE_NAME), + AMQPTransportUtils.getOptionalStringParameter( + AMQPTransportConstant.PARAMETER_EXCHANGE_NAME, svcMap, cfMap)); + + assertEquals( + "In valid value received", + cfMap.get(AMQPTransportConstant.PARAMETER_EXCHANGE_TYPE), + AMQPTransportUtils.getOptionalStringParameter( + AMQPTransportConstant.PARAMETER_EXCHANGE_TYPE, svcMap, cfMap)); + } + + public void testGetOptionalBooleanParameter() throws Exception { + assertEquals("Invalid value", + Boolean.valueOf(svcMap.get(AMQPTransportConstant.PARAMETER_EXCHANGE_INTERNAL)), + AMQPTransportUtils.getOptionalBooleanParameter( + AMQPTransportConstant.PARAMETER_EXCHANGE_INTERNAL, svcMap, cfMap)); + + assertEquals("Invalid value", + Boolean.valueOf(cfMap.get(AMQPTransportConstant.PARAMETER_QUEUE_DURABLE)), + AMQPTransportUtils.getOptionalBooleanParameter( + AMQPTransportConstant.PARAMETER_QUEUE_DURABLE, svcMap, cfMap)); + } + + public void testGetOptionalIntParameter() throws Exception { + assertEquals("Invalid value", + Integer.parseInt(cfMap.get(AMQPTransportConstant.PARAMETER_INITIAL_RE_CONNECTION_DURATION)), + AMQPTransportUtils.getOptionalIntParameter( + AMQPTransportConstant.PARAMETER_INITIAL_RE_CONNECTION_DURATION, svcMap, cfMap).intValue()); + + assertEquals("Invalid value", + Integer.parseInt(svcMap.get(AMQPTransportConstant.PARAMETER_NO_OF_CONCURRENT_CONSUMERS)), + AMQPTransportUtils.getOptionalIntParameter( + AMQPTransportConstant.PARAMETER_NO_OF_CONCURRENT_CONSUMERS, svcMap, cfMap).intValue()); + } + + public void testGetBindingKeys() throws Exception { + String keys[] = AMQPTransportUtils.split("ERROR,WARN,DEBUG", ","); + assertEquals("Invalid value", "ERROR", keys[0]); + assertEquals("Invalid value", "WARN", keys[1]); + assertEquals("Invalid value", "DEBUG", keys[2]); + } + + public void testGetAddressArray() throws Exception { + try { + Address[] addresses1 = AMQPTransportUtils.getAddressArray( + "wso2.org:443,rajika.org:25", ",", ':'); + assertEquals("Invalid value", "wso2.org", addresses1[0].getHost()); + assertEquals("Invalid value", 25, addresses1[1].getPort()); + assertEquals("Invalid value", "rajika.org", addresses1[1].getHost()); + } catch (NumberFormatException e) { + fail("Should not throw an exception, " + e.getMessage()); + } + + try { + AMQPTransportUtils.getAddressArray( + "hostName1:443,hostName2:25,hostName3:invalidPort", ",", ':'); + fail("Should not come here because above should throw an exception"); + } catch (NumberFormatException e) { + // expected + } + } + + public void testParseAMQPUri() throws Exception { + String url = "amqp://SimpleStockQuoteService?transport.amqp.ConnectionFactoryName=producer&transport.amqp.QueueName=producer" ; + Map<String, String> uriParam = AMQPTransportUtils.parseAMQPUri(url); + assertEquals("Invalid value", "producer", uriParam.get(AMQPTransportConstant.PARAMETER_QUEUE_NAME)); + + } +} Added: synapse/trunk/java/modules/transports/optional/amqp/src/test/java/org/apache/synapse/tranport/amqp/AMQPTwoWayProducerClient.java URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/optional/amqp/src/test/java/org/apache/synapse/tranport/amqp/AMQPTwoWayProducerClient.java?rev=1507855&view=auto ============================================================================== --- synapse/trunk/java/modules/transports/optional/amqp/src/test/java/org/apache/synapse/tranport/amqp/AMQPTwoWayProducerClient.java (added) +++ synapse/trunk/java/modules/transports/optional/amqp/src/test/java/org/apache/synapse/tranport/amqp/AMQPTwoWayProducerClient.java Sun Jul 28 21:35:59 2013 @@ -0,0 +1,109 @@ +/* + * ==================================================================== + * 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. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * <http://www.apache.org/>. + * + */ +package org.apache.synapse.tranport.amqp; + +import com.rabbitmq.client.*; + +import java.io.IOException; + +/** + * A request/response producer client + * author : [email protected] + */ +public class AMQPTwoWayProducerClient { + + private static final String MESSAGE = + "<?xml version='1.0' encoding='UTF-8'?>\n" + + " <soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" + + " <soapenv:Header xmlns:wsa=\"http://www.w3.org/2005/08/addressing\">\n" + + " <wsa:To>http://localhost:8281/services/StockQuoteProxy</wsa:To>\n" + + " <wsa:MessageID>urn:uuid:44d578a8-20e9-4ee4-8407-9b0a0768e5a8</wsa:MessageID>\n" + + " <wsa:Action>urn:getQuote</wsa:Action>\n" + + " </soapenv:Header>\n" + + " <soapenv:Body>\n" + + " <m0:getQuote xmlns:m0=\"http://services.samples\">\n" + + " <m0:request>\n" + + " <m0:symbol>IBM</m0:symbol>\n" + + " </m0:request>\n" + + " </m0:getQuote>\n" + + " </soapenv:Body>\n" + + " </soapenv:Envelope>"; + + private static final String MESSAGE2 = + "<?xml version='1.0' encoding='UTF-8'?>\n" + + " <m0:getQuote xmlns:m0=\"http://services.samples\">\n" + + " <m0:request>\n" + + " <m0:symbol>IBM</m0:symbol>\n" + + " </m0:request>\n" + + " </m0:getQuote>"; + + public static void main(String[] args) throws IOException, InterruptedException { + + ConnectionFactory factory = new ConnectionFactory(); + factory.setHost("localhost"); + Connection connection = factory.newConnection(); + + Channel channel = connection.createChannel(); + + AMQPTwoWayProducerClient.produceAndConsume( + MESSAGE2, channel, "consumer", "consumerReply"); + + channel.close(); + connection.close(); + + } + + + private static void produceAndConsume( + String message, + Channel channel, + String requestQueueName, + String replyQueueName) throws IOException, InterruptedException { + + AMQP.BasicProperties.Builder builder = new + AMQP.BasicProperties().builder(); + String restCoID = Math.random() + ""; + builder.correlationId(restCoID); + System.out.println("Request correlation Id : " + restCoID); + builder.replyTo(replyQueueName); + channel.basicPublish("", requestQueueName, builder.build(), message.getBytes()); + System.out.println("[x] sent to '" + requestQueueName + "' the message '\n" + message + "'"); + + channel.queueDeclare(replyQueueName, false, false, false, null); + QueueingConsumer consumer = new QueueingConsumer(channel); + channel.basicConsume(replyQueueName, true, consumer); + System.out.println("Waiting for message on queue '" + replyQueueName + "'"); + while (true) { + QueueingConsumer.Delivery delivery = consumer.nextDelivery(); + String replyMessage = new String(delivery.getBody()); + System.out.println("[x] received '" + replyMessage + "'"); + System.out.println("Response correlation Id : " + delivery.getProperties().getCorrelationId()); + break; + + } + } +} Added: synapse/trunk/java/modules/transports/optional/amqp/src/test/resources/amqp-transport.properties URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/optional/amqp/src/test/resources/amqp-transport.properties?rev=1507855&view=auto ============================================================================== --- synapse/trunk/java/modules/transports/optional/amqp/src/test/resources/amqp-transport.properties (added) +++ synapse/trunk/java/modules/transports/optional/amqp/src/test/resources/amqp-transport.properties Sun Jul 28 21:35:59 2013 @@ -0,0 +1,7 @@ +# Do not edit. This is for JUnit tests. [email protected] +int=10 +long=13 +double=14.4 +boolean1=true +boolean2=false \ No newline at end of file Modified: synapse/trunk/java/modules/transports/pom.xml URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/pom.xml?rev=1507855&r1=1507854&r2=1507855&view=diff ============================================================================== --- synapse/trunk/java/modules/transports/pom.xml (original) +++ synapse/trunk/java/modules/transports/pom.xml Sun Jul 28 21:35:59 2013 @@ -47,6 +47,7 @@ <module>core/pipe</module> <module>core/vfs</module> <module>optional/fix</module> + <module>optional/amqp</module> </modules> <dependencies> Modified: synapse/trunk/java/pom.xml URL: http://svn.apache.org/viewvc/synapse/trunk/java/pom.xml?rev=1507855&r1=1507854&r2=1507855&view=diff ============================================================================== --- synapse/trunk/java/pom.xml (original) +++ synapse/trunk/java/pom.xml Sun Jul 28 21:35:59 2013 @@ -392,6 +392,11 @@ <artifactId>synapse-vfs-transport</artifactId> <version>${project.version}</version> </dependency> + <dependency> + <groupId>org.apache.synapse</groupId> + <artifactId>synapse-amqp-transport</artifactId> + <version>${project.version}</version> + </dependency> <!-- Apache Axis2 --> <dependency> Modified: synapse/trunk/java/repository/conf/axis2.xml URL: http://svn.apache.org/viewvc/synapse/trunk/java/repository/conf/axis2.xml?rev=1507855&r1=1507854&r2=1507855&view=diff ============================================================================== --- synapse/trunk/java/repository/conf/axis2.xml (original) +++ synapse/trunk/java/repository/conf/axis2.xml Sun Jul 28 21:35:59 2013 @@ -266,6 +266,22 @@ <!--Uncomment this for UDP transport support <transportReceiver name="udp" class="org.apache.axis2.transport.udp.UDPListener"/>--> + <!--Uncomment this for AMQP transport support--> + <!--<transportReceiver name="amqp" class="org.apache.synapse.transport.amqp.AMQPTransportListener">--> + <!--<parameter name="consumer" locked="false">--> + <!--<parameter name="transport.amqp.Uri" locked="false">amqp://localhost:5672</parameter>--> + <!--</parameter>--> + <!--<parameter name="worker-queue" locked="false">--> + <!--<parameter name="transport.amqp.Uri" locked="false">amqp://localhost:5672</parameter>--> + <!--<parameter name="transport.amqp.ChannelPreFetchCountSize" locked="false">1</parameter>--> + <!--</parameter>--> + <!--<parameter name="subscriber" locked="false">--> + <!--<parameter name="transport.amqp.Uri" locked="false">amqp://localhost:5672</parameter>--> + <!--</parameter>--> + <!--</transportReceiver>--> + + <!--Uncomment this for AMQP transport support --> + <!-- ================================================= --> <!-- Transport Outs --> <!-- ================================================= --> @@ -348,6 +364,18 @@ <!--Uncomment this for UDP transport support <transportSender name="udp" class="org.apache.axis2.transport.udp.UDPSender"/>--> + + <!--Uncomment this for AMQP transport support--> + <!--<transportSender name="amqp" class="org.apache.synapse.transport.amqp.AMQPTransportSender">--> + <!--<parameter name="producer" locked="false">--> + <!--<parameter name="transport.amqp.Uri" locked="false">amqp://localhost:5672</parameter>--> + <!--</parameter>--> + <!--<parameter name="publisher" locked="false">--> + <!--<parameter name="transport.amqp.Uri" locked="false">amqp://localhost:5672</parameter>--> + <!--</parameter>--> + <!--</transportSender>--> + + <!-- ================================================= --> <!-- Global Modules --> <!-- ================================================= -->
