The dynamic map engine is a virtual map engine that provides additional functionality on top of other map engines, for example load balancing and fail over support.

When a dynamic map engine is configured, it is setup so that it points to one or more other map engines then anything that previously pointed to the original map engine is changed to point to the new map engine, or the old map engine is renamed and the dynamic map engine is given the id of the old map engine then nothing else needs to change.

Depending upon how the dynamic map engine is configured it can provide the following different functionality:

<?xml version="1.0" encoding="UTF-8"?>

<config xmlns="urn:com.cohga.server.config#1.0"
	xmlns:wms="urn:com.cohga.server.map.wms#1.0"
	xmlns:dynamic="urn:com.cohga.server.map.dynamic#1.0">

	<wms:mapengine id="wms1">
		<url>http://server1.local/wms</url>
		<!-- other WMS configuration items -->
	</wms:mapengine>
	<wms:mapengine id="wms2">
		<url>http://server2.local/wms</url>
		<!-- other WMS configuration items -->
	</wms:mapengine>

	<!-- will cycle requests for 'loadbalanced' between 'wms1' and 'wms2' -->
    <!-- you can list as many map engines as you need but they must all be configured identically -->
	<dynamic:mapengine id="loadbalanced">
		<mapengine>wms1</mapengine>
		<mapengine>wms2</mapengine>
	</dynamic:mapengine>

	<!-- will send requests for 'failover' to 'wms1' until that falls over, in which case it'll use 'wms2' -->
    <!-- you can list as many map engines as you need but they must all be configured identically -->
	<dynamic:mapengine id="failover">
		<failover>true</failover>
		<mapengine>wms1</mapengine>
		<mapengine>wms2</mapengine>
	</dynamic:mapengine>

	<!-- will send requests for 'alternate' to 'wms1' unless the user turns on an aerial photo layer, in which case it will use 'wms2' -->
    <!-- you can only list two map engines -->
    <!-- Only available since 2.5.16 -->
	<dynamic:mapengine id="alternate">
		<altlayers>aerial_photo_2001,aerial_photo_2008,aerial_photo_2015</altlayers>
		<mapengine>wms1</mapengine>
		<mapengine>wms2</mapengine>
	</dynamic:mapengine>

	<!-- any request that has a width greater than 4096 or a height greater than 4096 pixels will be broken up into multiple requests -->
	<!-- this example is assuming that the wms1 map engine has been configured to generate an image less than 4096 x 4096 pixels -->
	<!-- only available since 2.6.4 -->
	<dynamic:mapengine id="stitching">
		<maxwidth>4096</maxwidth>
		<maxheight>4096</maxheight>
		<mapengine>wms1</mapengine>
	</dynamic:mapengine>

	<!-- will redirect all requests for 'redirect' to 'wms1' -->
	<!-- this allows us to use "redirect" as the map engine id in the rest of the configuration -->
	<!-- but allow us to switch between different real map engines for testing, development, etc -->
	<dynamic:mapengine id="redirect">
		<mapengine>wms1</mapengine>
	</dynamic:mapengine>

</config>

In the above examples, any configuration item that previously references wms1 or wms2 map engines would now reference redirect, loadbalanced, failover, alternate or stitching and operate the same as before with the benefits of the particular function configured. Plus, dynamic map engines can also reference other dynamic map engines, so you can combine load balancing and fail over, for example.


Why would I use the Redirect Dynamic Map Engine?

In most cases, you wouldn't use it. The redirect dynamic map engine is probably only useful to the Cohga Support Team because they often have many different map engines that they need to test and don't want to have to update all the relevant configuration files each time they need to switch map engines. 

However here is a real life example of it in use. The "main" vector map engine is called "mapengine.vector" and there are a number of other map engines, roughly containing the same layers, called "mapengine.vector.wms.geoserver", "mapengine.vector.wms.gqis", "mapengine.vector.arcgis.soap.100", "mapengine.vector.arcgis.rest.140", etc. By just changing the sub-map engine id it's possible to switch to test a different map engine implementation (e.g. for problem solving a Support issue).  In this example, there is also a toc model, called "toc.vector" that has a single toc entry that is changed to the toc model that corresponds to the chosen map engine. This way all the other config files just reference "mapengine.vector" and "toc.vector" making testing different types of map engines easy. 

<?xml version="1.0" encoding="UTF-8"?>

<config xmlns="urn:com.cohga.server.config#1.0" xmlns:dynamic="urn:com.cohga.server.map.dynamic#1.0">

<?set vector.mapengine=wms.qgis?>

	<dynamic:mapengine id="mapengine.vector">
		<mapengine>mapengine.vector.${vector.mapengine}</mapengine>
	</dynamic:mapengine>

	<toc:model id="toc.vector">
		<entry toc="toc.vector.${vector.mapengine}"/>
	</toc:model>

</config>