diff --git a/applications/cafe/pom.xml b/applications/cafe/pom.xml index aa0dbf58..a823958b 100644 --- a/applications/cafe/pom.xml +++ b/applications/cafe/pom.xml @@ -7,14 +7,25 @@ 2.0.0 Spring Integration Cafe Sample - 2.0.5.RELEASE + 2.1.0.M3 + 3.1.0.RC1 1.2.16 4.7 + + org.springframework + spring-tx + ${spring.core.version} + + + org.springframework + spring-context + ${spring.core.version} + org.springframework.integration - spring-integration-core + spring-integration-amqp ${spring.integration.version} @@ -22,6 +33,17 @@ spring-integration-stream ${spring.integration.version} + + + org.codehaus.jackson + jackson-core-asl + 1.8.3 + + + org.codehaus.jackson + jackson-mapper-asl + 1.8.3 + log4j log4j diff --git a/applications/cafe/readme.txt b/applications/cafe/readme.txt index 69ae4e18..baee0e61 100644 --- a/applications/cafe/readme.txt +++ b/applications/cafe/readme.txt @@ -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. cafeDemoAppAmqp - starts the Cafe Storefront (Places 100 orders on the orders queue) + 4. cafeDemoAppOperationsAmqp - starts the Cafe Operations (OrderSplitter, DrinkRouter, PreparedDrinkAggregator) + + * 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 diff --git a/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/Delivery.java b/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/Delivery.java index a59fbd43..2f0b5b49 100644 --- a/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/Delivery.java +++ b/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/Delivery.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2010 the original author or authors. + * 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. @@ -20,16 +20,18 @@ import java.util.List; /** * @author Marius Bogoevici + * @author Tom McCuch */ public class Delivery { private static final String SEPARATOR = "-----------------------"; - private List deliveredDrinks; private int orderNumber; + // Default constructor required by Jackson Java JSON-processor + public Delivery() {} public Delivery(List deliveredDrinks) { assert(deliveredDrinks.size() > 0); @@ -42,10 +44,18 @@ public class Delivery { return orderNumber; } + public void setOrderNumber(int orderNumber) { + this.orderNumber = orderNumber; + } + public List getDeliveredDrinks() { return deliveredDrinks; } + public void setDeliveredDrinks(List deliveredDrinks) { + this.deliveredDrinks = deliveredDrinks; + } + @Override public String toString() { StringBuffer buffer = new StringBuffer(SEPARATOR + "\n"); diff --git a/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/Drink.java b/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/Drink.java index 504a8658..aa336199 100644 --- a/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/Drink.java +++ b/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/Drink.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2010 the original author or authors. + * 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. @@ -18,6 +18,7 @@ package org.springframework.integration.samples.cafe; /** * @author Marius Bogoevici + * @author Tom McCuch */ public class Drink { @@ -30,10 +31,13 @@ public class Drink { private int orderNumber; - public Drink(int orderNumber, DrinkType drinkType, boolean hot, int shots) { + // Default constructor required by Jackson Java JSON-processor + public Drink() {} + + public Drink(int orderNumber, DrinkType drinkType, boolean iced, int shots) { this.orderNumber = orderNumber; this.drinkType = drinkType; - this.iced = hot; + this.iced = iced; this.shots = shots; } @@ -42,6 +46,34 @@ public class Drink { return orderNumber; } + public void setOrderNumber(int orderNumber) { + this.orderNumber = orderNumber; + } + + public boolean isIced() { + return this.iced; + } + + public void setIced(boolean iced) { + this.iced = iced; + } + + public DrinkType getDrinkType() { + return this.drinkType; + } + + public void setDrinkType(DrinkType drinkType) { + this.drinkType = drinkType; + } + + public int getShots() { + return this.shots; + } + + public void setShots(int shots) { + this.shots = shots; + } + @Override public String toString() { return (iced?"Iced":"Hot") + " " + drinkType.toString() + ", " + shots + " shots."; diff --git a/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/DrinkType.java b/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/DrinkType.java index 7e438db4..4944ca4c 100644 --- a/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/DrinkType.java +++ b/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/DrinkType.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2010 the original author or authors. + * 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. diff --git a/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/Order.java b/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/Order.java index 883d9708..6f836a82 100644 --- a/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/Order.java +++ b/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/Order.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2010 the original author or authors. + * 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. @@ -22,27 +22,39 @@ import java.util.List; /** * @author Mark Fisher * @author Marius Bogoevici + * @author Tom McCuch */ public class Order { private List orderItems = new ArrayList(); + /** the order number used for tracking */ private int number; + // Default constructor required by Jackson Java JSON-processor + public Order() {} + public Order(int number) { this.number = number; } public void addItem(DrinkType drinkType, int shots, boolean iced) { - this.orderItems.add(new OrderItem(this, drinkType, shots, iced)); + this.orderItems.add(new OrderItem(this.number, drinkType, shots, iced)); } public int getNumber() { return number; } + public void setNumber(int number) { + this.number = number; + } + public List getItems() { return this.orderItems; } + public void setItems(List orderItems) { + this.orderItems = orderItems; + } } diff --git a/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/OrderItem.java b/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/OrderItem.java index 0215ff4c..c3e0a2b0 100644 --- a/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/OrderItem.java +++ b/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/OrderItem.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2010 the original author or authors. + * 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. @@ -19,6 +19,7 @@ package org.springframework.integration.samples.cafe; /** * @author Mark Fisher * @author Marius Bogoevici + * @author Tom McCuch */ public class OrderItem { @@ -28,34 +29,52 @@ public class OrderItem { private boolean iced = false; - private final Order order; + /** the order this item is tied to */ + private int orderNumber; + // Default constructor required by Jackson Java JSON-processor + public OrderItem() {} - public OrderItem(Order order, DrinkType type, int shots, boolean iced) { - this.order = order; + public OrderItem(int orderNumber, DrinkType type, int shots, boolean iced) { + this.orderNumber = orderNumber; this.type = type; this.shots = shots; this.iced = iced; } - - public Order getOrder() { - return this.order; + public int getOrderNumber() { + return this.orderNumber; } + public void setOrderNumber(int orderNumber) { + this.orderNumber = orderNumber; + } + public boolean isIced() { return this.iced; } - public int getShots() { + public void setIced(boolean iced) { + this.iced = iced; + } + + public int getShots() { return shots; } - public DrinkType getDrinkType() { + public void setShots(int shots) { + this.shots = shots; + } + + public DrinkType getDrinkType() { return this.type; } - public String toString() { + public void setDrinkType(DrinkType type) { + this.type = type; + } + + public String toString() { return ((this.iced) ? "iced " : "hot ") + this.shots + " shot " + this.type; } diff --git a/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/annotation/Barista.java b/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/annotation/Barista.java index a3ccc9e3..ece88941 100644 --- a/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/annotation/Barista.java +++ b/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/annotation/Barista.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2010 the original author or authors. + * 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. @@ -27,7 +27,9 @@ import org.springframework.stereotype.Component; /** * @author Mark Fisher * @author Marius Bogoevici + * @author Tom McCuch */ + @Component public class Barista { private static Logger logger = Logger.getLogger(Barista.class); @@ -54,8 +56,8 @@ public class Barista { Thread.sleep(this.hotDrinkDelay); logger.info(Thread.currentThread().getName() + " prepared hot drink #" + hotDrinkCounter.incrementAndGet() + " for order #" - + orderItem.getOrder().getNumber() + ": " + orderItem); - return new Drink(orderItem.getOrder().getNumber(), orderItem.getDrinkType(), orderItem.isIced(), + + orderItem.getOrderNumber() + ": " + orderItem); + return new Drink(orderItem.getOrderNumber(), orderItem.getDrinkType(), orderItem.isIced(), orderItem.getShots()); } catch (InterruptedException e) { Thread.currentThread().interrupt(); @@ -69,8 +71,8 @@ public class Barista { Thread.sleep(this.coldDrinkDelay); logger.info(Thread.currentThread().getName() + " prepared cold drink #" + coldDrinkCounter.incrementAndGet() + " for order #" - + orderItem.getOrder().getNumber() + ": " + orderItem); - return new Drink(orderItem.getOrder().getNumber(), orderItem.getDrinkType(), orderItem.isIced(), + + orderItem.getOrderNumber() + ": " + orderItem); + return new Drink(orderItem.getOrderNumber(), orderItem.getDrinkType(), orderItem.isIced(), orderItem.getShots()); } catch (InterruptedException e) { Thread.currentThread().interrupt(); diff --git a/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/xml/Barista.java b/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/xml/Barista.java index 4db79f81..c4d117f0 100644 --- a/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/xml/Barista.java +++ b/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/xml/Barista.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2010 the original author or authors. + * 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. @@ -25,7 +25,9 @@ import org.springframework.integration.samples.cafe.OrderItem; /** * @author Mark Fisher * @author Marius Bogoevici + * @author Tom McCuch */ + public class Barista { private static Logger logger = Logger.getLogger(Barista.class); private long hotDrinkDelay = 5000; @@ -50,8 +52,8 @@ public class Barista { Thread.sleep(this.hotDrinkDelay); logger.info(Thread.currentThread().getName() + " prepared hot drink #" + hotDrinkCounter.incrementAndGet() + " for order #" - + orderItem.getOrder().getNumber() + ": " + orderItem); - return new Drink(orderItem.getOrder().getNumber(), orderItem.getDrinkType(), orderItem.isIced(), + + orderItem.getOrderNumber() + ": " + orderItem); + return new Drink(orderItem.getOrderNumber(), orderItem.getDrinkType(), orderItem.isIced(), orderItem.getShots()); } catch (InterruptedException e) { Thread.currentThread().interrupt(); @@ -64,8 +66,8 @@ public class Barista { Thread.sleep(this.coldDrinkDelay); logger.info(Thread.currentThread().getName() + " prepared cold drink #" + coldDrinkCounter.incrementAndGet() + " for order #" - + orderItem.getOrder().getNumber() + ": " + orderItem); - return new Drink(orderItem.getOrder().getNumber(), orderItem.getDrinkType(), orderItem.isIced(), + + orderItem.getOrderNumber() + ": " + orderItem); + return new Drink(orderItem.getOrderNumber(), orderItem.getDrinkType(), orderItem.isIced(), orderItem.getShots()); } catch (InterruptedException e) { Thread.currentThread().interrupt(); diff --git a/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/xml/CafeDemoAppAmqp.java b/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/xml/CafeDemoAppAmqp.java new file mode 100644 index 00000000..4d259852 --- /dev/null +++ b/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/xml/CafeDemoAppAmqp.java @@ -0,0 +1,66 @@ +/* + * 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 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 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 store front will publish that order on the cafe-orders + * exchange to be processed. + *

+ * The relevant components are defined within the configuration files: + * ("cafeDemo-amqp-xml.xml", "cafeDemo-amqp-config-xml.xml"). + *

+ * If deploying in SpringSource dmServer, the relevant ApplicationContext + * configuration is in the META-INF/spring directory instead. + * + * @author Tom McCuch + */ +public class CafeDemoAppAmqp { + + /** + * place some orders + * @param context spring context + * @param count the number of standard orders + */ + public static void order(AbstractApplicationContext context, int count){ + Cafe cafe = (Cafe) context.getBean("cafe"); + for (int i = 1; i <= 100; i++) { + Order order = new Order(i); + order.addItem(DrinkType.LATTE, 2, false); + order.addItem(DrinkType.MOCHA, 3, true); + cafe.placeOrder(order); + } + } + + public static void main(String[] args) { + AbstractApplicationContext context = + CafeDemoAppUtilities.loadProfileContext( + "/META-INF/spring/integration/amqp/cafeDemo-amqp-xml.xml", + CafeDemoAppAmqp.class,CafeDemoAppUtilities.DEV); + order(context, 100); + context.close(); + } +} diff --git a/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/xml/CafeDemoAppBaristaColdAmqp.java b/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/xml/CafeDemoAppBaristaColdAmqp.java new file mode 100644 index 00000000..2fa94d32 --- /dev/null +++ b/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/xml/CafeDemoAppBaristaColdAmqp.java @@ -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. + *

+ * The relevant components are defined within the configuration files: + * ("cafeDemo-amqp-baristaCold-xml.xml", "cafeDemo-amqp-config-xml.xml"). + *

+ * 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 = + CafeDemoAppUtilities.loadProfileContext( + "/META-INF/spring/integration/amqp/cafeDemo-amqp-baristaCold-xml.xml", + CafeDemoAppBaristaColdAmqp.class,CafeDemoAppUtilities.DEV); + + 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(); + } +} diff --git a/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/xml/CafeDemoAppBaristaHotAmqp.java b/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/xml/CafeDemoAppBaristaHotAmqp.java new file mode 100644 index 00000000..0d37cad6 --- /dev/null +++ b/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/xml/CafeDemoAppBaristaHotAmqp.java @@ -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. + *

+ * The relevant components are defined within the configuration files: + * ("cafeDemo-amqp-baristaHot-xml.xml", "cafeDemo-amqp-config-xml.xml"). + *

+ * 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 = + CafeDemoAppUtilities.loadProfileContext( + "/META-INF/spring/integration/amqp/cafeDemo-amqp-baristaHot-xml.xml", + CafeDemoAppBaristaHotAmqp.class,CafeDemoAppUtilities.DEV); + + 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(); + } +} diff --git a/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/xml/CafeDemoAppOperationsAmqp.java b/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/xml/CafeDemoAppOperationsAmqp.java new file mode 100644 index 00000000..f2246647 --- /dev/null +++ b/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/xml/CafeDemoAppOperationsAmqp.java @@ -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. + *

+ * The relevant components are defined within the configuration files: + * ("cafeDemo-amqp-operations-xml.xml", "cafeDemo-amqp-config-xml.xml"). + *

+ * 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 = + CafeDemoAppUtilities.loadProfileContext( + "/META-INF/spring/integration/amqp/cafeDemo-amqp-operations-xml.xml", + CafeDemoAppOperationsAmqp.class,CafeDemoAppUtilities.DEV); + + 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(); + } +} diff --git a/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/xml/CafeDemoAppUtilities.java b/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/xml/CafeDemoAppUtilities.java new file mode 100644 index 00000000..6eac278f --- /dev/null +++ b/applications/cafe/src/main/java/org/springframework/integration/samples/cafe/xml/CafeDemoAppUtilities.java @@ -0,0 +1,36 @@ +package org.springframework.integration.samples.cafe.xml; + +import org.springframework.context.support.AbstractApplicationContext; +import org.springframework.context.support.GenericXmlApplicationContext; +import org.springframework.integration.samples.cafe.Cafe; +import org.springframework.integration.samples.cafe.DrinkType; +import org.springframework.integration.samples.cafe.Order; + +public class CafeDemoAppUtilities { + + /** spring profile for running locally */ + public static final String DEV = "dev"; + /** spring profile for running in cloud foundry */ + public static final String CLOUD = "cloud"; + + + /** + * + * @param path path to the file + * @param targetClass the class who's classloader we will use to laod the context file + * @param profile a profile name + * @return the spring context + */ + public static AbstractApplicationContext loadProfileContext(String path, Class targetClass, String profile) { + GenericXmlApplicationContext ctx = new GenericXmlApplicationContext(); + ctx.getEnvironment().setActiveProfiles(profile); + ctx.setClassLoader(targetClass.getClassLoader()); + ctx.load(path); + ctx.refresh(); + return ctx; + } + + + + +} diff --git a/applications/cafe/src/main/resources/META-INF/spring/integration/amqp/cafeDemo-amqp-baristaCold-xml.xml b/applications/cafe/src/main/resources/META-INF/spring/integration/amqp/cafeDemo-amqp-baristaCold-xml.xml new file mode 100644 index 00000000..1f9fc98f --- /dev/null +++ b/applications/cafe/src/main/resources/META-INF/spring/integration/amqp/cafeDemo-amqp-baristaCold-xml.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/applications/cafe/src/main/resources/META-INF/spring/integration/amqp/cafeDemo-amqp-baristaHot-xml.xml b/applications/cafe/src/main/resources/META-INF/spring/integration/amqp/cafeDemo-amqp-baristaHot-xml.xml new file mode 100644 index 00000000..1a873715 --- /dev/null +++ b/applications/cafe/src/main/resources/META-INF/spring/integration/amqp/cafeDemo-amqp-baristaHot-xml.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/applications/cafe/src/main/resources/META-INF/spring/integration/amqp/cafeDemo-amqp-config-xml.xml b/applications/cafe/src/main/resources/META-INF/spring/integration/amqp/cafeDemo-amqp-config-xml.xml new file mode 100644 index 00000000..3ac623d0 --- /dev/null +++ b/applications/cafe/src/main/resources/META-INF/spring/integration/amqp/cafeDemo-amqp-config-xml.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/applications/cafe/src/main/resources/META-INF/spring/integration/amqp/cafeDemo-amqp-operations-xml.xml b/applications/cafe/src/main/resources/META-INF/spring/integration/amqp/cafeDemo-amqp-operations-xml.xml new file mode 100644 index 00000000..6235a8e6 --- /dev/null +++ b/applications/cafe/src/main/resources/META-INF/spring/integration/amqp/cafeDemo-amqp-operations-xml.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/applications/cafe/src/main/resources/META-INF/spring/integration/amqp/cafeDemo-amqp-xml.xml b/applications/cafe/src/main/resources/META-INF/spring/integration/amqp/cafeDemo-amqp-xml.xml new file mode 100644 index 00000000..676165b6 --- /dev/null +++ b/applications/cafe/src/main/resources/META-INF/spring/integration/amqp/cafeDemo-amqp-xml.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/applications/cafe/src/main/resources/META-INF/spring/integration/cafeDemo-xml.xml b/applications/cafe/src/main/resources/META-INF/spring/integration/cafeDemo-xml.xml index 8c660018..7e89c821 100644 --- a/applications/cafe/src/main/resources/META-INF/spring/integration/cafeDemo-xml.xml +++ b/applications/cafe/src/main/resources/META-INF/spring/integration/cafeDemo-xml.xml @@ -12,22 +12,27 @@ + + + + + diff --git a/applications/cafe/src/test/resources/log4j.xml b/applications/cafe/src/test/resources/log4j.xml index 678b69b3..bbcbcf15 100644 --- a/applications/cafe/src/test/resources/log4j.xml +++ b/applications/cafe/src/test/resources/log4j.xml @@ -6,7 +6,7 @@ - + @@ -15,6 +15,14 @@ + + + + + + + +