[jboss-svn-commits] JBL Code SVN: r29658 - in labs/jbossrules/trunk: drools-core/src/main/java/org/drools/management and 1 other directory.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Mon Oct 19 09:10:06 EDT 2009
Author: KrisVerlaenen
Date: 2009-10-19 09:10:05 -0400 (Mon, 19 Oct 2009)
New Revision: 29658
Modified:
labs/jbossrules/trunk/drools-api/src/main/java/org/drools/management/KnowledgeSessionMonitoringMBean.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/management/KnowledgeSessionMonitoring.java
Log:
JBRULES-2302: Extend JMX support for Flow
- added methods for retrieving process instance information
Modified: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/management/KnowledgeSessionMonitoringMBean.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/management/KnowledgeSessionMonitoringMBean.java 2009-10-19 12:20:49 UTC (rev 29657)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/management/KnowledgeSessionMonitoringMBean.java 2009-10-19 13:10:05 UTC (rev 29658)
@@ -103,4 +103,15 @@
public Map<String,String> getStatsByRule();
+ public long getTotalProcessInstancesStarted();
+
+ public long getTotalProcessInstancesCompleted();
+
+ public String getStatsForProcess(String processId);
+
+ public Map<String,String> getStatsByProcess();
+
+ public String getStatsForProcessInstance(long processInstanceId);
+
+ public Map<Long,String> getStatsByProcessInstance();
}
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/management/KnowledgeSessionMonitoring.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/management/KnowledgeSessionMonitoring.java 2009-10-19 12:20:49 UTC (rev 29657)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/management/KnowledgeSessionMonitoring.java 2009-10-19 13:10:05 UTC (rev 29658)
@@ -35,7 +35,15 @@
import org.drools.event.AgendaGroupPoppedEvent;
import org.drools.event.AgendaGroupPushedEvent;
import org.drools.event.BeforeActivationFiredEvent;
+import org.drools.event.RuleFlowCompletedEvent;
+import org.drools.event.RuleFlowEventListener;
+import org.drools.event.RuleFlowGroupActivatedEvent;
+import org.drools.event.RuleFlowGroupDeactivatedEvent;
+import org.drools.event.RuleFlowNodeTriggeredEvent;
+import org.drools.event.RuleFlowStartedEvent;
import org.drools.management.KnowledgeSessionMonitoring.AgendaStats.AgendaStatsData;
+import org.drools.management.KnowledgeSessionMonitoring.ProcessStats.ProcessInstanceStatsData;
+import org.drools.management.KnowledgeSessionMonitoring.ProcessStats.ProcessStatsData;
/**
* An MBean to monitor a given knowledge session
@@ -52,17 +60,21 @@
private InternalRuleBase kbase;
private ObjectName name;
public AgendaStats agendaStats;
+ public ProcessStats processStats;
public KnowledgeSessionMonitoring(InternalWorkingMemory ksession) {
this.ksession = ksession;
this.kbase = (InternalRuleBase) ksession.getRuleBase();
this.name = DroolsManagementAgent.createObjectName(KSESSION_PREFIX + ":type="+kbase.getId()+",group=Sessions,sessionId=Session-"+ksession.getId());
this.agendaStats = new AgendaStats();
+ this.processStats = new ProcessStats();
this.ksession.addEventListener( agendaStats );
+ this.ksession.addEventListener( processStats );
}
public void dispose() {
this.ksession.removeEventListener( agendaStats );
+ this.ksession.removeEventListener( processStats );
}
/* (non-Javadoc)
@@ -70,6 +82,7 @@
*/
public void reset() {
this.agendaStats.reset();
+ this.processStats.reset();
}
public InternalWorkingMemory getKsession() {
@@ -284,4 +297,215 @@
}
}
+ public long getTotalProcessInstancesStarted() {
+ return this.processStats.getConsolidatedStats().processInstancesStarted.get();
+ }
+
+ public long getTotalProcessInstancesCompleted() {
+ return this.processStats.getConsolidatedStats().processInstancesCompleted.get();
+ }
+
+ public String getStatsForProcess( String processId ) {
+ ProcessStatsData data = this.processStats.getProcessStats( processId );
+ String result = data == null ? "processInstancesStarted=0 processInstancesCompleted=0 processNodesTriggered=0" : data.toString();
+ return result;
+ }
+
+ public Map<String,String> getStatsByProcess() {
+ Map<String, String> result = new HashMap<String, String>();
+ for( Map.Entry<String, ProcessStatsData> entry : this.processStats.getProcessStats().entrySet() ) {
+ result.put( entry.getKey(), entry.getValue().toString() );
+ }
+ return result;
+ }
+
+ public String getStatsForProcessInstance( long processInstanceId ) {
+ ProcessInstanceStatsData data = this.processStats.getProcessInstanceStats( processInstanceId );
+ String result = data == null ? "Process instance not found" : data.toString();
+ return result;
+ }
+
+ public Map<Long,String> getStatsByProcessInstance() {
+ Map<Long, String> result = new HashMap<Long, String>();
+ for( Map.Entry<Long, ProcessInstanceStatsData> entry : this.processStats.getProcessInstanceStats().entrySet() ) {
+ result.put( entry.getKey(), entry.getValue().toString() );
+ }
+ return result;
+ }
+
+ public static class ProcessStats implements RuleFlowEventListener {
+
+ private GlobalProcessStatsData consolidated = new GlobalProcessStatsData();
+ private ConcurrentHashMap<String, ProcessStatsData> processStats = new ConcurrentHashMap<String, ProcessStatsData>();
+ private ConcurrentHashMap<Long, ProcessInstanceStatsData> processInstanceStats = new ConcurrentHashMap<Long, ProcessInstanceStatsData>();
+
+ public GlobalProcessStatsData getConsolidatedStats() {
+ return this.consolidated;
+ }
+
+ public Map<String, ProcessStatsData> getProcessStats() {
+ return this.processStats;
+ }
+
+ public ProcessStatsData getProcessStats(String processId) {
+ return this.processStats.get(processId);
+ }
+
+ public Map<Long, ProcessInstanceStatsData> getProcessInstanceStats() {
+ return this.processInstanceStats;
+ }
+
+ public ProcessInstanceStatsData getProcessInstanceStats(Long processInstanceId) {
+ return this.processInstanceStats.get(processInstanceId);
+ }
+
+ public void reset() {
+ this.consolidated.reset();
+ this.processStats.clear();
+ this.processInstanceStats.clear();
+ }
+
+ private ProcessStatsData getProcessStatsInstance(String processId) {
+ ProcessStatsData data = this.processStats.get(processId);
+ if (data == null) {
+ data = new ProcessStatsData();
+ this.processStats.put(processId, data);
+ }
+ return data;
+ }
+
+ private ProcessInstanceStatsData getProcessInstanceStatsInstance(Long processInstanceId) {
+ ProcessInstanceStatsData data = this.processInstanceStats.get(processInstanceId);
+ if (data == null) {
+ data = new ProcessInstanceStatsData();
+ this.processInstanceStats.put(processInstanceId, data);
+ }
+ return data;
+ }
+
+ public void afterRuleFlowStarted(RuleFlowStartedEvent event, WorkingMemory workingMemory) {
+ this.consolidated.processInstancesStarted.incrementAndGet();
+ ProcessStatsData data = getProcessStatsInstance(event.getProcessInstance().getProcessId());
+ data.processInstancesStarted.incrementAndGet();
+ ProcessInstanceStatsData dataI = getProcessInstanceStatsInstance(event.getProcessInstance().getId());
+ dataI.processStarted = new Date();
+ }
+
+ public void afterRuleFlowCompleted(RuleFlowCompletedEvent event, WorkingMemory workingMemory) {
+ this.consolidated.processInstancesCompleted.incrementAndGet();
+ ProcessStatsData data = getProcessStatsInstance(event.getProcessInstance().getProcessId());
+ data.processInstancesCompleted.incrementAndGet();
+ ProcessInstanceStatsData dataI = getProcessInstanceStatsInstance(event.getProcessInstance().getId());
+ dataI.processCompleted = new Date();
+ }
+
+ public void afterRuleFlowNodeTriggered(RuleFlowNodeTriggeredEvent event, WorkingMemory workingMemory) {
+ ProcessStatsData data = getProcessStatsInstance(event.getProcessInstance().getProcessId());
+ data.processNodesTriggered.incrementAndGet();
+ ProcessInstanceStatsData dataI = getProcessInstanceStatsInstance(event.getProcessInstance().getId());
+ dataI.processNodesTriggered++;
+ }
+
+ public void afterRuleFlowNodeLeft(RuleFlowNodeTriggeredEvent event, WorkingMemory workingMemory) {
+ }
+
+ public void afterRuleFlowGroupActivated(RuleFlowGroupActivatedEvent event, WorkingMemory workingMemory) {
+ // Do nothing
+ }
+
+ public void afterRuleFlowGroupDeactivated(RuleFlowGroupDeactivatedEvent event, WorkingMemory workingMemory) {
+ // Do nothing
+ }
+
+ public void beforeRuleFlowCompleted(RuleFlowCompletedEvent event, WorkingMemory workingMemory) {
+ // Do nothing
+ }
+
+ public void beforeRuleFlowGroupActivated(RuleFlowGroupActivatedEvent event, WorkingMemory workingMemory) {
+ // Do nothing
+ }
+
+ public void beforeRuleFlowGroupDeactivated(RuleFlowGroupDeactivatedEvent event, WorkingMemory workingMemory) {
+ // Do nothing
+ }
+
+ public void beforeRuleFlowNodeLeft(RuleFlowNodeTriggeredEvent event, WorkingMemory workingMemory) {
+ // Do nothing
+ }
+
+ public void beforeRuleFlowNodeTriggered(RuleFlowNodeTriggeredEvent event, WorkingMemory workingMemory) {
+ // Do nothing
+ }
+
+ public void beforeRuleFlowStarted(RuleFlowStartedEvent event, WorkingMemory workingMemory) {
+ // Do nothing
+ }
+
+ public static class GlobalProcessStatsData {
+
+ public AtomicLong processInstancesStarted;
+ public AtomicLong processInstancesCompleted;
+ public AtomicReference<Date> lastReset;
+
+ public GlobalProcessStatsData() {
+ this.processInstancesStarted = new AtomicLong(0);
+ this.processInstancesCompleted = new AtomicLong(0);
+ this.lastReset = new AtomicReference<Date>(new Date());
+ }
+
+ public void reset() {
+ this.processInstancesStarted.set( 0 );
+ this.processInstancesCompleted.set( 0 );
+ this.lastReset.set( new Date() );
+ }
+
+ public String toString() {
+ return "processInstancesStarted=" + processInstancesStarted.get()
+ + " processInstancesCompleted=" + processInstancesCompleted.get();
+ }
+ }
+
+ public static class ProcessStatsData extends GlobalProcessStatsData {
+
+ public AtomicLong processNodesTriggered;
+
+ public ProcessStatsData() {
+ this.processNodesTriggered = new AtomicLong(0);
+ }
+
+ public void reset() {
+ super.reset();
+ this.processNodesTriggered.set( 0 );
+ }
+
+ public String toString() {
+ return super.toString() + " processNodesTriggered=" + processNodesTriggered.get();
+ }
+ }
+
+ public static class ProcessInstanceStatsData {
+
+ // no need for synch, because one process instance cannot be executed concurrently
+ public Date processStarted;
+ public Date processCompleted;
+ public long processNodesTriggered;
+
+ public ProcessInstanceStatsData() {
+ this.processNodesTriggered = 0;
+ }
+
+ public void reset() {
+ this.processNodesTriggered = 0;
+ }
+
+ public String toString() {
+ return
+ (processStarted != null ? "processStarted=" + processStarted + " ": "") +
+ (processCompleted != null ? "processCompleted=" + processCompleted + " ": "") +
+ "processNodesTriggered=" + processNodesTriggered;
+ }
+ }
+
+ }
+
}
More information about the jboss-svn-commits
mailing list