Configuration changes for AEM Schedulers?

后端 未结 2 752
你的背包
你的背包 2021-01-29 05:56

I am trying to implement simple scheduler for my project requirement, my project is using Adobe AEM. As of now I gone through Adobe site and tried to implement the

相关标签:
2条回答
  • 2021-01-29 06:27

    You missed to set immediate = true. This starts/activates an component/service automatically with the bundle-start. Otherwise the service is only started, if another (already started) service requests this service (or has a dependency).

    In OSGi all services are lazy started, and stopped as soon as nobody needs them. I agree, it could be improved, if the scheduler service would automatically start all services that it would trigger. But that's the way it is.


    This is a working example.

    @Component(immediate = true, metatype = true)
    @Service({ Runnable.class, AnotherServiceInterface.class})
    @Properties({
       // run every 5 seconds
       @Property(name = "scheduler.period", longValue = 5),
       // no concurrent execution
       @Property(name = "scheduler.concurrent", propertyPrivate = true, boolValue = false)
    })
    
    0 讨论(0)
  • 2021-01-29 06:48

    Following solution worked as required, here three cases are handled

    • with addJob() : executes the job every minute
    • with addPeriodicJob() : executes the job every 3 minutes
    • with fireJobAt() : executes the job at a specific date (date of deployment + delay of 30 seconds)

      import java.io.Serializable;
      import java.util.Date;
      import java.util.HashMap;
      import java.util.Map;
      
      import org.apache.felix.scr.annotations.Component;
      import org.apache.felix.scr.annotations.Reference;
      import org.apache.sling.commons.scheduler.Scheduler;
      import org.osgi.service.component.ComponentContext;
      import org.slf4j.Logger;
      import org.slf4j.LoggerFactory;
      
      @Component
      public class ScheduledPeriodicJob {
      
      /** Default log. */
      protected final Logger log = LoggerFactory.getLogger(this.getClass());
      
      /** The scheduler for rescheduling jobs. */
      @Reference
      private Scheduler scheduler;
      
      
      protected void activate(ComponentContext componentContext) throws Exception {
          //case 1: with addJob() method: executes the job every minute
                  String schedulingExpression = "0 * * * * ?";
                  String jobName1 = "case1";
                  Map<String, Serializable> config1 = new HashMap<String, Serializable>();
                  boolean canRunConcurrently = true;
                  final Runnable job1 = new Runnable() {
                      public void run() {
                          log.info("\n\nExecuting");
                          log.info("\n\nExecuting");
                          log.info("\n\nExecuting");
                          log.info("\n\nExecuting");
                          log.info("\n\nExecuting");
                          log.info("\n\nExecuting");
                          log.info("\n\nExecuting");
                          log.info("\n\nExecuting");
                          log.info("\n\nExecuting");
                      }
                  };
                  try {
                      this.scheduler.addJob(jobName1, job1, config1, schedulingExpression, canRunConcurrently);
                  } catch (Exception e) {
                      job1.run();
                  }
      
          //case 2: with addPeriodicJob(): executes the job every 3 minutes
                  String jobName2 = "case2";
                  long period = 180;
                  Map<String, Serializable> config2 = new HashMap<String, Serializable>();
                  final Runnable job2 = new Runnable() {
                      public void run() {
                          log.info("\nExecuting 2");
                          log.info("\nExecuting 2");
                          log.info("\nExecuting 2");
                          log.info("\nExecuting 2");
                          log.info("\nExecuting 2");
                          log.info("\nExecuting 2");
                          log.info("\nExecuting 2");
                          log.info("\nExecuting 2");
                      }
                  };
                  try {
                      this.scheduler.addPeriodicJob(jobName2, job2, config2, period, canRunConcurrently);
                  } catch (Exception e) {
                      job2.run();
                  }
      
          //case 3: with fireJobAt(): executes the job at a specific date (date of deployment + delay of 30 seconds)
                  String jobName3 = "case3";
                  final long delay = 30*1000;
                  final Date fireDate = new Date();
                  fireDate.setTime(System.currentTimeMillis() + delay);
                  Map<String, Serializable> config3 = new HashMap<String, Serializable>();
                  final Runnable job3 = new Runnable() {
                      public void run() {
                          log.info("\nExecuting at date: {} with a delay of: {} seconds", fireDate, delay/1000);
                          log.info("\nExecuting at date: {} with a delay of: {} seconds", fireDate, delay/1000);
                          log.info("\nExecuting at date: {} with a delay of: {} seconds", fireDate, delay/1000);
                          log.info("\nExecuting at date: {} with a delay of: {} seconds", fireDate, delay/1000);
                          log.info("\nExecuting at date: {} with a delay of: {} seconds", fireDate, delay/1000);
                          log.info("\nExecuting at date: {} with a delay of: {} seconds", fireDate, delay/1000);
                          log.info("\nExecuting at date: {} with a delay of: {} seconds", fireDate, delay/1000);
                          log.info("\nExecuting at date: {} with a delay of: {} seconds", fireDate, delay/1000);
                          log.info("\nExecuting at date: {} with a delay of: {} seconds", fireDate, delay/1000);
                          log.info("\nExecuting at date: {} with a delay of: {} seconds", fireDate, delay/1000);
                      }
                  };
                  try {
                      this.scheduler.fireJobAt(jobName3, job3, config3, fireDate);
                  } catch (Exception e) {
                      job3.run();
                  }
      }
      
      protected void deactivate(ComponentContext componentContext) {
          log.info("Deactivateddbye!");
      }
      
      }
      

    Below is pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <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/maven-v4_0_0.xsd ">
        <modelVersion>4.0.0</modelVersion>
        <!-- ====================================================================== -->
        <!-- P A R E N T P R O J E C T D E S C R I P T I O N -->
        <!-- ====================================================================== -->
        <parent>
            <groupId>com.adobe.cq</groupId>
            <artifactId>schedule</artifactId>
            <version>1.0-SNAPSHOT</version>
        </parent>
    
        <!-- ====================================================================== -->
        <!-- P R O J E C T D E S C R I P T I O N -->
        <!-- ====================================================================== -->
    
        <artifactId>schedule-bundle</artifactId>
        <packaging>bundle</packaging>
        <name>My Project Bundle</name>
    
        <dependencies>
            <dependency>
                <groupId>org.osgi</groupId>
                <artifactId>org.osgi.compendium</artifactId>
            </dependency>
            <dependency>
                <groupId>org.osgi</groupId>
                <artifactId>org.osgi.core</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.apache.felix</groupId>
                <artifactId>org.apache.felix.scr.annotations</artifactId>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
            </dependency>
    
    
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
            </dependency>
    
            <dependency>
                <groupId>javax.mail</groupId>
                <artifactId>mail</artifactId>
                <version>1.4</version>
            </dependency>
    
            <dependency>
                <groupId>com.tagic</groupId>
                <artifactId>logger</artifactId>
                <version>0.0.1-SNAPSHOT</version>
                <scope>system</scope>
                <systemPath>${project.basedir}/lib/logger-0.0.1-SNAPSHOT.jar</systemPath>
            </dependency>
    
            <dependency>
                <groupId>com.tagic</groupId>
                <artifactId>org.apache.sling.commons.scheduler</artifactId>
                <version>0.0.1-SNAPSHOT</version>
                <scope>system</scope>
                <systemPath>${project.basedir}/lib/org.apache.sling.commons.scheduler-2.3.3-R1232965.jar</systemPath>
            </dependency>
    
    </dependencies>
    
        <!-- ====================================================================== -->
        <!-- B U I L D D E F I N I T I O N -->
        <!-- ====================================================================== -->
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.felix</groupId>
                    <artifactId>maven-scr-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>generate-scr-descriptor</id>
                            <goals>
                                <goal>scr</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
                    <groupId>org.apache.felix</groupId>
                    <artifactId>maven-bundle-plugin</artifactId>
                    <extensions>true</extensions>
                    <configuration>
                        <instructions>
                            <Bundle-SymbolicName>com.adobe.cq.schedule-bundle</Bundle-SymbolicName>
                        </instructions>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.sling</groupId>
                    <artifactId>maven-sling-plugin</artifactId>
                    <configuration>
                        <slingUrl>http://${crx.host}:${crx.port}/apps/myproject/install</slingUrl>
                        <usePut>true</usePut>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-javadoc-plugin</artifactId>
                    <configuration>
                        <excludePackageNames>
                            *.impl
                        </excludePackageNames>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </project>
    
    0 讨论(0)
提交回复
热议问题