Connections and other custom properties
An adapter may deal with no connections, a single connection, or an arbitrary number of connections (for example, if it is a server socket that accepts clients connecting to it); an adapter may also deal with a set number of connections. In any case, an identifier needs to be assigned to each connection. A connection may be broken and then reconnected, with either the same or different identifier. It is useful to be able to detect a connection that has been dropped and then reconnected even if it has the same identifier. To facilitate this, a “generation” identifier can be associated with each connection identifier. While typically this generation identifier will be a number that is incremented, extra information may be contained in it.
Monitors can therefore detect when a connection has been reconnected; at this point any logon procedure needs to be repeated as the generation identifier has changed.
The state of all connections should be supplied in the statusDictionary field of the status struct in C/C++, or the statusInfo field of the ExtendedCodecStatus or ExtendedTransportStatus in Java.
Along with any other custom information, the adapter author can include connection information here. This will be passed to the correlator in event form and the IAFStatusManager will automatically attempt to pull out connection information from this data structure. If there is a single connection, a key should be supplied called CONNECTION. The value will be the generation identifier, typically a number. If the generation identifier changes, the IAFStatusManager will assume the connection has been dropped and reestablished, and will send appropriate events to the consumer of the status events.
If there are multiple connections, a key for each one should be supplied in the form CONNECTION_<id> to distinguish the different connections. Each one will also have a generation identifier associated with it. The same rules apply with the generation identifier as with a single connection.
In either case, if the connection is up, the property should be included, and if the connection is down, the property should not be included. This allows monitors to recover the state of what connections are made after losing connection to the IAF, and to determine when connections are opened or closed by polling.
The following Java example shows a simple adapter that reports the status of a single connection.
private long connectionGeneration = System.currentTimeMillis();
public TransportStatus getStatus()
{ Properties properties = new Properties();
properties.setProperty("VERSION", "MyTransport_v1.0");
properties.put("CONFIG_VERSION", "1");
if (connected)
{
properties.setProperty("CONNECTION",
String.valueOf(connectionGeneration));
}
return new ExtendedTransportStatus("OK", totalReceived,
totalSent, properties);
}
The following Java example demonstrates usage with multiple connections, iterating through a collection of MyConnection objects.
public TransportStatus getStatus()
{ Properties properties = new Properties();
properties.put("VERSION", "MyTransport_v1.0");
properties.put("CONFIG_VERSION", "1");
for (MyConnection con : connections.values())
{
if (!con.isClosed())
{
properties.put("CONNECTION_" + con.getId(), con.getGeneration());
}
}
return new ExtendedTransportStatus(statusMessage, totalReceived,
totalSent, properties);
}