Skip to content

Commit

Permalink
[JBPM-10242] Disable linear search on condition
Browse files Browse the repository at this point in the history
Setting org.jbpm.ejb.timer.disable.linear.search and
org.jbpm.ejb.timer.disable.linear.remove to true
  • Loading branch information
fjtirado committed Oct 1, 2024
1 parent d79847f commit 98b3f63
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 45 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -247,8 +247,8 @@ private Serializable removeTransientFields(Serializable info) {
return info;
}

private boolean performLinearSearch() {
return Boolean.getBoolean("org.jbpm.ejb.timer.linear.search");
private boolean disableLinearSearch(String suffix) {
return Boolean.getBoolean("org.jbpm.ejb.timer.disable.linear." + suffix);
}


Expand Down Expand Up @@ -288,39 +288,36 @@ public boolean removeJob(JobHandle jobHandle, Timer ejbTimer) {
logger.warn("No timerJobInstance available for {}", ejbHandle);
}

if (performLinearSearch()) {
for (Timer timer : timerService.getTimers()) {
try {
Serializable info = timer.getInfo();
if (info instanceof EjbTimerJob) {
EjbTimerJob job = (EjbTimerJob) info;

EjbGlobalJobHandle handle = (EjbGlobalJobHandle) job.getTimerJobInstance().getJobHandle();
if (handle.getUuid().equals(ejbHandle.getUuid())) {
logger.info("Job handle {} does match timer and is going to be canceled", jobHandle);

try {
timer.cancel();
} catch (Throwable e) {
logger.warn("Timer cancel error for handle {}", handle, e);
return false;
}
return true;
if (disableLinearSearch("remove")) {
logger.warn("Skipping linear search to delete uuid {}", ejbHandle.getUuid());
return false;
}
for (Timer timer : timerService.getTimers()) {
try {
Serializable info = timer.getInfo();
if (info instanceof EjbTimerJob) {
EjbTimerJob job = (EjbTimerJob) info;

EjbGlobalJobHandle handle = (EjbGlobalJobHandle) job.getTimerJobInstance().getJobHandle();
if (handle.getUuid().equals(ejbHandle.getUuid())) {
logger.info("Job handle {} does match timer and is going to be canceled", jobHandle);

try {
timer.cancel();
} catch (Throwable e) {
logger.warn("Timer cancel error for handle {}", handle, e);
return false;
}
return true;
}
} catch (NoSuchObjectLocalException e) {
logger.debug("Timer {} has already expired or was canceled ", timer);
}
} catch (NoSuchObjectLocalException e) {
logger.debug("Timer {} has already expired or was canceled ", timer);
}
logger.info("Job handle {} does not match any timer on {} scheduler service", jobHandle, this);
return false;
} else {
logger.warn("Skipping linear search to delete uuid {}", ejbHandle.getUuid());
return false;
}
}


logger.info("Job handle {} does not match any timer on {} scheduler service", jobHandle, this);
return false;
}

public TimerJobInstance getTimerByName(String jobName) {
if (useLocalCache) {
Expand All @@ -329,8 +326,9 @@ public TimerJobInstance getTimerByName(String jobName) {
return localCache.get(jobName);
}
}
TimerJobInstance found = null;
if (performLinearSearch()) {
if (disableLinearSearch("search")) {
logger.warn("Skipping linear search to find uuid {}", jobName);
} else {
for (Timer timer : timerService.getTimers()) {
try {
Serializable info = timer.getInfo();
Expand All @@ -340,22 +338,20 @@ public TimerJobInstance getTimerByName(String jobName) {
EjbGlobalJobHandle handle = (EjbGlobalJobHandle) job.getTimerJobInstance().getJobHandle();

if (handle.getUuid().equals(jobName)) {
found = handle.getTimerJobInstance();
TimerJobInstance found = handle.getTimerJobInstance();
if (useLocalCache) {
localCache.putIfAbsent(jobName, found);
}
logger.debug("Job {} does match timer and is going to be returned {}", jobName, found);
break;
return found;
}
}
} catch (NoSuchObjectLocalException e) {
logger.debug("Timer info for {} was not found ", timer);
}
}
} else {
logger.warn("Skipping linear search to find uuid {}", jobName);
}
return found;
return null;
}

public void evictCache(JobHandle jobHandle) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@

import org.drools.core.time.impl.TimerJobInstance;
import org.jbpm.persistence.timer.GlobalJpaTimerJobInstance;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

Expand All @@ -42,8 +41,6 @@ public class EJBTimerSchedulerTest {

@Before
public void setup() {

System.setProperty("org.jbpm.ejb.timer.linear.search", "true");
TimerService timerService = mock(TimerService.class);
when(timerService.getTimers()).thenReturn(timers);

Expand All @@ -61,11 +58,6 @@ public void setup() {
scheduler.timerService = timerService;
}

@After
public void cleanup() {
System.clearProperty("org.jbpm.ejb.timer.linear.search");
}

@Test
public void testEjbTimerSchedulerTestOnTimerLoop() {
// first call to go over list of timers should not add anything to the cache as there is no matching timers
Expand Down

0 comments on commit 98b3f63

Please sign in to comment.