Configure multiple dispatchers

If you have multiple dispatchers on a host, you must specify unique ports and application data directories for each dispatcher to ensure dispatcher information does not get mixed up.

While multiple dispatchers are typically not needed, you might have multiple dispatchers to support different environments using the same version of the Genero Application Server on the same host. For example, you may wish to co-locate your production, training, and development environments.

To start multiple dispatchers on a single host, create a copy of the application server configuration file (default as.xcf) for each dispatcher. Each dispatcher will have its own uniquely-named configuration file, and each configuration file must take into account the settings for the elements shown in Table 1.
Table 1. Elements defined for each dispatcher
Element(s) Setting values across dispatchers
TCP_BASE_PORT + TCP_PORT_OFFSET A GAS dispatcher listening port is set by adding the port offset to the base port. Each dispatcher on a server requires a unique listening port. In fact, all port numbers – both the computed listening ports and the set admin ports – must be unique between all the dispatchers.
Tip:

Giving a different TCP_BASE_PORT for each dispatcher will make dispatchers more recognisable to you from the address line of the apps they are running.

TCP_ADMIN_PORT The admin port is for GAS administration tasks. Each dispatcher on a server requires a unique admin port. In fact, all port numbers – both the computed listening ports and the set admin ports – must be unique between all the dispatchers.
res.appdata.path (Application data directory) The application data directory is the directory for GAS data files. It is recommended that the directory be unique between all the dispatchers.
Tip:

While not recommended, you can share the application data directory between dispatchers. For more information, see Shared application data directory.

Dispatcher override option (-E)

You can share the same configuration file between all the dispatchers provided you run the dispatcher with the -E option to override the resources shown in Table 2 for each instance with different values.
Table 2. Override resources
Element (s) Resource Override example
TCP_BASE_PORT res.ic.base.port httpdispatch -E res.ic.base.port=dispatcher1-base-port
TCP_PORT_OFFSET res.ic.port.offset httpdispatch -E res.ic.port.offset=myOffset
TCP_ADMIN_PORT res.ic.admin.port httpdispatch -E res.ic.admin.port=dispatcher1-admin-port
res.appdata.path (Application data directory) res.appdata.path httpdispatch -E res.appdata.path=/work/tmp/gas/appdata1

Shared application data directory

Sharing the same application data directory between all the dispatchers is not recommended. For more information on why you need to be cautious about this, see Why do my applications fail using multiple dispatchers? and Error taking session ownership.

However, if you want to use the same application data directory, specified by the resource res.appdata.path, for each dispatcher, it is important to ensure that directories located under the directory remain independent.

The values for the following directories need to be unique between all the dispatchers. You can change these directly in their configuration files:

  • LOG directory (res.log.output.path)
  • TEMPORARY_DIRECTORY (res.path.tmp)
  • SESSION_DIRECTORY (res.path.session)
These examples are extracted from the default application server configuration file:
-- The res.appdata.path resource specifies the directory for application data
-- for the dispatcher

<RESOURCE Id="res.appdata.path"
 Source="INTERNAL">C:\ProgramData\FourJs\gas\4.01</RESOURCE>

-- The res.log.output.path resource specifies the log directory
-- as defined by the LOG element

<RESOURCE Id="res.log.output.path"
 Source="INTERNAL">$(res.appdata.path)/log</RESOURCE>
<LOG>
  <OUTPUT Type="$(res.log.output.type)">$(res.log.output.path)</OUTPUT>
  ...
</LOG>

-- The res.path.tmp resource specifies the temporary directory
-- as defined by the TEMPORARY_DIRECTORY element

<RESOURCE Id="res.path.tmp"
 Source="INTERNAL">$(res.appdata.path)/tmp</RESOURCE>

<TEMPORARY_DIRECTORY>$(res.path.tmp)</TEMPORARY_DIRECTORY>

-- The res.path.session resource specifies the session directory
-- as defined by the SESSION_DIRECTORY element

<RESOURCE Id="res.path.session"
 Source="INTERNAL">$(res.appdata.path)/session</RESOURCE>

<SESSION_DIRECTORY>$(res.path.session)</SESSION_DIRECTORY>