Ubik Batch Server FAQ

From UbikWiki

Contents

Administration

What are the available parameters for Database Pool declarations

Ubik Batch Server uses Apache commons-dbcp implementation, see:

What validation Query to Use

Validation Query is mandatory to ensure that a connection returned to client code is valid. It has the following requirements:

  • It must be the most efficient query
  • It must return ONE and only ONE row

To declare it, use the Ubik Web Controler or open <INSTALL_DIR>/config/datasource.xml and add or modify for your pool the parameter validationQuery:

<parameter>
      <name>validationQuery</name>
      <value>...</value>
</parameter>
Database
Query
DB2 SELECT COUNT(*) FROM SYSIBM.SYSTABLES OR SELECT CURRENT TIMESTAMP FROM SYSIBM.SYSDUMMY1
DERBY values(1)
HSQLDB select 1 from INFORMATION_SCHEMA.SYSTEM_USERS
Informix SELECT COUNT(*) FROM SYSTABLES
Microsoft SQL Server SELECT 1
MySQL SELECT 1
Oracle SELECT 1 FROM DUAL
PointBase SELECT COUNT(*) FROM SYSTABLES
PostgreSQL SELECT 1
Progress SELECT COUNT(*) FROM SYSTABLES
Sybase SELECT 1

How do I set a JDBC connection property

Use the Ubik Web Controler or open <INSTALL_DIR>/config/datasource.xml and add or modify for your pool the parameter connectionProperties(Format of the string must be [propertyName=property;]*:

<parameter>
      <name>connectionProperties</name>
      <value>currentSchema=TEST;implicitCachingEnabled=true;oracle.jdbc.FreeMemoryOnEnterImplicitCache=true</value>
</parameter>

My database type is not correctly detected

Open <INSTALL_DIR>/config/config.properties and set HIBERNATE_CONFIGURED_DIALECT:

# Force a dialect for Hibernate to override auto detection
# For DB2 : com.ubikingenierie.console.persistance.hibernate.DB2ExtendedDialect(*) 
HIBERNATE_CONFIGURED_DIALECT=org.hibernate.dialect.MySQL5InnoDBDialect

(*) : see DB2Dialect.getCurrentTimestampSQLFunctionName() uses Oracle syntax

(*) : Useless since version 5.0.1.0 after upgrade to Hibernate 3.2.6

After a while, Oracle throws this exception: too many open cursors for pool jdbc/console

The Oracle JDBC driver doesn't much like to have its prepared statements cached with Hibernate (see http://www.hibernate.org/120.html#A10 Hibernate Platform Specific Issues).

Disable PreparedStatement caching for the connection pool.

Use Web Controler JDBC Administration page or open <INSTALL_DIR>config/datasource.xml, goto jdbc/console declaration and modifiy parameter poolPreparedStatements:

<parameter>
      <name>poolPreparedStatements</name>
      <value>false</value>
</parameter>

I have the following messages in the logs

11:49:27,464 WARN LoadContexts? fail-safe cleanup (collections)... org.hibernate.engine.loading.CollectionLoadContext@cd7045<rs=org.hsqldb.jdbc.jdbcResultSet@192e6b6>

Nothing's wrong, it's a small issue that will be resolved in future versions of Hibernate, since it's indirectly a logging issue. You can hide those messages by adding to <INSTALL_DIR>/config/log.properties:

log4j.category.org.hibernate.engine.loading.LoadContexts=ERROR

How do I change the retention period for Batches History in Database

History of batches execution is saved in the Database, a system batch runs every day to cleanup lines older than CLEANUP_DELAY days. To setup this parameter, open the file <INSTALL_DIR>/config/config.properties and change:

# Cleanup delay in days for tables BATCH_HEAD and BATCH_TRT
CLEANUP_DELAY=30

How do I setup my mail server parameters

Open the file <INSTALL_DIR>/config/mail.xml and change:

<?xml version="1.0" encoding="UTF-8"?>
<!-- #Release @VERSION@ at @DATE@ -->
<mail>
	<mailHost>smtp.ubik-ingenierie.com</mailHost>
	<mailer>UbikBatch</mailer>
	<mailPort>25</mailPort>
</mail>

How do I declare my custom plugin

Open the file <INSTALL_DIR>/config/plugin-manager.xml and add:

<plug-in className="com.ubikingenierie.console.monitoring.plugin.HealthMonitorPlugin"  
        id="com.ubikingenierie.console.monitoring.plugin.HealthMonitorPlugin">
          <set-property property="propertyOfClass" value="valueToSet"></set-property>
...
          <set-property property="otherValue" value="3000000"></set-property>
</plug-in>

How do I declare my custom extension

Open the file <INSTALL_DIR>/config/extension-manager.xml and add:

<extension className="com.ubikingenierie.console.si3si.extension.SI3SIExtension" >
</extension>

I get the following message on deployment of a big BAR

java.lang.OutOfMemoryError: PermGen space

Ensure you use the last JDK 6 available version Open <INSTALL_DIR>/bin/setEnv.bat or <INSTALL_DIR>/bin/setenv.cfg and set correctly the PermGen space using JAVA_OPTS:

-XX:MaxPermSize=128M
-XX:+CMSClassUnloadingEnabled
-XX:+CMSPermGenSweepingEnabled

How do I setup logging parameters

Log4j is used as logging framework for the Batch Server, see:

How do I setup Network Interface

What is network interface:

  • The ability to have 2 or more IP addresses for the same machine

To affect an IP to a batch server, add in <UBIK_SERVER_INSTALL_DIR>/config/config.properties:

NETWORK_INTERFACE_HOST_NAME=<IP ADDRESS>


Deployment

My BAR fails to deploy on the Batch server

  • If you have the Ubik Web Controler, go to Deployment > Click on the BAR Name, deployment errors will appear
  • If you don't have it, go to folder <INSTALL_DIR>/batches-deploy-failure and open file <BAR_NAME-version>.bar.failure, it

will contain the main cause of error

  • If you don't find any error, go to log folder

How do I customize mapping with Cold Deployment feature

  • Create in the same folder dedicated to Cold Deployment (identified by property COLD_DEPLOYMENT_DIR

(defaults to <INSTALL_DIR>/batches-cold-deploy)) that contains your BAR a file called <BAR_ID>-binding.xml that will contain the mapping:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE bar-resources 
          PUBLIC "-//Ubik-Ingenierie //DTD BAR Binding Resource Configuration 1.0//EN" 
          "http://www.ubik-ingenierie.com/consolebatch/config/bar-binding.dtd">
<bar-resources>
     <bar-resource nameinbar="Logical Name" boundname="Physical Name" />
...
     <bar-resource nameinbar="Logical Name 1" boundname="Physical Name 2" />
</bar-resources>

Configuration

How to make each Batch group log into a different file ?

This is done by:

  1. Using an Ubik Special Log4j Filter
  2. Using XML configuration file (Properties files cannot use Filters)
  3. Configure an Appender by group and add a Filter "com.ubikingenierie.console.log4j.MDCFilter" with a <param> element:
    • <param name="groupName" value="DEMO1"/>
  4. Add an <appender-ref> under each category

Example:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration debug='true' xmlns:log4j='http://jakarta.apache.org/log4j/'>
 
	<appender name="FILE" class="org.apache.log4j.RollingFileAppender"> 
		<param name="File" value="${LOG_ROOT_PATH}/demo-batch/all.log" /> 
		<param name="Append" value="true" /> 
		<param name="MaxFileSize" value="10MB" />
		<param name="MaxBackupIndex" value="10" />		
		<layout class="org.apache.log4j.PatternLayout"> 
			<param name="ConversionPattern" value="%d - %5p - %c: %m%n"/> 
		</layout> 
		<!-- Get all other events -->
		<filter class="com.ubikingenierie.console.log4j.MDCFilter">
		</filter>
	</appender>
 
	<!-- FILE -->
	<appender name="GROUP_DEMO1_APPENDER" class="org.apache.log4j.RollingFileAppender"> 
		<param name="File" value="${LOG_ROOT_PATH}/demo-batch/group-demo1.log" /> 
		<param name="Append" value="true" /> 
		<param name="MaxFileSize" value="10MB" />
		<param name="MaxBackupIndex" value="10" />		
		<layout class="org.apache.log4j.PatternLayout"> 
			<param name="ConversionPattern" value="%d - %5p - %c: %m%n"/> 
		</layout> 
		<!-- Special filter with Group name -->
		<filter class="com.ubikingenierie.console.log4j.MDCFilter">
			<param name="groupName" value="DEMO1"/>			
		</filter>
	</appender>
 
	<appender name="GROUP_DEMO2_APPENDER" class="org.apache.log4j.RollingFileAppender"> 
		<param name="File" value="${LOG_ROOT_PATH}/demo-batch/group-demo2.log" /> 
		<param name="Append" value="true" /> 
		<param name="MaxFileSize" value="10MB" />
		<param name="MaxBackupIndex" value="10" />		
		<layout class="org.apache.log4j.PatternLayout"> 
			<param name="ConversionPattern" value="%d - %5p - %c: %m%n"/> 
		</layout> 
		<!-- Special filter with Group name -->
		<filter class="com.ubikingenierie.console.log4j.MDCFilter">
			<param name="groupName" value="DEMO2"/>			
		</filter>
	</appender>
 
	<root>
		<level value="INFO"/>
		<!-- Add appender references -->
		<appender-ref ref="GROUP_DEMO2_APPENDER"/> 
		<appender-ref ref="GROUP_DEMO1_APPENDER"/> 
		<appender-ref ref="FILE"/> 
	</root> 
</log4j:configuration>

How to make each Batch log into a different file ?

This is done by:

  1. Using an Ubik Special Log4j Filter
  2. Using XML configuration file (Properties files cannot use Filters)
  3. Configure an Appender by group/batch and add a Filter "com.ubikingenierie.console.log4j.MDCFilter" with 2 <param>(s) elements:
    • <param name="groupName" value="DEMO2"/>
    • <param name="batchName" value="ADDRESS_GENERATION_BATCH"/>
  4. Add an <appender-ref> under each category

Example:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration debug='true' xmlns:log4j='http://jakarta.apache.org/log4j/'>
 
	<appender name="FILE" class="org.apache.log4j.RollingFileAppender"> 
		<param name="File" value="${LOG_ROOT_PATH}/demo-batch/all.log" /> 
		<param name="Append" value="true" /> 
		<param name="MaxFileSize" value="10MB" />
		<param name="MaxBackupIndex" value="10" />		
		<layout class="org.apache.log4j.PatternLayout"> 
			<param name="ConversionPattern" value="%d - %5p - %c: %m%n"/> 
		</layout> 
		<!-- Get all other events -->
		<filter class="com.ubikingenierie.console.log4j.MDCFilter">
		</filter>
	</appender>
 
	<appender name="BATCH_DEMO2_ADDRESS_GENERATION_APPENDER" class="org.apache.log4j.RollingFileAppender"> 
		<param name="File" value="${LOG_ROOT_PATH}/demo-batch/address-generation.log" /> 
		<param name="Append" value="true" /> 
		<param name="MaxFileSize" value="10MB" />
		<param name="MaxBackupIndex" value="10" />		
		<layout class="org.apache.log4j.PatternLayout"> 
			<param name="ConversionPattern" value="%d - %5p - %c: %m%n"/> 
		</layout> 
		<!-- Special filter with Group name -->
		<filter class="com.ubikingenierie.console.log4j.MDCFilter">
			<param name="groupName" value="DEMO2"/>
			<param name="batchName" value="ADDRESS_GENERATION_BATCH"/>			
		</filter>
	</appender>
 
	<root>
		<level value="INFO"/>
		<!-- Add appender references -->
		<appender-ref ref="BATCH_DEMO2_ADDRESS_GENERATION_APPENDER"/> 
		<appender-ref ref="FILE"/> 
	</root> 
</log4j:configuration>


What is the difference between SUPER ADMIN and ADMIN in Mail notifications ?

Super Admin:

  • They get notified on mail errors

Admin:

  • They get notified on every System error:
    • Scheduler restore from Database error
    • Memory limit reached
    • Pool limit reached
    • System batches error
    • Scheduler delays in execution or scheduler error
    • Locked batch errors
    • Missed triggers if com.ubikingenierie.console.plugins.MissedBatchesPlugin is configured
    • Batch linking errors
    • Scheduler Lifecycle events (Start, stopped, paused, resumed)
    • Extension registration errors
    • Plugin registration errors
  • They get notified on batch errors only if no user is configured to receive mails on batch errors

Development

How to make my batch send a Mail alert when an exception occurs

This is a built-in feature of the Ubik Batch Server, just ensure that your code does not catch exceptions silently

How to modify SQL Query parameters depending on business conditions

Sometimes Sql parameters change depending on some conditions that cannot be computed before execution, to enable this, Ubik Batch server offers a way to do it:

  1. Use SqlParameter in DaoSqlBatchStart or SqlBatchStart
  2. In Traitement#initialize() or BaseBatch#executeBeforeData, modify the parameters using:
getBatchExecutionContext().setSqlBatchStartParameters(new SqlParameter[]{...});

How to pass data safely between executeBeforeData()/executeOnBlock()/executeAfterDataEnd() (initialize/exec/finalizeBatch before 5.0.0.0)

You can use BatchExecutionContext object:

getBatchExecutionContext().setAttribute(...);
getBatchExecutionContext().getAttribute(...);

How to veto a batch

You can veto a batch (stop the execution) in the initialize method invoking method vetoExecution. For example if some conditions for execution are not met.

vetoExecution("NOT A BUG! The treatment has been stopped by batch, functional flag is disabled");

If you want to stop a batch once you are in the exec method, you will have to manage by an applicative way.

How to check if your batch encountered a problem

You can check in the executeAfterDataEnd() method if there was a problem in your batch.

if (!getBatchExecutionContext().getExceptions().isEmpty())
{
    // do something
}

My Batch has trigger dates in the past

Ensure coherent Trigge/Batch naming strategy when creating a Batch or Trigger. A mandatory requirement is that:

  • (Batch Group, Batch Name, Trigger Group, Trigger Name)
  • (Batch Group, Batch Name) is unique
  • (Trigger Group, Trigger Name) is unique

Authors

  • Philippe Mouawad

History

  • Page created by Pmouawad, 18 November 2007: New page: === Authors === * Philippe Mouawad === History ===
  • Last modified by Pmouawad, 10 January 2014: /* What is the difference between SUPER ADMIN and ADMIN in Mail notifications ? */
Personal tools