/* * Copyright 2016 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.kie.server.integrationtests.jbpm.jms; import static org.assertj.core.api.Assertions.assertThat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; import javax.jms.XAConnectionFactory; import javax.transaction.UserTransaction; import bitronix.tm.TransactionManagerServices; import bitronix.tm.resource.jms.PoolingConnectionFactory; import org.junit.After; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.experimental.categories.Category; import org.junit.runners.Parameterized; import org.kie.server.api.KieServerConstants; import org.kie.server.api.marshalling.MarshallingFormat; import org.kie.server.api.model.ReleaseId; import org.kie.server.api.model.instance.ProcessInstance; import org.kie.server.client.KieServicesClient; import org.kie.server.client.KieServicesConfiguration; import org.kie.server.client.KieServicesFactory; import org.kie.server.client.ProcessServicesClient; import org.kie.server.client.jms.AsyncResponseHandler; import org.kie.server.client.jms.BlockingResponseCallback; import org.kie.server.client.jms.FireAndForgetResponseHandler; import org.kie.server.client.jms.ResponseHandler; import org.kie.server.integrationtests.category.JMSOnly; import org.kie.server.integrationtests.category.Transactional; import org.kie.server.integrationtests.jbpm.JbpmKieServerBaseIntegrationTest; import org.kie.server.integrationtests.shared.KieServerDeployer; import org.kie.server.integrationtests.shared.KieServerSynchronization; @Category({JMSOnly.class, Transactional.class}) public class JmsTransactionsIntegrationTest extends JbpmKieServerBaseIntegrationTest { private static final ReleaseId RELEASE_ID = new ReleaseId("org.kie.server.testing", "definition-project", "1.0.0.Final"); @Parameterized.Parameters(name = "{index}: {0}") public static Collection<Object[]> data() { KieServicesConfiguration jmsConfiguration = createKieServicesJmsConfiguration(); return new ArrayList<>(Arrays.asList(new Object[][]{ {MarshallingFormat.JAXB, jmsConfiguration, new FireAndForgetResponseHandler()}, {MarshallingFormat.JAXB, jmsConfiguration, new AsyncResponseHandler(new BlockingResponseCallback(null))}, {MarshallingFormat.JSON, jmsConfiguration, new FireAndForgetResponseHandler()}, {MarshallingFormat.JSON, jmsConfiguration, new AsyncResponseHandler(new BlockingResponseCallback(null))}, {MarshallingFormat.XSTREAM, jmsConfiguration, new FireAndForgetResponseHandler()}, {MarshallingFormat.XSTREAM, jmsConfiguration, new AsyncResponseHandler(new BlockingResponseCallback(null))} })); } @Parameterized.Parameter(2) public ResponseHandler responseHandler; private PoolingConnectionFactory connectionFactory; private UserTransaction transaction; private ProcessServicesClient transactionalProcessClient; @BeforeClass public static void buildAndDeployArtifacts() { KieServerDeployer.buildAndDeployCommonMavenParent(); KieServerDeployer.buildAndDeployMavenProject(ClassLoader.class.getResource("/kjars-sources/definition-project").getFile()); createContainer(CONTAINER_ID, RELEASE_ID); } @Before public void createTransactionalProcessClient() throws Exception { TransactionManagerServices.getConfiguration().setJournal("null").setGracefulShutdownInterval(2); transaction = TransactionManagerServices.getTransactionManager(); KieServicesConfiguration jmsConfiguration = createKieServicesJmsConfiguration(); KieServerXAConnectionFactory.connectionFactory = (XAConnectionFactory) jmsConfiguration.getConnectionFactory(); connectionFactory = new PoolingConnectionFactory(); connectionFactory.setClassName("org.kie.server.integrationtests.jbpm.jms.KieServerXAConnectionFactory"); connectionFactory.setUniqueName("cf"); connectionFactory.setMaxPoolSize(5); connectionFactory.setAllowLocalTransactions(true); connectionFactory.init(); jmsConfiguration.setConnectionFactory(connectionFactory); List<String> capabilities = new ArrayList<>(); capabilities.add(KieServerConstants.CAPABILITY_BPM); jmsConfiguration.setCapabilities(capabilities); jmsConfiguration.setJmsTransactional(true); jmsConfiguration.setResponseHandler(responseHandler); KieServicesClient kieServicesClient = KieServicesFactory.newKieServicesClient(jmsConfiguration); transactionalProcessClient = kieServicesClient.getServicesClient(ProcessServicesClient.class); } @After public void releaseResources() { if (connectionFactory != null) { connectionFactory.close(); } TransactionManagerServices.getTransactionManager().shutdown(); } @Test public void testTransactionCommit() throws Exception { transaction.begin(); Long processInstanceId = transactionalProcessClient.startProcess(CONTAINER_ID, PROCESS_ID_USERTASK); assertThat(processInstanceId).isNull(); transaction.commit(); KieServerSynchronization.waitForProcessInstanceStart(queryClient, CONTAINER_ID); } @Test public void testTransactionRollback() throws Exception { transaction.begin(); Long processInstanceId = transactionalProcessClient.startProcess(CONTAINER_ID, PROCESS_ID_USERTASK); assertThat(processInstanceId).isNull(); transaction.rollback(); List<ProcessInstance> processInstances = queryClient.findProcessInstances(0, 10); assertThat(processInstances).isNotNull().isEmpty(); } }