diff --git a/spring-integration-samples/cafe/README.txt b/spring-integration-samples/cafe/README.txt new file mode 100644 index 0000000000..396f238eba --- /dev/null +++ b/spring-integration-samples/cafe/README.txt @@ -0,0 +1,35 @@ +Instructions for running CafeDemo sample +------------------------------------------------------------------------------- +1. See README.txt of the parent directory + +2. To run this sample as stand alone application simply execute HelloWorldDemo class + located in org.springframework.integration.samples.cafe package + +3. This sample is also configured to be a valid OSGi bundle. This means you can deploy generated JAR + into OSGi environment providing that Spring Integration bundles as well as other prerequisites + (e.g., Spring Framework were installed). + For example: To deploy it on SpringSource dmServer simply drop cafe-1.0.3.jar file, located + in the 'target' directory, to the 'pickup' directory of the dmServer. + You should see the following output in the trace file: + +. . . . . . . . . . . . . + System.out I ----------------------- +[2009-07-11 01:43:04.614] task-scheduler-3 System.out I Order #1 +[2009-07-11 01:43:04.614] task-scheduler-3 System.out I Iced MOCHA, 3 shots. +[2009-07-11 01:43:04.614] task-scheduler-3 System.out I Hot LATTE, 2 shots. +[2009-07-11 01:43:04.614] task-scheduler-3 System.out I ----------------------- +[2009-07-11 01:43:04.618] task-scheduler-2 System.out I task-scheduler-2 prepared cold drink #5 for order #5: iced 3 shot MOCHA +[2009-07-11 01:43:05.618] task-scheduler-2 System.out I task-scheduler-2 prepared cold drink #6 for order #6: iced 3 shot MOCHA +[2009-07-11 01:43:06.618] task-scheduler-2 System.out I task-scheduler-2 prepared cold drink #7 for order #7: iced 3 shot MOCHA +[2009-07-11 01:43:07.619] task-scheduler-2 System.out I task-scheduler-2 prepared cold drink #8 for order #8: iced 3 shot MOCHA +[2009-07-11 01:43:08.619] task-scheduler-2 System.out I task-scheduler-2 prepared cold drink #9 for order #9: iced 3 shot MOCHA +[2009-07-11 01:43:09.614] task-scheduler-3 System.out I task-scheduler-3 prepared hot drink #2 for order #2: hot 2 shot LATTE +[2009-07-11 01:43:09.615] task-scheduler-3 System.out I ----------------------- +[2009-07-11 01:43:09.615] task-scheduler-3 System.out I Order #2 +[2009-07-11 01:43:09.615] task-scheduler-3 System.out I Iced MOCHA, 3 shots. +[2009-07-11 01:43:09.615] task-scheduler-3 System.out I Hot LATTE, 2 shots. +[2009-07-11 01:43:09.615] task-scheduler-3 System.out I ----------------------- +[2009-07-11 01:43:09.620] task-scheduler-2 System.out I task-scheduler-2 prepared cold +. . . . . . . . . . . . . + +Happy integration :-) \ No newline at end of file diff --git a/spring-integration-samples/cafe/pom.xml b/spring-integration-samples/cafe/pom.xml index adbc57979f..fdaef72c42 100644 --- a/spring-integration-samples/cafe/pom.xml +++ b/spring-integration-samples/cafe/pom.xml @@ -8,4 +8,34 @@ cafe cafe 1.0.3 + + + org.eclipse.osgi + org.eclipse.osgi + 3.4.2.R34x_v20080826-1230 + + + + + + org.apache.maven.plugins + maven-jar-plugin + 2.2 + + + src/main/resources/META-INF/MANIFEST.MF + + + + + + + false + ${basedir}/src/main/resources + + META-INF/spring/*.xml + + + + \ No newline at end of file diff --git a/spring-integration-samples/cafe/src/main/java/org/springframework/integration/samples/cafe/xml/CafeDemo.java b/spring-integration-samples/cafe/src/main/java/org/springframework/integration/samples/cafe/xml/CafeDemo.java index 0a95d4c82d..54db622fe4 100644 --- a/spring-integration-samples/cafe/src/main/java/org/springframework/integration/samples/cafe/xml/CafeDemo.java +++ b/spring-integration-samples/cafe/src/main/java/org/springframework/integration/samples/cafe/xml/CafeDemo.java @@ -16,6 +16,7 @@ package org.springframework.integration.samples.cafe.xml; +import org.springframework.context.ApplicationContext; import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; @@ -28,27 +29,34 @@ import org.springframework.integration.samples.cafe.Order; * order is placed, the Cafe will send that order to the "orders" channel. * The relevant components are defined within the configuration file * ("cafeDemo.xml"). + * If deployed in SpringSource dmServer the ApplicationContext configuration is in + * META-INF/spring directory * * @author Mark Fisher * @author Marius Bogoevici + * @author Oleg Zhurakousky */ public class CafeDemo { public static void main(String[] args) { - AbstractApplicationContext context = null; + CafeDemo demo = new CafeDemo(); + AbstractApplicationContext applicationContext = null; if(args.length > 0) { - context = new FileSystemXmlApplicationContext(args); + applicationContext = new FileSystemXmlApplicationContext(args); } else { - context = new ClassPathXmlApplicationContext("cafeDemo.xml", CafeDemo.class); + applicationContext = new ClassPathXmlApplicationContext("cafeDemo.xml", CafeDemo.class); } - Cafe cafe = (Cafe) context.getBean("cafe"); - for (int i = 1; i <= 100; i++) { + demo.performDemo(applicationContext, 100); + } + + public void performDemo(ApplicationContext applicationContext, int iterations){ + Cafe cafe = (Cafe) applicationContext.getBean("cafe"); + for (int i = 1; i <= iterations; i++) { Order order = new Order(i); order.addItem(DrinkType.LATTE, 2, false); order.addItem(DrinkType.MOCHA, 3, true); cafe.placeOrder(order); } } - } diff --git a/spring-integration-samples/cafe/src/main/java/org/springframework/integration/samples/osgi/cafe/CafeBundleActivator.java b/spring-integration-samples/cafe/src/main/java/org/springframework/integration/samples/osgi/cafe/CafeBundleActivator.java new file mode 100644 index 0000000000..0cc8023085 --- /dev/null +++ b/spring-integration-samples/cafe/src/main/java/org/springframework/integration/samples/osgi/cafe/CafeBundleActivator.java @@ -0,0 +1,64 @@ +/* + * Copyright 2002-2009 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.osgi.cafe; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; +import org.osgi.framework.Constants; +import org.osgi.framework.ServiceEvent; +import org.osgi.framework.ServiceListener; +import org.osgi.framework.ServiceReference; +import org.springframework.context.ApplicationContext; +import org.springframework.integration.samples.cafe.xml.CafeDemo; + +/** + * Simple BundleActivator which will register ServiceListener which will listen for + * ApplicationContext published event. Once event is received, CafeDemo will be executed. + * + * @author Oleg Zhurakousky + */ +public class CafeBundleActivator implements BundleActivator, ServiceListener{ + private BundleContext context; + /** + * + */ + public void start(BundleContext context) throws Exception { + this.context = context; + context.addServiceListener(this); + } + /** + * + */ + public void stop(BundleContext context) throws Exception {} + /** + * + */ + public void serviceChanged(ServiceEvent serviceEvent) { + ServiceReference sr = serviceEvent.getServiceReference(); + if (context.getBundle().getSymbolicName().equals(sr.getProperty(Constants.BUNDLE_SYMBOLICNAME))){ + final ApplicationContext applicationContext = (ApplicationContext) context.getService(sr); + ExecutorService executor = Executors.newCachedThreadPool(); + executor.execute(new Runnable() { + public void run() { + new CafeDemo().performDemo(applicationContext, 20); + } + }); + } + } +} diff --git a/spring-integration-samples/cafe/src/main/resources/META-INF/MANIFEST.MF b/spring-integration-samples/cafe/src/main/resources/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..d0bb28f51f --- /dev/null +++ b/spring-integration-samples/cafe/src/main/resources/META-INF/MANIFEST.MF @@ -0,0 +1,11 @@ +Manifest-Version: 1.0 +Bundle-Version: 1.0.3 +Bundle-Name: org.springframework.integration.samples.cafe +Bundle-ManifestVersion: 2 +Bundle-SymbolicName: org.springframework.integration.samples.cafe +Bundle-Activator: org.springframework.integration.samples.osgi.cafe.CafeBundleActivator +Import-Package: org.osgi.framework;version="[1.4.0,1.4.0]" +Import-Library: org.aspectj;version="[1.6.2.RELEASE,1.6.2.RELEASE]", + org.springframework.spring;version="[2.5.6.A,2.5.6.A]" +Import-Bundle: org.springframework.integration;version="(1.0.2,1.0.4)", + org.springframework.integration.stream;version="(1.0.2,1.0.4)" diff --git a/spring-integration-samples/cafe/src/main/resources/META-INF/spring/cafe-osgi.xml b/spring-integration-samples/cafe/src/main/resources/META-INF/spring/cafe-osgi.xml new file mode 100644 index 0000000000..32cd822190 --- /dev/null +++ b/spring-integration-samples/cafe/src/main/resources/META-INF/spring/cafe-osgi.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +