/* * Copyright 2015 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jbpm.test.functional.task; import java.util.ArrayList; import java.util.List; import java.util.Properties; import java.util.concurrent.CopyOnWriteArrayList; import org.jbpm.runtime.manager.impl.DefaultRegisterableItemsFactory; import org.jbpm.runtime.manager.impl.RuntimeEnvironmentBuilder; import org.jbpm.services.task.audit.JPATaskLifeCycleEventListener; import org.jbpm.services.task.identity.JBossUserGroupCallbackImpl; import org.jbpm.test.JbpmTestCase; import org.junit.Test; import org.kie.api.io.ResourceType; import org.kie.api.runtime.manager.RuntimeEnvironment; import org.kie.api.runtime.manager.RuntimeManager; import org.kie.api.runtime.manager.RuntimeManagerFactory; import org.kie.api.task.TaskLifeCycleEventListener; import org.kie.internal.builder.KnowledgeBuilder; import org.kie.internal.builder.KnowledgeBuilderFactory; import org.kie.internal.io.ResourceFactory; import org.kie.internal.task.api.UserGroupCallback; public class MultipleRuntimeManagerTest extends JbpmTestCase { public MultipleRuntimeManagerTest() { super(true, true); } @Test public void testCreationOfRuntimeManagersConcurrently() throws Exception { List<RuntimeManager> managers = new CopyOnWriteArrayList<RuntimeManager>(); HumanTaskResolver htr1 = new HumanTaskResolver(1, managers); HumanTaskResolver htr2 = new HumanTaskResolver(2, managers); Thread t1 = new Thread(htr1, "first"); Thread t2 = new Thread(htr2, "second"); t1.start(); t2.start(); t1.join(); t2.join(); assertEquals(2, managers.size()); } class HumanTaskResolver implements Runnable { private final long pid; private List<RuntimeManager> managers; public HumanTaskResolver(long pid, List<RuntimeManager> managers) { this.pid = pid; this.managers = managers; } @Override public void run() { RuntimeManager manager = getRuntimeManager("org/jbpm/test/functional/task/humantask.bpmn"); managers.add(manager); manager.close(); } private RuntimeManager getRuntimeManager(String process) { Properties properties = new Properties(); properties.setProperty("john", ""); UserGroupCallback userGroupCallback = new JBossUserGroupCallbackImpl(properties); // load up the knowledge base KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add(ResourceFactory.newClassPathResource(process), ResourceType.BPMN2); RuntimeEnvironment environment = RuntimeEnvironmentBuilder.getDefault() .persistence(false) .entityManagerFactory(getEmf()) .userGroupCallback(userGroupCallback) .knowledgeBase(kbuilder.newKnowledgeBase()) .registerableItemsFactory(new DefaultRegisterableItemsFactory() { @Override public List<TaskLifeCycleEventListener> getTaskListeners() { List<TaskLifeCycleEventListener> defaultListeners = new ArrayList<TaskLifeCycleEventListener>(); defaultListeners.add(new JPATaskLifeCycleEventListener(false)); // add any custom listeners defaultListeners.addAll(super.getTaskListeners()); // add listeners from deployment descriptor defaultListeners.addAll(getTaskListenersFromDescriptor()); return defaultListeners; } }) .get(); return RuntimeManagerFactory.Factory.get().newSingletonRuntimeManager(environment, "exec-" + pid); } } }