6.9. Administrating resources

6.9.1. Defining a resource

Resources are defined inside the JQM database, and are therefore accessible from all JQM nodes. By ‘resource’ JNDI means an object that can be created through a (provided) ObjectFactory. There are multiple factories provided with JQM, concerning databases, files & URLs which are detailed below. Moreover, the payload may provide whatever factories it needs, such as a JMS driver (example also below).

The main JNDI directory table is named JndiObjectResource and the object parameters belong to the table JndiObjectResourceParameter. Resources can be edited through the administration console.

The following elements are needed for every resource, and are defined in the main table:

Name Description Example
name The JNDI alias - the string used to refer to the resource in the payload code jdbc/mydatasource
description a short string giving the admin every info he needs connection to main db
type the class name of the desired resource com.ibm.mq.jms.MQQueueConnectionFactory
factory the class name of the ObjectFactory able to create the desired resource com.ibm.mq.jms.MQQueueConnectionFactoryFactory
singleton see below false

For every resource type (and therefore, every ObjectFactory), there may be different parameters: connection strings, paths, ports, … These parameters are to be put inside the table JndiObjectResourceParameter.

The JNDI alias is free to choose - even if conventions exist. Please note that JQM only provides a root context, and no subcontexts. Therefore, in all lookups, the given alias will searched ‘as provided’ (including case) inside the database.

6.9.2. Singletons

One parameter is special: it is named “singleton”. Default is ‘false’. If ‘true’, the creation and caching of the resource is made by the engine itself in its own class context, and not inside the payload’s context (i.e. classloader). It is useful for the following reasons:

  • Many resources are actually to be shared between payloads, such as a connection pool
  • Very often, the payload will expect to be returned the same resource when making multiple JNDI lookups, not a different one on each call. Once again, one would expect to be returned the same connection pool on each call, and definitely not to have a new pool created on each call!
  • Some resources are dangerous to create inside the payload’s context. As stated in Payload basics, loading a JDBC driver creates memory leaks (actually, class loader leaks). By delegating this to the engine, the issue disappears.

Singleton resources are created the first time they are looked up, and kept forever afterwards.

As singleton resources are created by the engine, the jar files containing resource & resource factory must be available to the engine class loader. For this reason, the jar files must be placed manually inside the $JQM_ROOT/ext directory (and they do not need to be placed inside the dependencies of the payload, even if it does not hurt to have them there when the default parent-first class loading is used). For a resource which provider is within the payload, being a singleton is impossible - the engine class context has no access to the payload class context.

By default, the $JQM_ROOT/ext directory contains the following providers, ready to be used as singleton (or not) resources:

  • the File provider and URl provider inside a single jar named jqm-provider
  • the JDBC pool, inside two jars (tomcat-jdbc and tomcat-juli)
  • the HSQLDB driver

Besides the HSQLDB driver, which can be removed if another database is used, the provided jars should never be removed. Jars added later (custom resources, other JDBC drivers, …) can of course be removed. Also of note: it is not because a jar is inside ‘ext’ that the corresponding resources can only be singletons. They can be standard as well.

6.9.3. Examples

Below, some examples of resources definition. To see how to actually use them in your code, look at Using resources.

6.9.3.1. JDBC

Note

the recommended naming pattern for JDBC aliases is jdbc/name

Connection pools to databases through JDBC is provided by an ObjectFactory embedded with JQM named tomcat-jdbc.

As noted above, JDBC pool resources should always be singletons: it is stupid to create a new pool on each call AND it would create class loader leaks otherwise.

Classname Factory class name
javax.sql.DataSource org.apache.tomcat.jdbc.pool.DataSourceFactory
Parameter name Value
maxActive max number of pooled connections
driverClassName class of the db JDBC driver
url database url (see db documentation)
singleton always true (since engine provider)
username database account name
password password for the database account

There are many other options, detailed in the Tomcat JDBC documentation.

6.9.3.2. JMS

Note

the recommended naming pattern for JMS aliases is jms/name

Parameters for MQ Series QueueConnectionFactory:

Classname Factory class name
com.ibm.mq.jms.MQQueueConnectionFactory com.ibm.mq.jms.MQQueueConnectionFactoryFactory
Parameter name Value
HOST broker host name
PORT mq broker listener port
CHAN name of the channel to connect to
QMGR name of the queue manager to connect to
TRAN always 1 (means CLIENT transmission)

Parameters for MQ Series Queue:

Classname Factory class name
com.ibm.mq.jms.MQQueue com.ibm.mq.jms.MQQueueFactory
Parameter name Value
QU queue name

Parameters for ActiveMQ QueueConnexionFactory:

Classname Factory class name
org.apache.activemq.ActiveMQConnectionFactory org.apache.activemq.jndi.JNDIReferenceFactory
Parameter name Value
brokerURL broker URL (see ActiveMQ site)

Parameters for ActiveMQ Queue:

Classname Factory class name
org.apache.activemq.command.ActiveMQQueue org.apache.activemq.jndi.JNDIReferenceFactory
Parameter name Value
physicalName queue name

6.9.3.3. Files

Note

the recommended naming pattern for files is fs/name

Classname Factory class name
java.io.File.File com.enioka.jqm.providers.FileFactory
Parameter name Value
PATH path that will be used to initialize the File object

6.9.3.4. URL

Note

the recommended naming pattern for URL is url/name

Classname Factory class name
java.io.URL com.enioka.jqm.providers.UrlFactory
Parameter name Value
URL url that will be used to initialize the URL object

6.9.3.5. Mail session

Outgoing SMTP mail session.

Note

the recommended naming pattern is mail/name

Classname Factory class name
javax.mail.Session com.enioka.jqm.providers.MailSessionFactory
Parameter name Value
smtpServerHost Name or IP of the SMTP server. The only compulsory parameter
smtpServerPort Optional, default is 25
useTls Default is false
fromAddress Can be overloaded when sending a mail. Default is noreply@jobs.org
smtpUser If SMTP server requires authentication.
smtpPassword