2015-10-16 1 views
2

Mon fichier application.properties définit le profil par défaut comme spring.profiles.active=test et j'ai une méthode que je programme comme ceci:Méthode Java SpringBoot encore @Scheduled sous @Profile incorrect?

@Scheduled(initialDelay = 2500, fixedRate = 60 * 1000 * minutesRecheckRate) 
    @Profile("loop") 
    public void processingLoop() { 
    System.out.println(Arrays.toString(env.getActiveProfiles())); 
    //.. the rest is omitted for brevity. 

À ma connaissance, dans ces circonstances, je ne verrais ce faire appelé lors de l'exécution de mes tests unitaires parce que Je ne change pas le profil par défaut. Cela s'avère pas être le cas, car cela est encore en train prévu et je vois la sortie

[test] 

dans ma console malgré tous mes efforts pour l'empêcher. Qu'est-ce qui se passe? Pourquoi cela fonctionne-t-il encore avec un profil actif différent?

MISE À JOUR: Je ne peux pas donner beaucoup plus en raison du fait que c'est une application pertinente au travail, mais je vais donner ce que je peux.

La classe est configurée comme ceci:

@Configuration 
@EnableScheduling 
public class BatchConfiguration { 

Les tests unitaires sont tous annotés comme ceci:

@SpringApplicationConfiguration(classes = SpringBatchJsontestApplication.class) 
public class SpringBatchJsontestApplicationTests extends AbstractTestNGSpringContextTests { 

La principale classe d'application est la suivante:

@SpringBootApplication 
public class SpringBatchJsontestApplication { 

Aucun ils changent tout le reste. Il n'y a pas de fichier context.xml, il s'agit d'une application SpringBoot donc tout est uniquement annotations.


Ceci est le résultat final qui fonctionne très bien pour moi

@Profile("test") 
    @Bean(name = TaskManagementConfigUtils.SCHEDULED_ANNOTATION_PROCESSOR_BEAN_NAME) 
    @Role(BeanDefinition.ROLE_INFRASTRUCTURE) 
    public ScheduledAnnotationBeanPostProcessor scheduleBeanProcessorOverride() { 
    logger.info("Test Profile is active, overriding ScheduledAnnotationBeanPostProcessor to prevent annotations from running during tests."); 
    return new ScheduledAnnotationBeanPostProcessor() { 
     @Override 
     protected void processScheduled(Scheduled scheduled, Method method, Object bean) { 
     logger.info(String.format("Preventing scheduling for %s, %s, %s", scheduled, method, bean.getClass().getCanonicalName())); 
     } 
    }; 
    } 

Voici la configuration de POM pour déclencher le profil de test, donc je ne plus avoir à le faire explicitement dans mon application.properties.

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.19</version> 
    <configuration> 
     <systemPropertyVariables> 
     <spring.profiles.active>test</spring.profiles.active> 
     </systemPropertyVariables> 
    </configuration> 
    </plugin> 
+0

pouvez-vous afficher plus de votre code? le code '@ Configuration' environnant et le test unitaire? – leeor

+0

S'il vous plaît montrer votre contexte xml ou autre code avec la configuration de la publicité – SerMintt

Répondre

2

L'annotation @Profile ne fait rien pour une méthode régulière, ni une méthode annotée avec @Scheduled. Le javadoc déclare

L'annotation @Profile peut être utilisé dans l'une des façons suivantes:

  • comme annotation niveau de type sur une classe directement ou indirectement annotée avec @Component, y compris @Configuration cours
  • comme une méta-annotation, dans le but de composer un stéréotype personnalisé annotations
  • comme annotation au niveau de la méthode sur une méthode @Bean

Le dernier cas, en gras, est la seule utilisation de @Profile sur une méthode.

Si vous souhaitez activer le comportement @Scheduled sous un profil spécifique, annotez le bean (définition) qui le contient.

+0

Cela a du sens. Je suppose que je devrais court-circuiter manuellement la méthode en retournant manuellement dans cette instance ... ou jerry-rig quelque chose avec aspectj. Merci pour votre clairification! –

+0

Déplacez la planification vers une seule classe, annotez cette classe avec '@ Profile' et' @ Component' ou les likes et vous obtiendrez le comportement que vous voulez. –

+0

Avec un '@ Profile', comme M. Deinum l'a suggéré, j'ai utilisé cette réponse: http://stackoverflow.com/a/21920710/1478636 –