1 2 Previous Next 18 Replies Latest reply on Jan 27, 2013 8:03 AM by luiz_gustavo Go to original post
      • 15. Re: TimerService: Timer interval stops after retry
        wdfink

        It's OpenSource

        You might check my changes in AS7 (follow the git pull request in the Jira).

        In AS6 you can simply find the class from the stacktrace (CalendarTimerTask.java:80) and you might fix this bug

        • 16. Re: TimerService: Timer interval stops after retry
          happy_robot

          I stepped up to AS7 and noticed that some of the services i need aren't yet implemented.

          So finally i fixed the problem this way:

           

           

          @Singleton

          @LocalBean

          @TransactionManagement(TransactionManagementType.BEAN)

          public class BusinessTimerService {

           

              private final static int MAX_THREAD_TIME = 180;

              private PingThread businessThread = new BusinessLogicThread();

              private Date startTimestamp;

           

              private static class BusinessLogicThread extends Thread {

           

                  public void run() {

                      // Business logic

                  }

           

              }

           

              @Schedule(second="*/"+Constants.PING_DELAY, minute="*", hour="*", persistent=false)

              public void timeout() {

                  if(businessThread == null || !businessThread.isAlive()) {

                      startTimestamp= new Date();

                      businessThread = new BusinessLogicThread();

                      businessThread.start();

                  } else {

                      long executionTime = new Date().getTime() - startTimestamp.getTime();

                      if(executionTime > MAX_THREAD_TIME*1000) {

                          System.err.println("Exception: Thread execution time == "+executionTime+"ms. Timeout! Start a new thread!");

                          businessThread = null;

                      }

                  }

              }

           

          }

           

           

          After a 3-day-Stresstest i recommend this code-skeleton(and yes...i know....NULLing the thread after the user-defined timeout isn't the best way :-) )

           

           

           

          Regards

           

          Daniel

          • 17. Re: TimerService: Timer interval stops after retry
            wdfink

            Hi Daniel,

            you use your fix with AS6, right?

            I think you know that this solution violate the EJB spec because the Thread handling is not allowed.

            So it should be just a workaround and must be well tested, as you already done, for the specific application/JBoss installation!

             

            Also there is now a full certified AS7.1 (hurray ) in the download area http://download.jboss.org/jbossas/7.1/jboss-as-7.1.0.Final/jboss-as-7.1.0.Final.zip available.

            You may find here all what you need to migrate.

             

            regards

            Wolf

            • 18. Re: TimerService: Timer interval stops after retry
              luiz_gustavo

              Hi,

               

               

              I had the same problem.

              In my case, the processing time is not known, just the timeout, so it is common the timeout occur before the processing finish.

              I could fix it with this simple workaround:

               

               

              @Startup

              @Singleton

              @TransactionManagement(TransactionManagementType.CONTAINER)

              public class SomeScheduledService implements SchedulableService{

               

                 

                  @Resource

                  private TimerService timerService;

                 

                  @Resource

                  private SessionContext context;

                 

                  private static boolean canExecute = true;   

                 

                  @Timeout

                  @Lock(LockType.READ)

                  @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)

                  public void run(Timer timer){

                     

                      if(SomeScheduledService.canExecute){

                         

                          try {

                                                         

                              SomeScheduledService.canExecute = false;

                             

                              // call important business services

                                 

                          } catch (Exception e) {

                             

                              // do something useful here

                             

                          } finally {

                             

                              SomeScheduledService.canExecute = true;

                             

                              // release resources       

                          }   

                     

                      } else{           

                          // sorry... I'm busy now... try again next timeout           

                      }       

                  }   

              }

               

               

              I hope it can help.

               

               

              Best Regards,

              Luiz Gustavo S. de Souza

              1 2 Previous Next