diff --git a/basic/amqp/README.md b/basic/amqp/README.md index 103da0e0..d4231a94 100644 --- a/basic/amqp/README.md +++ b/basic/amqp/README.md @@ -11,13 +11,51 @@ Once the application is started, you enter some text on the command prompt and a # How to Run the Sample -If you imported the example into your IDE, you can just run class **org.springframework.integration.samples.amqp.Main**. For example in [SpringSource Tool Suite](http://www.springsource.com/developer/sts) (STS) do: +If you imported the example into your IDE, you can just run class **org.springframework.integration.samples.amqp.SampleSimple**. For example in [SpringSource Tool Suite](http://www.springsource.com/developer/sts) (STS) do: -* Right-click on Main class --> Run As --> Java Application +* Right-click on SampleSimple class --> Run As --> Java Application -Alternatively, you can start the sample from the command line ([Gradle](http://www.gradle.org) required): +Alternatively, you can start the sample from the command line: -* gradlew :amqp:run +* ./gradlew :amqp:runSimple + +Enter some data (e.g. 'foo') on the console; you will see a [tapInbound] log and 'Received: foo'. + +Ctrl-C to terminate. + +The __SamplePubConfirmsReturns__ class is similar, but demonstrates publisher confirms and returns. + +* Right-click on SamplePubConfirmsReturns class --> Run As --> Java Application + +Or: + +* ./gradlew :amqp:runPubConfirmsReturns + +When you enter a message in the console you will see the message received, together with a send confirmation: + +```` +foo +Received: foo +foo sent ok +```` + +When you enter 'fail', the message is sent with a bad routing key; you will see the message is sent ok, but returned because it is not routable: + +```` +fail +fail returned:NO_ROUTE +fail sent ok +```` + +When you enter 'nack', the message is sent to a non-existent exchange; the broker reacts to this by closing the channel with an error and Spring AMQP generates a Nack: + +```` +nack +nack send failed (nack) +11:54:00.818 ERROR [pool-1-thread-1][org.springframework.amqp.rabbit.connection.CachingConnectionFactory] Channel shutdown: channel error; protocol method: #method(reply-code=404, reply-text=NOT_FOUND - no exchange 'badExchange' in vhost '/', class-id=60, method-id=40) +```` + +Ctrl-C to terminate. # Used Spring Integration components diff --git a/basic/amqp/src/main/java/org/springframework/integration/samples/amqp/SamplePubConfirmsReturns.java b/basic/amqp/src/main/java/org/springframework/integration/samples/amqp/SamplePubConfirmsReturns.java new file mode 100644 index 00000000..10ff8af2 --- /dev/null +++ b/basic/amqp/src/main/java/org/springframework/integration/samples/amqp/SamplePubConfirmsReturns.java @@ -0,0 +1,75 @@ +/* + * Copyright 2014 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.amqp; + +import org.apache.log4j.Logger; + +import org.springframework.context.support.AbstractApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +/** + * Starts the Spring Context and will initialize the Spring Integration message flow. + * + * @author Gary Russell. + * @since 4.0 + * + */ +public final class SamplePubConfirmsReturns { + + private static final Logger LOGGER = Logger.getLogger(SamplePubConfirmsReturns.class); + + private SamplePubConfirmsReturns() { } + + /** + * Load the Spring Integration Application Context + * + * @param args - command line arguments + */ + public static void main(final String... args) { + + LOGGER.info("\n=========================================================" + + "\n " + + "\n Welcome to Spring Integration! " + + "\n " + + "\n For more information please visit: " + + "\n http://www.springsource.org/spring-integration " + + "\n " + + "\n=========================================================" ); + + @SuppressWarnings("resource") + final AbstractApplicationContext context = + new ClassPathXmlApplicationContext("classpath:META-INF/spring/integration/spring-integration-confirms-context.xml"); + + context.registerShutdownHook(); + + LOGGER.info("\n=========================================================" + + "\n " + + "\n This is the AMQP Sample with confirms/returns - " + + "\n " + + "\n Please enter some text and press return. The entered " + + "\n Message will be sent to the configured RabbitMQ Queue," + + "\n then again immediately retrieved from the Message " + + "\n Broker and ultimately printed to the command line. " + + "\n Send 'fail' to demonstrate a return because the " + + "\n message couldn't be routed to a queue. " + + "\n Send 'nack' to demonstrate a NACK because the " + + "\n exchange doesn't exist, causing the channel to be " + + "\n closed in error by the broker. " + + "\n " + + "\n=========================================================" ); + + } +} diff --git a/basic/amqp/src/main/java/org/springframework/integration/samples/amqp/Main.java b/basic/amqp/src/main/java/org/springframework/integration/samples/amqp/SampleSimple.java similarity index 89% rename from basic/amqp/src/main/java/org/springframework/integration/samples/amqp/Main.java rename to basic/amqp/src/main/java/org/springframework/integration/samples/amqp/SampleSimple.java index 5bab07c7..752c8ae6 100644 --- a/basic/amqp/src/main/java/org/springframework/integration/samples/amqp/Main.java +++ b/basic/amqp/src/main/java/org/springframework/integration/samples/amqp/SampleSimple.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2014 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. @@ -24,14 +24,14 @@ import org.springframework.context.support.ClassPathXmlApplicationContext; * Starts the Spring Context and will initialize the Spring Integration message flow. * * @author Gunnar Hillert - * @version 1.0 + * @since 1.0 * */ -public final class Main { +public final class SampleSimple { - private static final Logger LOGGER = Logger.getLogger(Main.class); + private static final Logger LOGGER = Logger.getLogger(SampleSimple.class); - private Main() { } + private SampleSimple() { } /** * Load the Spring Integration Application Context @@ -49,8 +49,9 @@ public final class Main { + "\n " + "\n=========================================================" ); + @SuppressWarnings("resource") final AbstractApplicationContext context = - new ClassPathXmlApplicationContext("classpath:META-INF/spring/integration/*-context.xml"); + new ClassPathXmlApplicationContext("classpath:META-INF/spring/integration/spring-integration-context.xml"); context.registerShutdownHook(); diff --git a/basic/amqp/src/main/resources/META-INF/spring/integration/spring-integration-confirms-context.xml b/basic/amqp/src/main/resources/META-INF/spring/integration/spring-integration-confirms-context.xml new file mode 100644 index 00000000..32368782 --- /dev/null +++ b/basic/amqp/src/main/resources/META-INF/spring/integration/spring-integration-confirms-context.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/basic/amqp/src/main/resources/META-INF/spring/integration/spring-integration-context.xml b/basic/amqp/src/main/resources/META-INF/spring/integration/spring-integration-context.xml index 0780ab18..8dac90e7 100644 --- a/basic/amqp/src/main/resources/META-INF/spring/integration/spring-integration-context.xml +++ b/basic/amqp/src/main/resources/META-INF/spring/integration/spring-integration-context.xml @@ -34,10 +34,12 @@ - + + - diff --git a/basic/amqp/src/main/resources/log4j.xml b/basic/amqp/src/main/resources/log4j.xml index 40d94ca5..094beea2 100644 --- a/basic/amqp/src/main/resources/log4j.xml +++ b/basic/amqp/src/main/resources/log4j.xml @@ -19,6 +19,10 @@ + + + + diff --git a/build.gradle b/build.gradle index 0b76df18..424a45e1 100644 --- a/build.gradle +++ b/build.gradle @@ -388,14 +388,29 @@ project('loanshark') { project('amqp') { description = 'AMQP Basic Sample' - apply plugin: 'application' - - mainClassName = 'org.springframework.integration.samples.amqp.Main' - dependencies { compile "org.springframework.integration:spring-integration-stream:$springIntegrationVersion" compile "org.springframework.integration:spring-integration-amqp:$springIntegrationVersion" } + + task runSimple(type: JavaExec) { + main 'org.springframework.integration.samples.amqp.SampleSimple' + classpath = sourceSets.main.runtimeClasspath + standardInput = System.in + // useful for debugging the GradleWorkerMain + // jvmArgs "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000" + + } + + task runPubConfirmsReturns(type: JavaExec) { + main 'org.springframework.integration.samples.amqp.SamplePubConfirmsReturns' + classpath = sourceSets.main.runtimeClasspath + standardInput = System.in + // useful for debugging the GradleWorkerMain + // jvmArgs "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000" + + } + } project('control-bus') { diff --git a/gradle.properties b/gradle.properties index 896b55a0..4e776fbd 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1,2 @@ -version=2.2.0.BUILD-SNAPSHOT +version=3.0.0.BUILD-SNAPSHOT springBootVersion=1.1.0.RELEASE