Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save tarilabs/0dc970e218bbcf7c694bd43b11d9eaf5 to your computer and use it in GitHub Desktop.
Save tarilabs/0dc970e218bbcf7c694bd43b11d9eaf5 to your computer and use it in GitHub Desktop.
package org.drools.persistence.monitoring;
import org.drools.compiler.Person;
import org.drools.core.SessionConfiguration;
import org.drools.core.command.impl.CommandBasedStatefulKnowledgeSession;
import org.drools.core.command.impl.FireAllRulesInterceptor;
import org.drools.core.command.impl.LoggingInterceptor;
import org.drools.core.factmodel.traits.Traitable;
import org.drools.core.management.DroolsManagementAgent;
import org.drools.core.time.SessionPseudoClock;
import org.drools.persistence.SingleSessionCommandService;
import org.drools.persistence.util.DroolsPersistenceUtil;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import org.kie.api.KieBase;
import org.kie.api.KieServices;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.model.KieModuleModel;
import org.kie.api.builder.model.KieSessionModel.KieSessionType;
import org.kie.api.conf.MBeansOption;
import org.kie.api.definition.type.FactType;
import org.kie.api.definition.type.Position;
import org.kie.api.io.Resource;
import org.kie.api.management.KieContainerMonitorMXBean;
import org.kie.api.management.KieSessionMonitoringMXBean;
import org.kie.api.management.StatelessKieSessionMonitoringMXBean;
import org.kie.api.runtime.Environment;
import org.kie.api.runtime.EnvironmentName;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.KieSessionConfiguration;
import org.kie.api.runtime.StatelessKieSession;
import org.kie.api.runtime.conf.ClockTypeOption;
import org.kie.api.runtime.conf.KieSessionOption;
import org.kie.api.runtime.conf.KieSessionOptionsConfiguration;
import org.kie.api.runtime.rule.FactHandle;
import org.kie.internal.command.CommandFactory;
import org.kie.internal.persistence.jpa.JPAKnowledgeService;
import org.kie.internal.runtime.StatefulKnowledgeSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import bitronix.tm.TransactionManagerServices;
import javax.management.JMX;
import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.naming.InitialContext;
import javax.persistence.Persistence;
import javax.transaction.UserTransaction;
import java.io.Serializable;
import java.lang.management.ManagementFactory;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicInteger;
import static org.drools.persistence.util.DroolsPersistenceUtil.DROOLS_PERSISTENCE_UNIT_NAME;
import static org.drools.persistence.util.DroolsPersistenceUtil.OPTIMISTIC_LOCKING;
import static org.drools.persistence.util.DroolsPersistenceUtil.PESSIMISTIC_LOCKING;
import static org.drools.persistence.util.DroolsPersistenceUtil.createEnvironment;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
@RunWith(Parameterized.class)
public class MonitoringWithJPAKnowledgeServiceTest {
private static Logger logger = LoggerFactory.getLogger(MonitoringWithJPAKnowledgeServiceTest.class);
private Map<String, Object> context;
private Environment env;
private boolean locking;
@Parameters(name="{0}")
public static Collection<Object[]> persistence() {
Object[][] locking = new Object[][] {
{ OPTIMISTIC_LOCKING },
{ PESSIMISTIC_LOCKING }
};
return Arrays.asList(locking);
};
public MonitoringWithJPAKnowledgeServiceTest(String locking) {
this.locking = PESSIMISTIC_LOCKING.equals(locking);
}
private static String mbeansprop;
@BeforeClass
public static void setUpClass() throws Exception {
mbeansprop = System.getProperty( MBeansOption.PROPERTY_NAME );
System.setProperty( MBeansOption.PROPERTY_NAME, "enabled" );
}
@AfterClass
public static void tearDownClass() throws Exception {
if (mbeansprop != null) {
System.setProperty( MBeansOption.PROPERTY_NAME, mbeansprop );
} else {
System.setProperty( MBeansOption.PROPERTY_NAME, MBeansOption.DISABLED.toString() );
}
}
@Before
public void setUp() throws Exception {
context = DroolsPersistenceUtil.setupWithPoolingDataSource(DROOLS_PERSISTENCE_UNIT_NAME);
env = createEnvironment(context);
if( locking ) {
env.set(EnvironmentName.USE_PESSIMISTIC_LOCKING, true);
}
}
@After
public void tearDown() throws Exception {
DroolsPersistenceUtil.cleanUp(context);
}
@Test
public void testBasic() throws MalformedObjectNameException {
MBeanServer mbserver = ManagementFactory.getPlatformMBeanServer();
KieServices ks = KieServices.Factory.get();
String containerId = "testcontainer-"+System.currentTimeMillis();
KieContainer kc = ks.newKieClasspathContainer(containerId);
KieContainerMonitorMXBean c1Monitor = JMX.newMXBeanProxy(
mbserver,
DroolsManagementAgent.createObjectNameBy(containerId),
KieContainerMonitorMXBean.class);
KieBase kb = kc.getKieBase("org.kie.monitoring.kbase1");
// Use JPAKnowledgeService to create the KieSession
StatefulKnowledgeSession statefulKieSession = JPAKnowledgeService.newStatefulKnowledgeSession(kb, null, createEnvironment(context));
System.out.println(statefulKieSession);
KieSessionMonitoringMXBean statefulKieSessionMonitor = JMX.newMXBeanProxy(
mbserver,
DroolsManagementAgent.createObjectNameBy(containerId, "org.kie.monitoring.kbase1", KieSessionType.STATEFUL, "org.kie.monitoring.kbase1.ksession1"),
KieSessionMonitoringMXBean.class);
// There should be 3 mbeans for KieContainer, KieBase and KieSession.
assertEquals(3, mbserver.queryNames(new ObjectName("org.kie:kcontainerId="+ObjectName.quote(containerId)+",*"), null).size());
// needs to be done separately:
statefulKieSession.dispose();
kc.dispose();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment