From c56194fa5844c71deb6f47a22af1d114f735b484 Mon Sep 17 00:00:00 2001 From: Marco Rietveld Date: Wed, 29 Oct 2014 11:17:37 +0100 Subject: [PATCH] BZ-1153664 - Cannot use pessimistic locking with kie-spring (fixed failing test) (cherry picked from commit c151ff2d22fd028afd3b171d88282367b8291562) --- .../spring/jbpm/AbstractJbpmSpringTest.java | 27 +++++-- ...yManagerFactorySpringJpaTxManagerTest.java | 23 +++++- .../spring/jbpm/PessimisticLockingTest.java | 80 ------------------- .../resources/jbpm/jpa/jpa-locking-spring.xml | 50 ------------ .../test/resources/jbpm/jpa/jpa-spring.xml | 1 + 5 files changed, 42 insertions(+), 139 deletions(-) delete mode 100644 kie-spring/src/test/java/org/kie/spring/jbpm/PessimisticLockingTest.java delete mode 100644 kie-spring/src/test/resources/jbpm/jpa/jpa-locking-spring.xml diff --git a/kie-spring/src/test/java/org/kie/spring/jbpm/AbstractJbpmSpringTest.java b/kie-spring/src/test/java/org/kie/spring/jbpm/AbstractJbpmSpringTest.java index ff809d39bf..d00731dee9 100644 --- a/kie-spring/src/test/java/org/kie/spring/jbpm/AbstractJbpmSpringTest.java +++ b/kie-spring/src/test/java/org/kie/spring/jbpm/AbstractJbpmSpringTest.java @@ -3,36 +3,47 @@ import java.io.File; import java.io.FilenameFilter; -import bitronix.tm.resource.jdbc.PoolingDataSource; import org.junit.After; +import org.junit.AfterClass; import org.junit.Before; +import org.junit.BeforeClass; import org.springframework.context.support.ClassPathXmlApplicationContext; +import bitronix.tm.resource.jdbc.PoolingDataSource; + public abstract class AbstractJbpmSpringTest { - protected PoolingDataSource pds; + protected static PoolingDataSource pds; protected ClassPathXmlApplicationContext context; + @BeforeClass + public static void generalSetup() { + pds = setupPoolingDataSource(); + } + @Before public void setup() { cleanupSingletonSessionId(); System.setProperty("java.naming.factory.initial", "bitronix.tm.jndi.BitronixInitialContextFactory"); - pds = setupPoolingDataSource(); } - + @After public void cleanup() { - if (pds != null) { - pds.close(); - } if (context != null) { context.close(); + context = null; } System.clearProperty("java.naming.factory.initial"); } + @AfterClass + public static void generalCleanup() { + if (pds != null) { + pds.close(); + } + } - protected PoolingDataSource setupPoolingDataSource() { + protected static PoolingDataSource setupPoolingDataSource() { PoolingDataSource pds = new PoolingDataSource(); pds.setUniqueName("jdbc/jbpm-ds"); pds.setClassName("bitronix.tm.resource.jdbc.lrc.LrcXADataSource"); diff --git a/kie-spring/src/test/java/org/kie/spring/jbpm/EntityManagerFactorySpringJpaTxManagerTest.java b/kie-spring/src/test/java/org/kie/spring/jbpm/EntityManagerFactorySpringJpaTxManagerTest.java index 235aeaccda..870d32de36 100644 --- a/kie-spring/src/test/java/org/kie/spring/jbpm/EntityManagerFactorySpringJpaTxManagerTest.java +++ b/kie-spring/src/test/java/org/kie/spring/jbpm/EntityManagerFactorySpringJpaTxManagerTest.java @@ -1,10 +1,15 @@ package org.kie.spring.jbpm; +import java.lang.reflect.Field; import java.util.List; +import org.drools.core.command.impl.CommandBasedStatefulKnowledgeSession; +import org.drools.persistence.SingleSessionCommandService; import org.jbpm.process.audit.AuditLogService; import org.jbpm.process.audit.ProcessInstanceLog; import org.junit.Test; +import org.kie.api.runtime.Environment; +import org.kie.api.runtime.EnvironmentName; import org.kie.api.runtime.KieSession; import org.kie.api.runtime.manager.RuntimeEngine; import org.kie.api.runtime.manager.RuntimeManager; @@ -19,7 +24,6 @@ public class EntityManagerFactorySpringJpaTxManagerTest extends AbstractJbpmSpri @Test public void testSpringWithJpa() throws Exception{ - context = new ClassPathXmlApplicationContext("jbpm/jpa/jpa-spring.xml"); RuntimeManager manager = (RuntimeManager) context.getBean("runtimeManager"); @@ -28,6 +32,8 @@ public void testSpringWithJpa() throws Exception{ KieSession ksession = engine.getKieSession(); TaskService taskService = engine.getTaskService(); + validatePessimisticLockingUse(ksession); + ProcessInstance processInstance = ksession.startProcess("com.sample.bpmn.hello"); System.out.println("Process started"); @@ -57,4 +63,19 @@ public void testSpringWithJpa() throws Exception{ System.out.println("Process instance completed"); } + private void validatePessimisticLockingUse(KieSession ksession) throws Exception { + // do an ugly hack to get the info + CommandBasedStatefulKnowledgeSession cmdBasedKsession = (CommandBasedStatefulKnowledgeSession) ksession; + SingleSessionCommandService sscs = (SingleSessionCommandService) cmdBasedKsession.getCommandService(); + // yes, this will break some day, and when it does, just delete this entire test, which isn't that good anyways.. :/ + Field envField = SingleSessionCommandService.class.getDeclaredField("env"); + envField.setAccessible(true); + Environment env = (Environment) envField.get(sscs); + + // verify pessimistic lockings + Boolean pessLocking = (Boolean) env.get(EnvironmentName.USE_PESSIMISTIC_LOCKING); + assertNotNull( "Pessimistic locking not set in the environment: null object", pessLocking ); + assertTrue( "Pessimistic locking not set in the environment: null object", pessLocking ); + } + } diff --git a/kie-spring/src/test/java/org/kie/spring/jbpm/PessimisticLockingTest.java b/kie-spring/src/test/java/org/kie/spring/jbpm/PessimisticLockingTest.java deleted file mode 100644 index e44d4d6503..0000000000 --- a/kie-spring/src/test/java/org/kie/spring/jbpm/PessimisticLockingTest.java +++ /dev/null @@ -1,80 +0,0 @@ -package org.kie.spring.jbpm; - -import java.lang.reflect.Field; -import java.util.List; - -import org.drools.core.command.impl.CommandBasedStatefulKnowledgeSession; -import org.drools.persistence.SingleSessionCommandService; -import org.jbpm.process.audit.AuditLogService; -import org.jbpm.process.audit.ProcessInstanceLog; -import org.junit.Test; -import org.kie.api.runtime.Environment; -import org.kie.api.runtime.EnvironmentName; -import org.kie.api.runtime.KieSession; -import org.kie.api.runtime.manager.RuntimeEngine; -import org.kie.api.runtime.manager.RuntimeManager; -import org.kie.api.runtime.process.ProcessInstance; -import org.kie.api.task.TaskService; -import org.kie.api.task.model.TaskSummary; -import org.springframework.context.support.ClassPathXmlApplicationContext; - -import static junit.framework.Assert.*; - -public class PessimisticLockingTest extends AbstractJbpmSpringTest { - - @Test - public void testSpringWithJpaLocking() throws Exception { - - context = new ClassPathXmlApplicationContext("jbpm/jpa/jpa-locking-spring.xml"); - - RuntimeManager manager = (RuntimeManager) context.getBean("runtimeManager"); - - RuntimeEngine engine = manager.getRuntimeEngine(null); - KieSession ksession = engine.getKieSession(); - TaskService taskService = engine.getTaskService(); - - ProcessInstance processInstance = ksession.startProcess("com.sample.bpmn.hello"); - - validatePessimisticLockingUse(ksession); - System.out.println("Process started"); - - AuditLogService logService = (AuditLogService) context.getBean("logService"); - ProcessInstanceLog log = logService.findProcessInstance(processInstance.getId()); - assertNotNull(log); - - List tasks = taskService.getTasksAssignedAsPotentialOwner("john", "en-UK"); - System.out.println("Found " + tasks.size() + " task(s) for user 'john'"); - assertEquals(1, tasks.size()); - - long taskId = tasks.get(0).getId(); - taskService.start(taskId, "john"); - taskService.complete(taskId, "john", null); - - tasks = taskService.getTasksAssignedAsPotentialOwner("mary", "en-UK"); - System.out.println("Found " + tasks.size() + " task(s) for user 'mary'"); - assertEquals(1, tasks.size()); - - taskId = tasks.get(0).getId(); - taskService.start(taskId, "mary"); - taskService.complete(taskId, "mary", null); - - processInstance = ksession.getProcessInstance(processInstance.getId()); - assertNull(processInstance); - System.out.println("Process instance completed"); - } - - private void validatePessimisticLockingUse(KieSession ksession) throws Exception { - // do an ugly hack to get the info - CommandBasedStatefulKnowledgeSession cmdBasedKsession = (CommandBasedStatefulKnowledgeSession) ksession; - SingleSessionCommandService sscs = (SingleSessionCommandService) cmdBasedKsession.getCommandService(); - // yes, this will break some day, and when it does, just delete this entire test, which isn't that good anyways.. :/ - Field envField = SingleSessionCommandService.class.getDeclaredField("env"); - envField.setAccessible(true); - Environment env = (Environment) envField.get(sscs); - - // verify pessimistic lockings - Boolean pessLocking = (Boolean) env.get(EnvironmentName.USE_PESSIMISTIC_LOCKING); - assertNotNull( "Pessimistic locking not set in the environment: null object", pessLocking ); - assertTrue( "Pessimistic locking not set in the environment: null object", pessLocking ); - } -} diff --git a/kie-spring/src/test/resources/jbpm/jpa/jpa-locking-spring.xml b/kie-spring/src/test/resources/jbpm/jpa/jpa-locking-spring.xml deleted file mode 100644 index 61d617594b..0000000000 --- a/kie-spring/src/test/resources/jbpm/jpa/jpa-locking-spring.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - jbpm/processes/sample.bpmn - - - - - - - - - - - - - - - - - - - - - - - - - - - - STANDALONE_LOCAL_SPRING_SHARED_EM - - - diff --git a/kie-spring/src/test/resources/jbpm/jpa/jpa-spring.xml b/kie-spring/src/test/resources/jbpm/jpa/jpa-spring.xml index 51d684ace9..ea9ac873f5 100644 --- a/kie-spring/src/test/resources/jbpm/jpa/jpa-spring.xml +++ b/kie-spring/src/test/resources/jbpm/jpa/jpa-spring.xml @@ -25,6 +25,7 @@ +