Fix concurrent modification exception

pull/511/merge
Alex Baker 7 years ago
parent d1a6222046
commit 1b965fe53e

@ -164,6 +164,25 @@ public class JobQueueTest {
queue.getJobs());
}
@Test
public void multipleOverduePeriodsLapsed() {
long now = currentTimeMillis();
queue.add(new Reminder(1, now, TYPE_DUE));
queue.add(new Reminder(2, now + ONE_MINUTE, TYPE_DUE));
queue.add(new Reminder(3, now + 2 * ONE_MINUTE, TYPE_DUE));
verify(jobManager).schedule(TAG, now);
Freeze.freezeAt(now + ONE_MINUTE).thawAfter(new Snippet() {{
queue.removeOverdueJobs();
}});
assertEquals(
singletonList(new Reminder(3, now + 2 * ONE_MINUTE, TYPE_DUE)),
queue.getJobs());
}
@Test
public void clearShouldCancelExisting() {
queue.add(new Reminder(1, 1, 0));

@ -1,6 +1,7 @@
package org.tasks.jobs;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSortedSet;
import com.google.common.collect.Ordering;
import com.google.common.collect.TreeMultimap;
import com.google.common.primitives.Longs;
@ -8,6 +9,7 @@ import com.google.common.primitives.Longs;
import org.tasks.preferences.Preferences;
import java.util.List;
import java.util.NavigableSet;
import java.util.SortedSet;
import static com.google.common.collect.Iterables.filter;
@ -63,7 +65,7 @@ public class JobQueue<T extends JobQueueEntry> {
public synchronized List<T> removeOverdueJobs() {
List<T> result = newArrayList();
SortedSet<Long> lapsed = jobs.keySet().headSet(currentTimeMillis() + 1);
for (Long key : lapsed) {
for (Long key : ImmutableSortedSet.copyOf(lapsed)) {
result.addAll(jobs.removeAll(key));
}
return result;

Loading…
Cancel
Save