[jbpm-commits] JBoss JBPM SVN: r6958 - in jbpm3/branches/jbpm-3.2-soa/core/src: test/java/org/jbpm and 3 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Thu Jun 16 10:58:11 EDT 2011


Author: marco.rietveld
Date: 2011-06-16 10:58:11 -0400 (Thu, 16 Jun 2011)
New Revision: 6958

Added:
   jbpm3/branches/jbpm-3.2-soa/core/src/test/java/org/jbpm/jbpm3235/
   jbpm3/branches/jbpm-3.2-soa/core/src/test/java/org/jbpm/jbpm3235/JBPM3235Test.java
   jbpm3/branches/jbpm-3.2-soa/core/src/test/resources/org/jbpm/jbpm3235/
   jbpm3/branches/jbpm-3.2-soa/core/src/test/resources/org/jbpm/jbpm3235/hibernate.postgresql.properties
   jbpm3/branches/jbpm-3.2-soa/core/src/test/resources/org/jbpm/jbpm3235/jbpm.cfg.xml
   jbpm3/branches/jbpm-3.2-soa/core/src/test/resources/org/jbpm/jbpm3235/spy.properties
Modified:
   jbpm3/branches/jbpm-3.2-soa/core/src/main/resources/org/jbpm/job/Job.hbm.xml
Log:
SOA-1581, JBPM-3235: JobSession.getFirstDueJob wasn't performing due to no index on the Job.duedate column. 

Modified: jbpm3/branches/jbpm-3.2-soa/core/src/main/resources/org/jbpm/job/Job.hbm.xml
===================================================================
--- jbpm3/branches/jbpm-3.2-soa/core/src/main/resources/org/jbpm/job/Job.hbm.xml	2011-06-16 14:41:58 UTC (rev 6957)
+++ jbpm3/branches/jbpm-3.2-soa/core/src/main/resources/org/jbpm/job/Job.hbm.xml	2011-06-16 14:58:11 UTC (rev 6958)
@@ -13,7 +13,7 @@
     <discriminator type="char" column="CLASS_" />
     <version name="version" column="VERSION_" />
 
-    <property name="dueDate" column="DUEDATE_" type="timestamp" />
+    <property name="dueDate" column="DUEDATE_" type="timestamp" index="IDX_JOB_DUEDATE"/>
 
     <many-to-one name="processInstance"
                  column="PROCESSINSTANCE_"

Added: jbpm3/branches/jbpm-3.2-soa/core/src/test/java/org/jbpm/jbpm3235/JBPM3235Test.java
===================================================================
--- jbpm3/branches/jbpm-3.2-soa/core/src/test/java/org/jbpm/jbpm3235/JBPM3235Test.java	                        (rev 0)
+++ jbpm3/branches/jbpm-3.2-soa/core/src/test/java/org/jbpm/jbpm3235/JBPM3235Test.java	2011-06-16 14:58:11 UTC (rev 6958)
@@ -0,0 +1,194 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2011, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jbpm3235;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Collection;
+import java.util.Date;
+
+import org.hibernate.cfg.Configuration;
+import org.jbpm.db.AbstractDbTestCase;
+import org.jbpm.db.JobSession;
+import org.jbpm.db.hibernate.HibernateHelper;
+import org.jbpm.graph.def.ProcessDefinition;
+import org.jbpm.graph.exe.ProcessInstance;
+import org.jbpm.graph.exe.Token;
+import org.jbpm.job.ExecuteActionJob;
+import org.jbpm.job.Job;
+import org.jbpm.persistence.db.DbPersistenceServiceFactory;
+
+/**
+ * JobSession.getFirstDueJob was not performing due to the queries having to sort the duedate field without an index. 
+ * 
+ * In order to see actual queries and query times, I used p6spy-2.0-SNAPSHOT. (see spy.properties in org/jbpm/jbpm3235/). 
+ * @see <a href="https://jira.jboss.org/jira/browse/JBPM-3235">JBPM-3235</a>
+ */
+public class JBPM3235Test extends AbstractDbTestCase {
+
+  private static final String PROCESS_NAME = "JBPM3235";
+  private long[] monitoredJobIds = null;
+ 
+  private String postgresDatabaseProperties = "org/jbpm/jbpm3235/hibernate.postgresql.properties";
+  /** 
+   * Feel free to make your own database properties file 
+   *  and fill it appropriately: see the above file for necessary fields.
+   *  
+   * private String oracleDatabaseProperties = "org/jbpm/jbpm3235/hibernate.oracle.properties";
+   */
+
+  // Number of rows to add to the Job table
+  private int numJobsToAdd = 5000;
+
+  // Make sure this test does not run in Hudson
+  private boolean thisIsAnAutomatedTest = true;
+  private boolean startWithCleanDatabase = true;
+  private boolean cleanDatabaseAfterTest = true;
+  
+  /**
+   * Setup the test case.
+   */
+  protected void setUp() throws Exception {
+    if( thisIsAnAutomatedTest ) return;
+    
+    setUpDatabase();
+    if( startWithCleanDatabase ) { 
+      ensureCleanDatabase();
+    }
+    super.setUp();
+
+    ProcessDefinition processDefinition = new ProcessDefinition(PROCESS_NAME);
+    deployProcessDefinition(processDefinition);
+  }
+
+  private void setUpDatabase() {
+    String hibernateCfgXmlResource = null;
+    String propertiesResource = postgresDatabaseProperties;
+
+    // Ensure that the hibernate session uses the properties we configured (see propertiesResource above)
+    DbPersistenceServiceFactory persistenceServiceFactory = (DbPersistenceServiceFactory) getJbpmConfiguration().getServiceFactory("persistence");
+    Configuration configuration = HibernateHelper.createConfiguration(hibernateCfgXmlResource, propertiesResource);
+    persistenceServiceFactory.setConfiguration(configuration);
+  }
+
+  /**
+   * Clean up after the test case.
+   */
+  protected void tearDown() throws Exception {
+    if( thisIsAnAutomatedTest ) { return; }
+    if( cleanDatabaseAfterTest ) {
+      ensureCleanDatabase();
+      deleteProcessDefinitions(); 
+    }
+    
+    closeJbpmContext();
+    log.info("### END " + getName() + " ####################");
+  }
+
+  //
+  // ACTUAL TESTS
+  //
+
+  public void testFirstDueJobQueries() {
+    if( thisIsAnAutomatedTest ) { return; } 
+    // This test has to do with the performance on an actual DB
+    // (not that Hypersonic _isn't_, but.. you know what I mean!
+    if (getHibernateDialect().indexOf("HSQL") != -1) { return; }
+
+    addJobsToDb();
+
+    JobSession jobSession = jbpmContext.getJobSession();
+    Job result = null;
+
+    // Query: JobSession.getFirstUnownedDueJob
+    result = jobSession.getFirstDueJob(null, null);
+    assertTrue(result != null);
+
+    // Query: JobSession.getFirstDueJob
+    String lockOwner = PROCESS_NAME;
+    result = jobSession.getFirstDueJob(lockOwner, null);
+    assertTrue(result != null);
+
+    // Query: JobSession.getFirstDueJobExcludingMonitoredJobs
+    Collection monitoredJobs = new ArrayList(numJobsToAdd/2);
+    for (int i = 0; i < monitoredJobIds.length / 2; ++i) {
+      monitoredJobs.add(new Long(monitoredJobIds[i]));
+    }
+    result = jobSession.getFirstDueJob(lockOwner, monitoredJobs);
+    assertTrue(result != null);
+
+    // Query: JobSession.getFirstDueJobExcludingMonitoredJobs WITH NULL LockOwner
+    result = jobSession.getFirstDueJob(null, monitoredJobs);
+    assertTrue(result != null);
+  }
+
+  protected void addJobsToDb() {
+    ProcessInstance processInstance = jbpmContext.newProcessInstanceForUpdate(PROCESS_NAME);
+
+    Job[] jobs = new Job[numJobsToAdd];
+    Token rootToken = processInstance.getRootToken();
+    int i = 0;
+    for (; i < (numJobsToAdd/2); ++i) {
+      jobs[i] = createJob(rootToken, null, i);
+      jbpmContext.getJobSession().saveJob(jobs[i]);
+    }
+    for (; i < numJobsToAdd; ++i) {
+      jobs[i] = createJob(rootToken, PROCESS_NAME, i);
+      jbpmContext.getJobSession().saveJob(jobs[i]);
+    }
+    
+    newTransaction();
+
+    monitoredJobIds = new long[jobs.length];
+    for (i = 0; i < jobs.length; ++i) {
+      monitoredJobIds[i] = jobs[i].getId();
+    }
+  }
+
+  private Job createJob(Token token, String lockOwner, int i) {
+    Job job = new ExecuteActionJob(token);
+
+    // Add information used for querying
+    job.setLockOwner(lockOwner);
+
+    // Fields used in query for sorting
+    job.setDueDate(getOneHourAgoMinus(i));
+
+    // Other fields
+    job.setException("Simulated Exception");
+    job.setSuspended(false);
+    
+    return job;
+  }
+  
+  
+  private Date getOneHourAgoMinus(int seconds) {
+    Calendar calendar = Calendar.getInstance();
+    calendar.add(Calendar.HOUR, -1);
+    // databases such as mysql do not have millisecond precision
+    calendar.set(Calendar.MILLISECOND, 0);
+    calendar.roll(Calendar.SECOND, -seconds);
+    Date oneHourAgo = calendar.getTime();
+    return oneHourAgo;
+  }
+
+}


Property changes on: jbpm3/branches/jbpm-3.2-soa/core/src/test/java/org/jbpm/jbpm3235/JBPM3235Test.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native

Added: jbpm3/branches/jbpm-3.2-soa/core/src/test/resources/org/jbpm/jbpm3235/hibernate.postgresql.properties
===================================================================
--- jbpm3/branches/jbpm-3.2-soa/core/src/test/resources/org/jbpm/jbpm3235/hibernate.postgresql.properties	                        (rev 0)
+++ jbpm3/branches/jbpm-3.2-soa/core/src/test/resources/org/jbpm/jbpm3235/hibernate.postgresql.properties	2011-06-16 14:58:11 UTC (rev 6958)
@@ -0,0 +1,11 @@
+hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
+
+# hibernate.connection.driver_class=org.postgresql.Driver
+hibernate.connection.driver_class=com.p6spy.engine.spy.P6SpyDriver
+hibernate.connection.url=jdbc\:postgresql\://localhost\:5432/jbpm3
+hibernate.connection.username=jbpm3
+hibernate.connection.password=jbpm3
+
+hibernate.hbm2ddl.auto=update
+hibernate.show_sql=false
+


Property changes on: jbpm3/branches/jbpm-3.2-soa/core/src/test/resources/org/jbpm/jbpm3235/hibernate.postgresql.properties
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native

Added: jbpm3/branches/jbpm-3.2-soa/core/src/test/resources/org/jbpm/jbpm3235/jbpm.cfg.xml
===================================================================
--- jbpm3/branches/jbpm-3.2-soa/core/src/test/resources/org/jbpm/jbpm3235/jbpm.cfg.xml	                        (rev 0)
+++ jbpm3/branches/jbpm-3.2-soa/core/src/test/resources/org/jbpm/jbpm3235/jbpm.cfg.xml	2011-06-16 14:58:11 UTC (rev 6958)
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<jbpm-configuration>
+  <string name="resource.hibernate.properties" value="org/jbpm/jbpm3235/hibernate.properties" />
+</jbpm-configuration>


Property changes on: jbpm3/branches/jbpm-3.2-soa/core/src/test/resources/org/jbpm/jbpm3235/jbpm.cfg.xml
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native

Added: jbpm3/branches/jbpm-3.2-soa/core/src/test/resources/org/jbpm/jbpm3235/spy.properties
===================================================================
--- jbpm3/branches/jbpm-3.2-soa/core/src/test/resources/org/jbpm/jbpm3235/spy.properties	                        (rev 0)
+++ jbpm3/branches/jbpm-3.2-soa/core/src/test/resources/org/jbpm/jbpm3235/spy.properties	2011-06-16 14:58:11 UTC (rev 6958)
@@ -0,0 +1,249 @@
+#################################################################
+# P6Spy 2.0-SNAPSHOT Options File                               #
+# See documentation for detailed instructions                   #
+#                                                               #
+# PLACE IN src/test/resources when using!!!                     #
+#                                                               #
+#################################################################
+
+#################################################################
+# MODULES                                                       #
+#                                                               #
+# Modules provide the P6Spy functionality.  If a module, such   #
+# as module_log is commented out, that functionality will not   #
+# be available.  If it is not commented out (if it is active),  #
+# the functionality will be active.                             #
+#                                                               #
+# Values set in Modules cannot be reloaded using the            #
+# reloadproperties variable.  Once they are loaded, they remain #
+# in memory until the application is restarted.                 #
+#                                                               #
+#################################################################
+
+module.log=com.p6spy.engine.logging.P6LogFactory
+#module.outage=com.p6spy.engine.outage.P6OutageFactory
+
+#################################################################
+# REALDRIVER(s)                                                 #
+#                                                               #
+# In your application server configuration file you replace the #
+# "real driver" name with com.p6spy.engine.spy.P6SpyDriver. This#
+# is where you put the name of your real driver P6Spy can find  #
+# and register your real driver to do the database work.        #
+#                                                               #
+# If your application uses several drivers specify them in      #
+# realdriver2, realdriver3.  See the documentation for more     #
+# details.                                                      #
+#                                                               #
+# Values set in REALDRIVER(s) cannot be reloaded using the      #
+# reloadproperties variable.  Once they are loaded, they remain #
+# in memory until the application is restarted.                 #
+#                                                               #
+#################################################################
+
+# oracle driver
+# realdriver=oracle.jdbc.driver.OracleDriver
+
+# mysql Connector/J driver
+# realdriver=com.mysql.jdbc.Driver
+
+# informix driver
+# realdriver=com.informix.jdbc.IfxDriver
+
+# ibm db2 driver
+# realdriver=COM.ibm.db2.jdbc.net.DB2Driver
+
+# the mysql open source driver
+realdriver=org.postgresql.Driver
+
+#specifies another driver to use
+realdriver2=
+#specifies a third driver to use
+realdriver3=
+
+
+#the DriverManager class sequentially tries every driver that is
+#registered to find the right driver.  In some instances, it's possible to
+#load up the realdriver before the p6spy driver, in which case your connections
+#will not get wrapped as the realdriver will "steal" the connection before
+#p6spy sees it.  Set the following property to "true" to cause p6spy to
+#explicitily deregister the realdrivers
+deregisterdrivers=true
+
+################################################################
+# P6LOG SPECIFIC PROPERTIES                                    #
+################################################################
+# no properties currently available
+
+################################################################
+# EXECUTION THRESHOLD PROPERTIES                               #
+################################################################
+# This feature applies to the standard logging of P6Spy.       # 
+# While the standard logging logs out every statement          #
+# regardless of its execution time, this feature puts a time   # 
+# condition on that logging.  Only statements that have taken  # 
+# longer than the time specified (in milliseconds) will be     #
+# logged.  This way it is possible to see only statements that #
+# have exceeded some high water mark.                          #
+# This time is reloadable.                                     #
+#
+# executionthreshold=integer time (milliseconds)
+#
+executionthreshold=
+
+################################################################
+# P6OUTAGE SPECIFIC PROPERTIES                                 #
+################################################################
+# Outage Detection
+#
+# This feature detects long-running statements that may be indicative of
+# a database outage problem. If this feature is turned on, it will log any
+# statement that surpasses the configurable time boundary during its execution.
+# When this feature is enabled, no other statements are logged except the long
+# running statements. The interval property is the boundary time set in seconds.
+# For example, if this is set to 2, then any statement requiring at least 2 
+# seconds will be logged. Note that the same statement will continue to be logged
+# for as long as it executes. So if the interval is set to 2, and the query takes
+# 11 seconds, it will be logged 5 times (at the 2, 4, 6, 8, 10 second intervals).
+#
+# outagedetection=true|false
+# outagedetectioninterval=integer time (seconds)
+#
+outagedetection=false
+outagedetectioninterval=
+
+################################################################
+# COMMON PROPERTIES                                            #
+################################################################
+
+# filter what is logged
+filter=false
+
+# comma separated list of tables to include when filtering
+include     = 
+# comma separated list of tables to exclude when filtering
+exclude     =
+
+# sql expression to evaluate if using regex filtering
+sqlexpression = 
+
+
+# turn on tracing
+autoflush   = true
+
+# sets the date format using Java's SimpleDateFormat routine
+dateformat=yy.MM.dd HH:mm:ss
+
+#list of categories to explicitly include 
+includecategories=
+
+#list of categories to exclude: error, info, batch, debug, statement, resultset
+#commit, rollback and result are valid values
+excludecategories=info,debug,result,batch
+
+
+#allows you to use a regex engine or your own matching engine to determine 
+#which statements to log
+#
+#stringmatcher=com.p6spy.engine.common.GnuRegexMatcher
+#stringmatcher=com.p6spy.engine.common.JakartaRegexMatcher
+stringmatcher=
+
+# prints a stack trace for every statement logged
+stacktrace=false
+# if stacktrace=true, specifies the stack trace to print
+stacktraceclass=
+
+# determines if property file should be reloaded
+reloadproperties=false
+# determines how often should be reloaded in seconds
+reloadpropertiesinterval=60
+
+#if=true then url must be prefixed with p6spy:
+useprefix=false
+
+#specifies the appender to use for logging
+#appender=com.p6spy.engine.logging.appender.Log4jLogger
+#appender=com.p6spy.engine.logging.appender.StdoutLogger
+appender=com.p6spy.engine.logging.appender.StdoutLogger
+
+# name of logfile to use, note Windows users should make sure to use forward slashes in their pathname (e:/test/spy.log) (used for file logger only)
+logfile     = spy.log
+
+# append to  the p6spy log file.  if this is set to false the
+# log file is truncated every time.  (file logger only)
+append=true
+
+#The following are for log4j logging only
+log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
+log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
+log4j.appender.STDOUT.layout.ConversionPattern=p6spy - %m%n
+
+#log4j.appender.CHAINSAW_CLIENT=org.apache.log4j.net.SocketAppender
+#log4j.appender.CHAINSAW_CLIENT.RemoteHost=localhost
+#log4j.appender.CHAINSAW_CLIENT.Port=4445
+#log4j.appender.CHAINSAW_CLIENT.LocationInfo=true
+
+log4j.logger.p6spy=INFO,STDOUT
+
+
+#################################################################
+# DataSource replacement                                        #
+#                                                               #
+# Replace the real DataSource class in your application server  #
+# configuration with the name com.p6spy.engine.spy.P6DataSource,#
+# then add the JNDI name and class name of the real     #
+# DataSource here                     #
+#                                                               #
+# Values set in this item cannot be reloaded using the          #
+# reloadproperties variable.  Once it is loaded, it remains     #
+# in memory until the application is restarted.                 #
+#                                                               #
+#################################################################
+#realdatasource=/RealMySqlDS
+#realdatasourceclass=com.mysql.jdbc.jdbc2.optional.MysqlDataSource
+
+#################################################################
+# DataSource properties                                         #
+#                                                               #
+# If you are using the DataSource support to intercept calls    # 
+# to a DataSource that requires properties for proper setup,    #
+# define those properties here. Use name value pairs, separate  #
+# the name and value with a semicolon, and separate the         #
+# pairs with commas.                                            #
+#                                   #
+# The example shown here is for mysql                           #
+#                                                               #
+#################################################################
+#realdatasourceproperties=port;3306,serverName;ibmhost,databaseName;mydb
+
+
+#################################################################
+# JNDI DataSource lookup                                        #
+#                                                               #
+# If you are using the DataSource support outside of an app     #
+# server, you will probably need to define the JNDI Context     #
+# environment.                                                  #
+#                                                               #
+# If the P6Spy code will be executing inside an app server then #
+# do not use these properties, and the DataSource lookup will   #
+# use the naming context defined by the app server.             #
+#                                                               #
+# The two standard elements of the naming environment are #
+# jndicontextfactory and jndicontextproviderurl. If you need    #
+# additional elements, use the jndicontextcustom property.      #
+# You can define multiple properties in jndicontextcustom,      #
+# in name value pairs. Separate the name and value with a       #
+# semicolon, and separate the pairs with commas.                #
+#                                                               #
+# The example shown here is for a standalone program running on #
+# a machine that is also running JBoss, so the JDNI context     #
+# is configured for JBoss (3.0.4).                              #
+#                                                               #
+#################################################################
+#jndicontextfactory=org.jnp.interfaces.NamingContextFactory
+#jndicontextproviderurl=localhost:1099
+#jndicontextcustom=java.naming.factory.url.pkgs;org.jboss.nameing:org.jnp.interfaces
+
+#jndicontextfactory=com.ibm.websphere.naming.WsnInitialContextFactory
+#jndicontextproviderurl=iiop://localhost:900


Property changes on: jbpm3/branches/jbpm-3.2-soa/core/src/test/resources/org/jbpm/jbpm3235/spy.properties
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native



More information about the jbpm-commits mailing list