Browse Source

Polishing

(cherry picked from commit 8c139ef)
pull/1056/head
Juergen Hoeller 10 years ago
parent
commit
1e491f11d7
  1. 9
      spring-context/src/main/java/org/springframework/scheduling/config/TriggerTask.java
  2. 16
      spring-jms/src/main/java/org/springframework/jms/annotation/JmsListenerAnnotationBeanPostProcessor.java
  3. 11
      spring-jms/src/main/java/org/springframework/jms/config/JmsListenerEndpointRegistrar.java
  4. 30
      src/test/java/org/springframework/scheduling/annotation/ScheduledAndTransactionalAnnotationIntegrationTests.java

9
spring-context/src/main/java/org/springframework/scheduling/config/TriggerTask.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2016 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -19,8 +19,8 @@ package org.springframework.scheduling.config;
import org.springframework.scheduling.Trigger; import org.springframework.scheduling.Trigger;
/** /**
* {@link Task} implementation defining a {@code Runnable} to be executed according to a * {@link Task} implementation defining a {@code Runnable} to be executed
* given {@link Trigger}. * according to a given {@link Trigger}.
* *
* @author Chris Beams * @author Chris Beams
* @since 3.2 * @since 3.2
@ -45,6 +45,7 @@ public class TriggerTask extends Task {
public Trigger getTrigger() { public Trigger getTrigger() {
return trigger; return this.trigger;
} }
} }

16
spring-jms/src/main/java/org/springframework/jms/annotation/JmsListenerAnnotationBeanPostProcessor.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2015 the original author or authors. * Copyright 2002-2016 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -198,8 +198,8 @@ public class JmsListenerAnnotationBeanPostProcessor
new MethodIntrospector.MetadataLookup<Set<JmsListener>>() { new MethodIntrospector.MetadataLookup<Set<JmsListener>>() {
@Override @Override
public Set<JmsListener> inspect(Method method) { public Set<JmsListener> inspect(Method method) {
Set<JmsListener> listenerMethods = Set<JmsListener> listenerMethods = AnnotationUtils.getRepeatableAnnotations(
AnnotationUtils.getRepeatableAnnotations(method, JmsListener.class, JmsListeners.class); method, JmsListener.class, JmsListeners.class);
return (!listenerMethods.isEmpty() ? listenerMethods : null); return (!listenerMethods.isEmpty() ? listenerMethods : null);
} }
}); });
@ -293,15 +293,9 @@ public class JmsListenerAnnotationBeanPostProcessor
} }
} }
/**
* Resolve the specified value if possible.
* @see ConfigurableBeanFactory#resolveEmbeddedValue
*/
private String resolve(String value) { private String resolve(String value) {
if (this.beanFactory instanceof ConfigurableBeanFactory) { return (this.beanFactory instanceof ConfigurableBeanFactory ?
return ((ConfigurableBeanFactory) this.beanFactory).resolveEmbeddedValue(value); ((ConfigurableBeanFactory) this.beanFactory).resolveEmbeddedValue(value) : value);
}
return value;
} }

11
spring-jms/src/main/java/org/springframework/jms/config/JmsListenerEndpointRegistrar.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2015 the original author or authors. * Copyright 2002-2016 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -136,7 +136,7 @@ public class JmsListenerEndpointRegistrar implements BeanFactoryAware, Initializ
this.endpointRegistry.registerListenerContainer( this.endpointRegistry.registerListenerContainer(
descriptor.endpoint, resolveContainerFactory(descriptor)); descriptor.endpoint, resolveContainerFactory(descriptor));
} }
startImmediately = true; // trigger immediate startup this.startImmediately = true; // trigger immediate startup
} }
} }
@ -149,9 +149,10 @@ public class JmsListenerEndpointRegistrar implements BeanFactoryAware, Initializ
} }
else if (this.containerFactoryBeanName != null) { else if (this.containerFactoryBeanName != null) {
Assert.state(this.beanFactory != null, "BeanFactory must be set to obtain container factory by bean name"); Assert.state(this.beanFactory != null, "BeanFactory must be set to obtain container factory by bean name");
// Consider changing this if live change of the factory is required...
this.containerFactory = this.beanFactory.getBean( this.containerFactory = this.beanFactory.getBean(
this.containerFactoryBeanName, JmsListenerContainerFactory.class); this.containerFactoryBeanName, JmsListenerContainerFactory.class);
return this.containerFactory; // Consider changing this if live change of the factory is required return this.containerFactory;
} }
else { else {
throw new IllegalStateException("Could not resolve the " + throw new IllegalStateException("Could not resolve the " +
@ -169,10 +170,12 @@ public class JmsListenerEndpointRegistrar implements BeanFactoryAware, Initializ
public void registerEndpoint(JmsListenerEndpoint endpoint, JmsListenerContainerFactory<?> factory) { public void registerEndpoint(JmsListenerEndpoint endpoint, JmsListenerContainerFactory<?> factory) {
Assert.notNull(endpoint, "Endpoint must be set"); Assert.notNull(endpoint, "Endpoint must be set");
Assert.hasText(endpoint.getId(), "Endpoint id must be set"); Assert.hasText(endpoint.getId(), "Endpoint id must be set");
// Factory may be null, we defer the resolution right before actually creating the container // Factory may be null, we defer the resolution right before actually creating the container
JmsListenerEndpointDescriptor descriptor = new JmsListenerEndpointDescriptor(endpoint, factory); JmsListenerEndpointDescriptor descriptor = new JmsListenerEndpointDescriptor(endpoint, factory);
synchronized (this.mutex) { synchronized (this.mutex) {
if (startImmediately) { // Register and start immediately if (this.startImmediately) { // register and start immediately
this.endpointRegistry.registerListenerContainer(descriptor.endpoint, this.endpointRegistry.registerListenerContainer(descriptor.endpoint,
resolveContainerFactory(descriptor), true); resolveContainerFactory(descriptor), true);
} }

30
src/test/java/org/springframework/scheduling/annotation/ScheduledAndTransactionalAnnotationIntegrationTests.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2014 the original author or authors. * Copyright 2002-2016 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -20,6 +20,7 @@ import java.util.concurrent.atomic.AtomicInteger;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.springframework.aop.support.AopUtils; import org.springframework.aop.support.AopUtils;
import org.springframework.beans.factory.BeanCreationException; import org.springframework.beans.factory.BeanCreationException;
import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext;
@ -55,13 +56,14 @@ public class ScheduledAndTransactionalAnnotationIntegrationTests {
Assume.group(TestGroup.PERFORMANCE); Assume.group(TestGroup.PERFORMANCE);
} }
@Test @Test
public void failsWhenJdkProxyAndScheduledMethodNotPresentOnInterface() { public void failsWhenJdkProxyAndScheduledMethodNotPresentOnInterface() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(Config.class, JdkProxyTxConfig.class, RepoConfigA.class); ctx.register(Config.class, JdkProxyTxConfig.class, RepoConfigA.class);
try { try {
ctx.refresh(); ctx.refresh();
fail("expected exception"); fail("Should have thrown BeanCreationException");
} }
catch (BeanCreationException ex) { catch (BeanCreationException ex) {
assertTrue(ex.getRootCause().getMessage().startsWith("@Scheduled method 'scheduled' found")); assertTrue(ex.getRootCause().getMessage().startsWith("@Scheduled method 'scheduled' found"));
@ -101,28 +103,36 @@ public class ScheduledAndTransactionalAnnotationIntegrationTests {
@Configuration @Configuration
@EnableTransactionManagement @EnableTransactionManagement
static class JdkProxyTxConfig { } static class JdkProxyTxConfig {
}
@Configuration @Configuration
@EnableTransactionManagement(proxyTargetClass=true) @EnableTransactionManagement(proxyTargetClass=true)
static class SubclassProxyTxConfig { } static class SubclassProxyTxConfig {
}
@Configuration @Configuration
static class RepoConfigA { static class RepoConfigA {
@Bean @Bean
public MyRepository repository() { public MyRepository repository() {
return new MyRepositoryImpl(); return new MyRepositoryImpl();
} }
} }
@Configuration @Configuration
static class RepoConfigB { static class RepoConfigB {
@Bean @Bean
public MyRepositoryWithScheduledMethod repository() { public MyRepositoryWithScheduledMethod repository() {
return new MyRepositoryWithScheduledMethodImpl(); return new MyRepositoryWithScheduledMethodImpl();
} }
} }
@Configuration @Configuration
@EnableScheduling @EnableScheduling
static class Config { static class Config {
@ -139,15 +149,17 @@ public class ScheduledAndTransactionalAnnotationIntegrationTests {
@Bean @Bean
public PersistenceExceptionTranslator peTranslator() { public PersistenceExceptionTranslator peTranslator() {
PersistenceExceptionTranslator txlator = mock(PersistenceExceptionTranslator.class); return mock(PersistenceExceptionTranslator.class);
return txlator;
} }
} }
public interface MyRepository { public interface MyRepository {
int getInvocationCount(); int getInvocationCount();
} }
@Repository @Repository
static class MyRepositoryImpl implements MyRepository { static class MyRepositoryImpl implements MyRepository {
@ -165,11 +177,15 @@ public class ScheduledAndTransactionalAnnotationIntegrationTests {
} }
} }
public interface MyRepositoryWithScheduledMethod { public interface MyRepositoryWithScheduledMethod {
int getInvocationCount(); int getInvocationCount();
public void scheduled();
void scheduled();
} }
@Repository @Repository
static class MyRepositoryWithScheduledMethodImpl implements MyRepositoryWithScheduledMethod { static class MyRepositoryWithScheduledMethodImpl implements MyRepositoryWithScheduledMethod {

Loading…
Cancel
Save