2 votes

Comment exécuter une tâche planifiée de Spring à l'aide d'un exécutable jar

Je veux développer une application autonome qui exécutera certaines tâches selon un calendrier. J'utilise spring @scheduled et taskscheduler pour y parvenir. Je ne peux pas utiliser spring boot car il nécessite spring 4.* et mon projet maven a des dépendances sur d'autres projets qui utilisent spring 3. Voici mon code ( référence ) :

Pom.xml :

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>com.pdp.ci</groupId>
    <artifactId>ci</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>file-requester</artifactId>
<name>file-requester</name>
<packaging>jar</packaging>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.7</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>com.pdp.ci</groupId>
        <artifactId>common-requester</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <exclusions>
            <exclusion>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpclient</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpcore</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.4</version>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpcore</artifactId>
        <version>4.4.4</version>
    </dependency>
</dependencies>

<build>
<plugins>
<plugin>
  <!-- Build an executable JAR -->
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <version>3.0.2</version>
  <configuration>
  </configuration>
</plugin>

<plugin> 
<artifactId>maven-dependency-plugin</artifactId> 
<executions> 
  <execution> 
    <phase>install</phase> 
      <goals> 
        <goal>copy-dependencies</goal> 
      </goals> 
      <configuration> 
         <outputDirectory>${project.build.directory}/lib</outputDirectory> 
      </configuration> 
    </execution> 
  </executions> 
</plugin> 
</plugins>
</build>
</project>

Classe de composant contenant la méthode programmée :

package com.ci.ias;

@Component
public class CustomRequester{

    @Scheduled(fixedRate=2000)
    public void processFiles(){
        logger.info("Process started");
        //task logic
    }
}

Classe de configuration :

@Configuration
@EnableScheduling
@ComponentScan(basePackages="com.ci.ias")
public class Requester implements SchedulingConfigurer {

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setScheduler(taskExecutor());
    }

    @Bean(destroyMethod="shutdown")
    public Executor taskExecutor() {
        return Executors.newScheduledThreadPool(100);
    }

}

Je suis capable de construire un bocal. Mais je ne peux pas l'exécuter car il n'y a pas de méthode 'main'. Comment exécuter ce programmateur en utilisant la ligne de commande ? Je suis un novice en la matière. Quelqu'un peut-il m'expliquer comment cela fonctionne ?

Merci.

1voto

kuhajeyan Points 6302

Si vous avez le jar de spring-boot (il semble que votre jar parent contient des dépendances de spring-boot)

Botte à ressort :

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(Application.class, args);

    }

}

java -jar votrejar.jar

Ou simplement créer une méthode principale et appeler cette classe

public class AppMain {

    @SuppressWarnings({ "unused", "resource" })
    public static void main(String args[]){
        AbstractApplicationContext  context = new AnnotationConfigApplicationContext(Requester.class);
    }

}

Vous pouvez ensuite ajouter cette classe principale dans votre manifeste

manifeste.mf

Manifest-Version: 1.0
Main-Class: com.example.MainClass
Class-Path: anyjarsneededtorunapp.jar

Appelez java -jar votrejar.jar

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X