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-323...
+ */
+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