package org.drools.core.management;
import java.util.Date;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.AtomicReference;
import javax.management.ObjectName;
import org.drools.core.impl.StatelessKnowledgeSessionImpl;
import org.kie.api.builder.model.KieSessionModel.KieSessionType;
import org.kie.api.event.KieRuntimeEventManager;
import org.kie.api.event.rule.ObjectDeletedEvent;
import org.kie.api.event.rule.ObjectInsertedEvent;
import org.kie.api.event.rule.ObjectUpdatedEvent;
import org.kie.api.management.StatelessKieSessionMonitoringMXBean;
public class StatelessKieSessionMonitoringImpl extends GenericKieSessionMonitoringImpl implements StatelessKieSessionMonitoringMXBean {
private ObjectName name;
public RuleRuntimeStats ruleRuntimeStats;
public StatelessKieSessionMonitoringImpl(String containerId, String kbaseId, String ksessionName) {
super(containerId, kbaseId, ksessionName);
this.name = DroolsManagementAgent.createObjectNameBy(containerId, kbaseId, KieSessionType.STATELESS, ksessionName);
this.ruleRuntimeStats = new RuleRuntimeStats();
}
@Override
public ObjectName getName() {
return this.name;
}
public void attach(KieRuntimeEventManager ksession) {
ksession.addEventListener( ruleRuntimeStats );
super.attach(ksession);
}
public void detach(KieRuntimeEventManager ksession) {
ksession.removeEventListener( ruleRuntimeStats );
super.detach(ksession);
}
public void dispose() {
for (KieRuntimeEventManager ksession : ksessions) {
ksession.removeEventListener( ruleRuntimeStats );
}
super.dispose();
}
public void reset() {
this.ruleRuntimeStats.reset();
super.reset();
}
@Override
public long getTotalSessions() {
long totalCount = 0;
for (KieRuntimeEventManager kr : ksessions) {
totalCount += ((StatelessKnowledgeSessionImpl) kr).getWorkingMemoryCreatec();
}
return totalCount;
}
@Override
public long getTotalObjectsInserted() {
return this.ruleRuntimeStats.getConsolidatedStats().objectsInserted.get();
}
@Override
public long getTotalObjectsDeleted() {
return this.ruleRuntimeStats.getConsolidatedStats().objectsDeleted.get();
}
public static class RuleRuntimeStats implements org.kie.api.event.rule.RuleRuntimeEventListener {
private RuleRuntimeStatsData data = new RuleRuntimeStatsData();
public RuleRuntimeStats() {
}
public RuleRuntimeStatsData getConsolidatedStats() {
return this.data;
}
public void reset() {
this.data.reset();
}
@Override
public void objectInserted(ObjectInsertedEvent event) {
this.data.objectsInserted.incrementAndGet();
}
@Override
public void objectUpdated(ObjectUpdatedEvent event) { }
@Override
public void objectDeleted(ObjectDeletedEvent event) {
this.data.objectsDeleted.incrementAndGet();
}
public static class RuleRuntimeStatsData {
public AtomicLong objectsInserted;
public AtomicLong objectsDeleted;
public AtomicReference<Date> lastReset;
public RuleRuntimeStatsData() {
this.objectsInserted = new AtomicLong(0);
this.objectsDeleted = new AtomicLong(0);
this.lastReset = new AtomicReference<Date>(new Date());
}
public void reset() {
this.objectsInserted.set( 0 );
this.objectsDeleted.set( 0 );
this.lastReset.set( new Date() );
}
public String toString() {
return "objectsInserted="+objectsInserted.get()+" objectsDeleted="+objectsDeleted.get();
}
}
}
}