Improve JMS support in cli

This commit deprecates the proprietary EnableJmsMessaging annotation in
favour of the standard @EnableJms introduced as of Spring 4.1. This
commit also updates the sample and adds an integration test as the
feature was actually broken.

Fixes gh-1456
This commit is contained in:
Stephane Nicoll 2014-08-28 14:25:14 +02:00
parent bf249d4205
commit affb202e74
5 changed files with 56 additions and 26 deletions

View File

@ -5,8 +5,7 @@ package org.test
import java.util.concurrent.CountDownLatch import java.util.concurrent.CountDownLatch
@Log @Log
@Configuration @EnableJms
@EnableJmsMessaging
class JmsExample implements CommandLineRunner { class JmsExample implements CommandLineRunner {
private CountDownLatch latch = new CountDownLatch(1) private CountDownLatch latch = new CountDownLatch(1)
@ -14,18 +13,6 @@ class JmsExample implements CommandLineRunner {
@Autowired @Autowired
JmsTemplate jmsTemplate JmsTemplate jmsTemplate
@Bean
DefaultMessageListenerContainer jmsListener(ConnectionFactory connectionFactory) {
new DefaultMessageListenerContainer([
connectionFactory: connectionFactory,
destinationName: "spring-boot",
pubSubDomain: true,
messageListener: new MessageListenerAdapter(new Receiver(latch:latch)) {{
defaultListenerMethod = "receive"
}}
])
}
void run(String... args) { void run(String... args) {
def messageCreator = { session -> def messageCreator = { session ->
session.createObjectMessage("Greetings from Spring Boot via ActiveMQ") session.createObjectMessage("Greetings from Spring Boot via ActiveMQ")
@ -35,11 +22,8 @@ class JmsExample implements CommandLineRunner {
log.info "Send JMS message, waiting..." log.info "Send JMS message, waiting..."
latch.await() latch.await()
} }
}
@Log @JmsListener(destination = 'spring-boot')
class Receiver {
CountDownLatch latch
def receive(String message) { def receive(String message) {
log.info "Received ${message}" log.info "Received ${message}"
latch.countDown() latch.countDown()

View File

@ -28,29 +28,32 @@ import org.springframework.boot.groovy.EnableJmsMessaging;
* {@link CompilerAutoConfiguration} for Spring JMS. * {@link CompilerAutoConfiguration} for Spring JMS.
* *
* @author Greg Turnquist * @author Greg Turnquist
* @author Stephane Nicoll
*/ */
public class JmsCompilerAutoConfiguration extends CompilerAutoConfiguration { public class JmsCompilerAutoConfiguration extends CompilerAutoConfiguration {
@Override @Override
public boolean matches(ClassNode classNode) { public boolean matches(ClassNode classNode) {
// Slightly weird detection algorithm because there is no @Enable annotation for return AstUtils.hasAtLeastOneAnnotation(classNode, "EnableJms") ||
// Spring JMS AstUtils.hasAtLeastOneAnnotation(classNode, "EnableJmsMessaging");
return AstUtils.hasAtLeastOneAnnotation(classNode, "EnableJmsMessaging");
} }
@Override @Override
public void applyDependencies(DependencyCustomizer dependencies) public void applyDependencies(DependencyCustomizer dependencies)
throws CompilationFailedException { throws CompilationFailedException {
dependencies.add("spring-jms", "geronimo-jms_1.1_spec"); dependencies.add("spring-jms", "jms-api");
} }
@Override @Override
public void applyImports(ImportCustomizer imports) throws CompilationFailedException { public void applyImports(ImportCustomizer imports) throws CompilationFailedException {
imports.addStarImports("javax.jms", "org.springframework.jms.core", imports.addStarImports("javax.jms",
"org.springframework.jms.annotation",
"org.springframework.jms.config",
"org.springframework.jms.core",
"org.springframework.jms.listener", "org.springframework.jms.listener",
"org.springframework.jms.listener.adapter").addImports( "org.springframework.jms.listener.adapter")
EnableJmsMessaging.class.getCanonicalName()); .addImports(EnableJmsMessaging.class.getCanonicalName());
} }
} }

View File

@ -26,10 +26,13 @@ import org.springframework.boot.cli.compiler.autoconfigure.JmsCompilerAutoConfig
/** /**
* Pseudo annotation used to trigger {@link JmsCompilerAutoConfiguration}. * Pseudo annotation used to trigger {@link JmsCompilerAutoConfiguration}.
*
* @deprecated since 1.2.0 in favor of {@code EnableJms}
*/ */
@Target(ElementType.TYPE) @Target(ElementType.TYPE)
@Documented @Documented
@Retention(RetentionPolicy.RUNTIME) @Retention(RetentionPolicy.RUNTIME)
@Deprecated
public @interface EnableJmsMessaging { public @interface EnableJmsMessaging {
} }

View File

@ -28,6 +28,7 @@ import static org.junit.Assert.assertThat;
* *
* @author Phillip Webb * @author Phillip Webb
* @author Andy Wilkinson * @author Andy Wilkinson
* @author Stephane Nicoll
*/ */
public class ReproIntegrationTests { public class ReproIntegrationTests {
@ -71,4 +72,10 @@ public class ReproIntegrationTests {
this.thrown.expectMessage("is not a JAR file"); this.thrown.expectMessage("is not a JAR file");
this.cli.jar("secure.groovy", "crsh.groovy"); this.cli.jar("secure.groovy", "crsh.groovy");
} }
@Test
public void jmsListener() throws Exception {
this.cli.run("jms.groovy");
assertThat(this.cli.getOutput(), containsString("Hello World"));
}
} }

View File

@ -0,0 +1,33 @@
package org.test
@Grab("org.apache.activemq:activemq-all:5.4.0")
@Grab("activemq-pool")
import java.util.concurrent.CountDownLatch
@Log
@EnableJms
class SampleJmsListener implements CommandLineRunner {
private CountDownLatch latch = new CountDownLatch(1)
@Autowired
JmsTemplate jmsTemplate
void run(String... args) {
def messageCreator = { session ->
session.createObjectMessage("Hello World")
} as MessageCreator
log.info "Sending JMS message..."
jmsTemplate.send("testQueue", messageCreator)
log.info "Sent JMS message, waiting..."
latch.await()
}
@JmsListener(destination = 'testQueue')
def receive(String message) {
log.info "Received ${message}"
latch.countDown()
}
}