@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user