Final Packaging

This commit is contained in:
Tom McCuch
2011-11-06 18:21:48 -05:00
parent 15dc7cd059
commit 9c9c1da7f3
12 changed files with 385 additions and 143 deletions

View File

@@ -22,6 +22,17 @@
<artifactId>spring-integration-stream</artifactId>
<version>${spring.integration.version}</version>
</dependency>
<!-- Jackson JSON Mapper -->
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>1.8.3</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.8.3</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>

View File

@@ -8,7 +8,7 @@ The domain is that of a Cafe, and the basic flow is depicted in the following di
|==========| -->| |
orders drinks / | prepareHotDrink() |
Place Order ->Cafe->|======|->OrderSplitter->|======|->DrinkRouter | |
\ coldDeinks | prepareColdDrink() |
\ coldDrinks | prepareColdDrink() |
|==========| -->| |
|____________________|
@@ -26,11 +26,24 @@ Instructions for running the CafeDemo sample
-------------------------------------------------------------------------------
1. The example comes with two identical configurations. One is ANNOTATION-based anther is XML-based
2. To run this sample simply execute the CafeDemo* test classes
2. To run this sample simply execute the CafeDemoApp test classes
in the org.springframework.integration.samples.cafe.xml or
org.springframework.integration.samples.cafe.annotation package.
3. The example also provides an alternative configuration that uses AMQP channels to distribute the components
in the CafeDemo sample. To run this alternative configuration of the sample, be sure to have a RabbitMQ broker
started on localhost:5672 configured with the default guest | guest client credentials on the / vHost,
then execute the following test classes in order:
You shoudl see the output similar to this:
1. cafeDemoAppBaristaColdAmqp - starts the Cold Drink Barista
2. cafeDemoAppBaristaHotAmqp- starts the Hot Drink Barista
3. cafeDemoAppOperationsAmqp - starts the Cafe Operations (OrderSplitter, DrinkRouter, PreparedDrinkAggregator)
4. cafeDemoAppAmqp - starts the Cafe Storefront (Places 100 orders on the orders queue)
* Note: All AMQP exchanges, queues, and bindings needed for this sample are defined within the different xml
config files that support the above test classes.
Upon running any of the alternatives, you should see the output similar to this:
INFO : org.springframework.integration.samples.cafe.annotation.Barista - task-scheduler-1 prepared cold drink #1 for order #1: iced 3 shot MOCHA
INFO : org.springframework.integration.samples.cafe.annotation.Barista - task-scheduler-1 prepared cold drink #2 for order #2: iced 3 shot MOCHA

View File

@@ -30,7 +30,7 @@ import org.springframework.integration.annotation.Gateway;
*/
public interface Cafe {
@Gateway(requestChannel="orders")
@Gateway(requestChannel="preOrders")
void placeOrder(Order order);
}

View File

@@ -23,15 +23,15 @@ import org.springframework.integration.samples.cafe.DrinkType;
import org.springframework.integration.samples.cafe.Order;
/**
* Provides the 'main' method for running the Cafe Demo application
* using AMQP. Before running, be sure to have a RabbitMQ broker
* started on localhost:5672 configured with the default
* Provides the 'main' method for running the Cafe Demo store front
* application using AMQP. Before running, be sure to have a
* RabbitMQ broker started on localhost:5672 configured with the default
* guest | guest client credentials on the / vHost. When an order is
* placed, the Cafe will send that order to the "orders" channel.
* placed, the Cafe store front will publish that order on the cafe-orders
* exchange to be processed.
* <p/>
* The relevant components are defined within the configuration files:
* ("cafeDemo-amqp-xml.xml", "cafeDemo-amqp-baristaCold-xml.xml, and
* "cafeDemo-amqp-baristaHot-xml.xml).
* ("cafeDemo-amqp-xml.xml", "cafeDemo-amqp-config-xml.xml").
* <p/>
* If deploying in SpringSource dmServer, the relevant ApplicationContext
* configuration is in the META-INF/spring directory instead.
@@ -42,11 +42,7 @@ public class CafeDemoAppAmqp {
public static void main(String[] args) {
AbstractApplicationContext context =
new ClassPathXmlApplicationContext(
new String[] {"/META-INF/spring/integration/amqp/cafeDemo-amqp-xml.xml",
"/META-INF/spring/integration/amqp/cafeDemo-amqp-baristaCold-xml.xml",
"/META-INF/spring/integration/amqp/cafeDemo-amqp-baristaHot-xml.xml"},
CafeDemoAppAmqp.class);
new ClassPathXmlApplicationContext("/META-INF/spring/integration/amqp/cafeDemo-amqp-xml.xml", CafeDemoAppAmqp.class);
Cafe cafe = (Cafe) context.getBean("cafe");
for (int i = 1; i <= 100; i++) {
@@ -55,6 +51,7 @@ public class CafeDemoAppAmqp {
order.addItem(DrinkType.MOCHA, 3, true);
cafe.placeOrder(order);
}
context.close();
}
}

View File

@@ -0,0 +1,59 @@
/*
* Copyright 2002-2011 the original author or authors.
*
* 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.springframework.integration.samples.cafe.xml;
import java.io.IOException;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.integration.samples.cafe.Cafe;
import org.springframework.integration.samples.cafe.DrinkType;
import org.springframework.integration.samples.cafe.Order;
/**
* Provides the 'main' method for running the Cafe Demo Cold Drink
* Barista application using AMQP. Before running, be sure to have a
* RabbitMQ broker started on localhost:5672 configured with the default
* guest | guest client credentials on the / vHost. When a drink order
* is placed on the cold-drinks queue, the Barista will prepare the drink
* and reply to the reply-to queue set by the sender.
* <p/>
* The relevant components are defined within the configuration files:
* ("cafeDemo-amqp-baristaCold-xml.xml", "cafeDemo-amqp-config-xml.xml").
* <p/>
* If deploying in SpringSource dmServer, the relevant ApplicationContext
* configuration is in the META-INF/spring directory instead.
*
* @author Tom McCuch
*/
public class CafeDemoAppBaristaColdAmqp {
public static void main(String[] args) {
AbstractApplicationContext context =
new ClassPathXmlApplicationContext(
"/META-INF/spring/integration/amqp/cafeDemo-amqp-baristaCold-xml.xml",
CafeDemoAppBaristaColdAmqp.class);
System.out.println("Press Enter/Return in the console to exit the Barista Cold App");
try {
System.in.read();
} catch (IOException e) {
context.close();
}
context.close();
}
}

View File

@@ -0,0 +1,59 @@
/*
* Copyright 2002-2011 the original author or authors.
*
* 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.springframework.integration.samples.cafe.xml;
import java.io.IOException;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.integration.samples.cafe.Cafe;
import org.springframework.integration.samples.cafe.DrinkType;
import org.springframework.integration.samples.cafe.Order;
/**
* Provides the 'main' method for running the Cafe Demo Hot Drink
* Barista application using AMQP. Before running, be sure to have a
* RabbitMQ broker started on localhost:5672 configured with the default
* guest | guest client credentials on the / vHost. When a drink order
* is placed on the hot-drinks queue, the Barista will prepare the drink
* and reply to the reply-to queue set by the sender.
* <p/>
* The relevant components are defined within the configuration files:
* ("cafeDemo-amqp-baristaHot-xml.xml", "cafeDemo-amqp-config-xml.xml").
* <p/>
* If deploying in SpringSource dmServer, the relevant ApplicationContext
* configuration is in the META-INF/spring directory instead.
*
* @author Tom McCuch
*/
public class CafeDemoAppBaristaHotAmqp {
public static void main(String[] args) {
AbstractApplicationContext context =
new ClassPathXmlApplicationContext(
"/META-INF/spring/integration/amqp/cafeDemo-amqp-baristaHot-xml.xml",
CafeDemoAppBaristaHotAmqp.class);
System.out.println("Press Enter/Return in the console to exit the Barista Hot App");
try {
System.in.read();
} catch (IOException e) {
context.close();
}
context.close();
}
}

View File

@@ -0,0 +1,65 @@
/*
* Copyright 2002-2011 the original author or authors.
*
* 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.springframework.integration.samples.cafe.xml;
import java.io.IOException;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.integration.samples.cafe.Cafe;
import org.springframework.integration.samples.cafe.DrinkType;
import org.springframework.integration.samples.cafe.Order;
/**
* Provides the 'main' method for running the Cafe Demo Operations
* application using AMQP. Before running, be sure to have a RabbitMQ
* broker started on localhost:5672 configured with the default
* guest | guest client credentials on the / vHost. When an order is
* placed on the new-orders queue, the Cafe Operations app will split
* the order into order line items, route them to either the coldDrink
* or hotDrink Barista, aggregate the prepared drinks returned from the
* Barista using a Waiter, and publish the delivered order on the
* cafe-deliveries exchange.
* <p/>
* The relevant components are defined within the configuration files:
* ("cafeDemo-amqp-operations-xml.xml", "cafeDemo-amqp-config-xml.xml").
* <p/>
* Before starting this app, be sure to start the CafeDemoAppBaristaCold
* and CafeDemoAppBaristaHot apps first.
*
* If deploying in SpringSource dmServer, the relevant ApplicationContext
* configuration is in the META-INF/spring directory instead.
*
* @author Tom McCuch
*/
public class CafeDemoAppOperationsAmqp {
public static void main(String[] args) {
AbstractApplicationContext context =
new ClassPathXmlApplicationContext(
"/META-INF/spring/integration/amqp/cafeDemo-amqp-operations-xml.xml",
CafeDemoAppOperationsAmqp.class);
System.out.println("Press Enter/Return in the console to exit the Cafe Operations App");
try {
System.in.read();
} catch (IOException e) {
context.close();
}
context.close();
}
}

View File

@@ -20,6 +20,9 @@
http://www.springframework.org/schema/integration/stream/spring-integration-stream.xsd">
<!-- rabbit connection factory, rabbit template, and rabbit admin -->
<import resource="classpath:META-INF/spring/integration/amqp/cafeDemo-amqp-config-xml.xml" />
<int-amqp:inbound-gateway
id="coldDrinksBarista"
request-channel="coldJsonDrinks"
@@ -34,20 +37,7 @@
<int:object-to-json-transformer />
</int:chain>
<!-- Use this when running locally -->
<bean id="rabbitConnectionFactory" class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory">
<constructor-arg value="localhost"/>
<property name="username" value="guest"/>
<property name="password" value="guest"/>
</bean>
<!-- Use this when running in Cloud Foundry -->
<!-- <cloud:rabbit-connection-factory id="rabbitConnectionFactory" service-name="cafe-rabbit"/> -->
<rabbit:template id="amqpTemplate" connection-factory="rabbitConnectionFactory" />
<rabbit:admin connection-factory="rabbitConnectionFactory" />
<!-- rabbit exchanges, queues, and bindings used by this app -->
<rabbit:topic-exchange name="cafe-drinks" auto-delete="true" durable="true">
<rabbit:bindings>
<rabbit:binding queue="cold-drinks" pattern="drink.cold"/>

View File

@@ -20,6 +20,9 @@
http://www.springframework.org/schema/integration/stream/spring-integration-stream.xsd">
<!-- rabbit connection factory, rabbit template, and rabbit admin -->
<import resource="classpath:META-INF/spring/integration/amqp/cafeDemo-amqp-config-xml.xml" />
<int-amqp:inbound-gateway
id="hotDrinksBarista"
request-channel="hotJsonDrinks"
@@ -34,21 +37,7 @@
<int:object-to-json-transformer />
</int:chain>
<!-- Use this when running locally -->
<bean id="rabbitConnectionFactory" class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory">
<constructor-arg value="localhost"/>
<property name="username" value="guest"/>
<property name="password" value="guest"/>
</bean>
<!-- Use this when running in Cloud Foundry -->
<!-- <cloud:rabbit-connection-factory id="rabbitConnectionFactory" service-name="cafe-rabbit"/> -->
<rabbit:template id="amqpTemplate" connection-factory="rabbitConnectionFactory" />
<rabbit:admin connection-factory="rabbitConnectionFactory" />
<!-- rabbit exchanges, queues, and bindings used by this app -->
<rabbit:topic-exchange name="cafe-drinks" auto-delete="true" durable="true">
<rabbit:bindings>
<rabbit:binding queue="hot-drinks" pattern="drink.hot"/>

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:rabbit="http://www.springframework.org/schema/rabbit"
xmlns:cloud="http://schema.cloudfoundry.org/spring"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://schema.cloudfoundry.org/spring
http://schema.cloudfoundry.org/spring/cloudfoundry-spring-0.8.xsd
http://www.springframework.org/schema/rabbit
http://www.springframework.org/schema/rabbit/spring-rabbit-1.0.xsd">
<bean id="rabbitConnectionFactory" class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory">
<constructor-arg value="localhost"/>
<property name="username" value="guest"/>
<property name="password" value="guest"/>
</bean>
<rabbit:template id="amqpTemplate" connection-factory="rabbitConnectionFactory" reply-timeout="10000"/>
<rabbit:admin connection-factory="rabbitConnectionFactory" />
</beans>

View File

@@ -0,0 +1,113 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:int="http://www.springframework.org/schema/integration"
xmlns:int-amqp="http://www.springframework.org/schema/integration/amqp"
xmlns:rabbit="http://www.springframework.org/schema/rabbit"
xmlns:stream="http://www.springframework.org/schema/integration/stream"
xmlns:cloud="http://schema.cloudfoundry.org/spring"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://schema.cloudfoundry.org/spring
http://schema.cloudfoundry.org/spring/cloudfoundry-spring-0.8.xsd
http://www.springframework.org/schema/integration
http://www.springframework.org/schema/integration/spring-integration-2.0.xsd
http://www.springframework.org/schema/integration/amqp
http://www.springframework.org/schema/integration/amqp/spring-integration-amqp.xsd
http://www.springframework.org/schema/rabbit
http://www.springframework.org/schema/rabbit/spring-rabbit-1.0.xsd
http://www.springframework.org/schema/integration/stream
http://www.springframework.org/schema/integration/stream/spring-integration-stream.xsd">
<!-- rabbit connection factory, rabbit template, and rabbit admin -->
<import resource="classpath:META-INF/spring/integration/amqp/cafeDemo-amqp-config-xml.xml" />
<int:wire-tap channel="logger" pattern="orders,coldDrinks,hotDrinks,preparedDrinks,deliveries"/>
<int:logging-channel-adapter id="logger" log-full-message="true" level="INFO"/>
<int-amqp:inbound-channel-adapter queue-names="new-orders" channel="jsonOrders" connection-factory="rabbitConnectionFactory" acknowledge-mode="AUTO" />
<int:json-to-object-transformer id="json-to-order" input-channel="jsonOrders" output-channel="orders" type="org.springframework.integration.samples.cafe.Order" />
<int:splitter input-channel="orders" expression="payload.items" output-channel="preDrinks" apply-sequence="true"/>
<int:header-enricher input-channel="preDrinks" output-channel="drinks">
<int:header name="ICED" expression="payload.isIced()"/>
</int:header-enricher>
<int:object-to-json-transformer id="drink-to-json" input-channel="drinks" output-channel="jsonDrinks" />
<int:router input-channel="jsonDrinks" expression="headers.ICED ? 'coldDrinks' : 'hotDrinks'"/>
<int:channel id="coldDrinks">
<int:queue/>
</int:channel>
<!-- Default poller -->
<int:poller default="true" fixed-rate="100"/>
<int:channel id="hotDrinks">
<int:queue/>
</int:channel>
<int-amqp:outbound-gateway
id="coldDrinksBarista"
request-channel="coldDrinks"
reply-channel="preparedJsonDrinks"
exchange-name="cafe-drinks"
routing-key="drink.cold"
amqp-template="amqpTemplate" />
<int-amqp:outbound-gateway
id="hotDrinksBarista"
request-channel="hotDrinks"
reply-channel="preparedJsonDrinks"
exchange-name="cafe-drinks"
routing-key="drink.hot"
amqp-template="amqpTemplate" />
<int:channel id="preparedJsonDrinks"/>
<int:json-to-object-transformer id="json-to-drink" input-channel="preparedJsonDrinks" output-channel="preparedDrinks" type="org.springframework.integration.samples.cafe.Drink"/>
<int:aggregator input-channel="preparedDrinks" method="prepareDelivery" output-channel="preDeliveries">
<bean class="org.springframework.integration.samples.cafe.xml.Waiter"/>
</int:aggregator>
<int:channel id="preDeliveries" />
<int:header-enricher input-channel="preDeliveries" output-channel="deliveries">
<int:header name="NUMBER" expression="payload.getOrderNumber()" />
</int:header-enricher>
<int:object-to-json-transformer id="delivery-to-json" input-channel="deliveries" output-channel="jsonDeliveries"/>
<int:channel id="jsonDeliveries" />
<int-amqp:outbound-channel-adapter
id="deliveredOrders"
channel="jsonDeliveries"
amqp-template="amqpTemplate"
exchange-name="cafe-deliveries"
routing-key-expression="'delivery.'+headers.NUMBER" />
<bean id="waiter" class="org.springframework.integration.samples.cafe.xml.Waiter"/>
<!-- rabbit exchanges, queues, and bindings used by this app -->
<rabbit:topic-exchange name="cafe-drinks" auto-delete="true" durable="true">
<rabbit:bindings>
<rabbit:binding queue="all-drinks" pattern="drink.*"/>
</rabbit:bindings>
</rabbit:topic-exchange>
<rabbit:queue name="all-drinks" auto-delete="true" durable="true"/>
<rabbit:fanout-exchange name="cafe-deliveries" auto-delete="false" durable="true">
<rabbit:bindings>
<rabbit:binding queue="all-deliveries" />
</rabbit:bindings>
</rabbit:fanout-exchange>
<rabbit:queue name="all-deliveries" auto-delete="false" durable="true"/>
</beans>

View File

@@ -19,114 +19,37 @@
http://www.springframework.org/schema/integration/stream
http://www.springframework.org/schema/integration/stream/spring-integration-stream.xsd">
<int:wire-tap channel="logger" pattern="orders,coldDrinks,hotDrinks,preparedDrinks,deliveries"/>
<int:logging-channel-adapter id="logger" log-full-message="true" level="INFO"/>
<int:gateway id="cafe" service-interface="org.springframework.integration.samples.cafe.Cafe"
default-request-channel="orders"/>
<!-- rabbit connection factory, rabbit template, and rabbit admin -->
<import resource="classpath:META-INF/spring/integration/amqp/cafeDemo-amqp-config-xml.xml" />
<int:splitter input-channel="orders" expression="payload.items" output-channel="preDrinks" apply-sequence="true"/>
<!-- spring integration flow -->
<int:gateway id="cafe" service-interface="org.springframework.integration.samples.cafe.Cafe" />
<int:header-enricher input-channel="preDrinks" output-channel="drinks">
<int:header name="ICED" expression="payload.isIced()"/>
</int:header-enricher>
<int:channel id="preOrders"/>
<int:header-enricher input-channel="preOrders" output-channel="newOrders">
<int:header name="NUMBER" expression="payload.getNumber()"/>
</int:header-enricher>
<int:object-to-json-transformer input-channel="newOrders" output-channel="jsonNewOrders" />
<int:object-to-json-transformer id="drink-to-json" input-channel="drinks" output-channel="jsonDrinks" />
<int:router input-channel="jsonDrinks" expression="headers.ICED ? 'coldDrinks' : 'hotDrinks'"/>
<int:channel id="jsonNewOrders" />
<int:channel id="coldDrinks">
<int:queue/>
</int:channel>
<!-- Default poller -->
<int:poller default="true" fixed-rate="100"/>
<int:channel id="hotDrinks">
<int:queue/>
</int:channel>
<int-amqp:outbound-gateway
id="coldDrinksBarista"
request-channel="coldDrinks"
reply-channel="preparedJsonDrinks"
exchange-name="cafe-drinks"
routing-key="drink.cold"
amqp-template="amqpTemplate" />
<int-amqp:outbound-channel-adapter
channel="jsonNewOrders"
exchange-name="cafe-orders"
routing-key-expression="'order.'+headers.NUMBER"
amqp-template="amqpTemplate" />
<int-amqp:outbound-gateway
id="hotDrinksBarista"
request-channel="hotDrinks"
reply-channel="preparedJsonDrinks"
exchange-name="cafe-drinks"
routing-key="drink.hot"
amqp-template="amqpTemplate" />
<int:channel id="preparedJsonDrinks"/>
<int:json-to-object-transformer id="json-to-drink" input-channel="preparedJsonDrinks" output-channel="preparedDrinks" type="org.springframework.integration.samples.cafe.Drink"/>
<int:aggregator input-channel="preparedDrinks" method="prepareDelivery" output-channel="preDeliveries">
<bean class="org.springframework.integration.samples.cafe.xml.Waiter"/>
</int:aggregator>
<int:channel id="preDeliveries" />
<int:header-enricher input-channel="preDeliveries" output-channel="deliveries">
<int:header name="NUMBER" expression="payload.getOrderNumber()" />
</int:header-enricher>
<int:object-to-json-transformer id="delivery-to-json" input-channel="deliveries" output-channel="jsonDeliveries"/>
<int:channel id="jsonDeliveries" />
<int-amqp:outbound-channel-adapter
id="deliveredOrders"
channel="jsonDeliveries"
amqp-template="amqpTemplate"
exchange-name="cafe-deliveries"
routing-key-expression="'delivery.'+headers.NUMBER" />
<bean id="waiter" class="org.springframework.integration.samples.cafe.xml.Waiter"/>
<!-- Use this when running locally -->
<bean id="rabbitConnectionFactory" class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory">
<constructor-arg value="localhost"/>
<property name="username" value="guest"/>
<property name="password" value="guest"/>
</bean>
<!-- Use this when running in Cloud Foundry -->
<!-- <cloud:rabbit-connection-factory id="rabbitConnectionFactory" service-name="cafe-rabbit"/> -->
<rabbit:template id="amqpTemplate" connection-factory="rabbitConnectionFactory" reply-timeout="10000"/>
<rabbit:admin connection-factory="rabbitConnectionFactory" />
<rabbit:topic-exchange name="cafe-orders" auto-delete="true" durable="true">
<!-- rabbit exchanges, queues, and bindings used by this app -->
<rabbit:topic-exchange name="cafe-orders" auto-delete="false" durable="true">
<rabbit:bindings>
<rabbit:binding queue="new-orders" pattern="order.*"/>
<rabbit:binding queue="all-orders" pattern="order.*"/>
</rabbit:bindings>
</rabbit:topic-exchange>
<rabbit:queue name="new-orders" auto-delete="true" durable="true"/>
<rabbit:queue name="all-orders" auto-delete="true" durable="true"/>
<rabbit:queue name="new-orders" auto-delete="false" durable="true"/>
<rabbit:queue name="all-orders" auto-delete="false" durable="true"/>
<rabbit:topic-exchange name="cafe-drinks" auto-delete="true" durable="true">
<rabbit:bindings>
<rabbit:binding queue="all-drinks" pattern="drink.*"/>
</rabbit:bindings>
</rabbit:topic-exchange>
<rabbit:queue name="all-drinks" auto-delete="true" durable="true"/>
<rabbit:fanout-exchange name="cafe-deliveries" auto-delete="true" durable="true">
<rabbit:bindings>
<rabbit:binding queue="all-deliveries" />
</rabbit:bindings>
</rabbit:fanout-exchange>
<rabbit:queue name="all-deliveries" auto-delete="true" durable="true"/>
</beans>
</beans>