[ 
https://issues.apache.org/jira/browse/OFBIZ-9374?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Michael Brohl closed OFBIZ-9374.
--------------------------------
       Resolution: Fixed
    Fix Version/s: Release Branch 14.12
                   Release Branch 15.12
                   Release Branch 16.11

Thanks Tobias,

you patch is in

trunk r1796047
release16.11 r1796049
release15.12 r1796050
release14.12 r1796052


>  Fix TemporalExpressions.Frequency to avoid moving job start times away from 
> given freqCount raster
> ---------------------------------------------------------------------------------------------------
>
>                 Key: OFBIZ-9374
>                 URL: https://issues.apache.org/jira/browse/OFBIZ-9374
>             Project: OFBiz
>          Issue Type: Bug
>          Components: framework
>    Affects Versions: Trunk
>            Reporter: Tobias Laufkötter
>            Assignee: Michael Brohl
>             Fix For: Release Branch 16.11, Release Branch 15.12, Release 
> Branch 14.12
>
>         Attachments: OFBIZ-9374.patch
>
>
> If a job is scheduled using TemporalExpressions.Frequency the start time of 
> the job will gradually move forward when the excecution of the job is delayed 
> by one or more units of the frequency type. 
> Example: Job is set up to start at 2017-01-01 00:00:00 and run every ten 
> minutes. One month later due to some circumstances the job starts at 
> 2017-02-01 00:01:01 which results in the next execution to be scheduled at 
> 2017-02-01 01:11:00 in stead of 2017-02-01 01:10:00.
> The reason behind this behaviour is the 
> TemporalExpressions.Frequency#prepareCal function. It has the purpose to jump 
> from the first starting time to the latest possible execution of the job. But 
> instead it just sets it to the current time (with the precision of the chosen 
> frequency type) and calculates the next execution time from this point.
> {code:title=Frequencies.java}
>         protected Calendar prepareCal(Calendar cal) {
>             // Performs a "sane" skip forward in time - avoids time consuming 
> loops
>             // like incrementing every second from Jan 1 2000 until today
>             Calendar skip = (Calendar) cal.clone();
>             skip.setTime(this.start);
>             long deltaMillis = cal.getTimeInMillis() - this.start.getTime();
>             if (deltaMillis < 1000) {
>                 return skip;
>             }
>             long divisor = deltaMillis;
>             if (this.freqType == Calendar.DAY_OF_MONTH) {
>                 divisor = 86400000;
>             } else if (this.freqType == Calendar.HOUR) {
>                 divisor = 3600000;
>             } else if (this.freqType == Calendar.MINUTE) {
>                 divisor = 60000;
>             } else if (this.freqType == Calendar.SECOND) {
>                 divisor = 1000;
>             } else {
>                 return skip;
>             }
>             float units = deltaMillis / divisor;
>             units = (units / this.freqCount) * this.freqCount;
>             skip.add(this.freqType, (int)units);
>             while (skip.after(cal)) {
>                 skip.add(this.freqType, -this.freqCount);
>             }
>             return skip;
>         }
> {code}
> The error is at {{units = (units / this.freqCount) * this.freqCount;}}. This 
> is no operation. What should have been done (and to me it looks like this was 
> the intention), is a substraction of the remainder of an integer division of 
> {{units}} and {{this.freqCount}} to get the number of units of the frequency 
> type that have passed since the first start time.



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to