Final Packaging
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -30,7 +30,7 @@ import org.springframework.integration.annotation.Gateway;
|
||||
*/
|
||||
public interface Cafe {
|
||||
|
||||
@Gateway(requestChannel="orders")
|
||||
@Gateway(requestChannel="preOrders")
|
||||
void placeOrder(Order order);
|
||||
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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"/>
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
Reference in New Issue
Block a user