# Use timers in DataSource applications

Here we explain what timers are used for in a DataSource application, what they’re for, and how to configure them.

## Timing out requests to DataSource peers

* [The global request timeout for data services](#the-global-request-timeout-for-data-services)
* [Timing out requests to individual data services](#timing-out-requests-to-individual-data-services)
* [Retrying a request to a data service](#retrying-a-request-to-a-data-service)
* [Timing-out-requests-made-to-individual-peers](#timing-out-requests-made-to-individual-peers)

### The global request timeout for data services

**📌 NOTE**\
This facility isn’t available to Java-based DataSource applications, which don’t support data services.

If your DataSource application obtains data from peers through [data services](datasource-data-services.md) (which is the recommended way to do it), requests sent to a data service, such as a [subscription](datasource-subscriptions.md) to a [subject](datasource-subjects-symbols-and-fields.md), are timed out. If the DataSource peers providing the service don’t respond within the timeout period, the DataSource application assumes the requested item isn’t available, so the subscription to it is discarded.

This timeout is defined by the configuration item [service-request-timeout](datasource-data-services-configuration.md#service-request-timeout), which applies to all data services defined in the DataSource application.

**💡 TIP**\
If you don’t explicitly define a value for `service-request-timeout` in your application’s configuration, the default timeout of 10 seconds is applied to all the application’s data service requests.

### Timing out requests to individual data services

**📌 NOTE**\
This facility isn’t available to Java-based DataSource applications, which don’t support data services.

You can override the data services global [service-request-timeout](datasource-data-services-configuration.md#service-request-timeout) for a selected data service. Just add a [request-timeout](datasource-data-services-configuration.md#request-timeout) option to the [add-data-service](datasource-data-services-configuration.md#add-data-service) configuration item for the data serice:

```
service-request-timeout 12.0

add-data-service
   service-name    fx-prices
   include-pattern ^/FX/
#
# Override service-request-timeout 
# for the fx-prices service only.
#
   request-timeout 9.0
   ...
   add-source-group
   ...
   end-source-group
end-data-service
```

If you don’t want to time out the responses from a particular data service, set the service’s `request-timeout` option to `-1`:

```
service-request-timeout 12.0

add-data-service
   service-name    fx-prices
   include-pattern ^/FX/
#
# Disable data service request timeouts 
# for the fx-prices service only
#
   request-timeout -1
   ...
   add-source-group
   ...
   end-source-group
end-data-service
```

**🔥 CAUTION**\
If you disable the request timeout on a data service, make sure that you’ve defined a request timeout for each of the peers that supply data for the service, otherwise the DataSource application could wait indefinitely for the service to satisfy a request. See [Timing out requests made to individual peers](#timing-out-requests-made-to-individual-peers) below.

### Retrying a request to a data service

**📌 NOTE**\
This facility isn’t available to Java-based DataSource applications, which don’t support data services.

If a DataSource application finds that none of the peers defined by the [add-priority](datasource-data-services-configuration.md#add-priority) options in a data service’s [source group](datasource-data-services-configuration.md#add-source-group) have responded to a request, the DataSource application waits for a configurable time before reissuing the request to the group. It repeats this sequence until the master timeout for the service, as defined by [service-request-timeout](datasource-data-services-configuration.md#service-request-timeout), or the [request-timeout](datasource-data-services-configuration.md#request-timeout) option of [add-data-service](datasource-data-services-configuration.md#add-data-service), expires. You set this retry timer with the [retry-time](datasource-data-services-configuration.md#retry-time) option of the [add-source-group](datasource-data-services-configuration.md#add-source-group) configuration item:

```
service-request-timeout 12.0

add-data-service
   service-name    fx-prices
   include-pattern ^/FX/
#
# Override service-request-timeout 
# for the fx-prices service only.
#
   request-timeout 9.0
   ...
   add-source-group
      required   TRUE
#
# If none of this service's peers 
# respond to a request, wait 3.0 seconds 
# before retrying.
#  
      retry-time 3.0
      add-priority
         remote-label fxpriceadapter1
      end-priority
      add-priority
         remote-label fxpriceadapter2
      end-priority
   end-source-group
end-data-service
```

**What happens if I don’t explicitly specify any timers for my data services?** 

The default timer settings would apply. The default value of `service-request-timeout` is 10 seconds, so all data service requests requests would time out after 10 seconds. Since the default setting of `retry-time` is 30 seconds, there wouldn’t be any retries, because the service request timeout would take effect well before the DataSource application could reissue the request to the group.

### Timing out requests made to individual peers

**📌 NOTE**\
This facility isn’t available to Java-based DataSource applications.

The data service request timeouts described above apply to all the peers that belong to a data service. You can also specify a timeout on response to requests sent to a particular peer. This timeout applies to requests sent to the peer from any of the DataSource application’s data services.

Firstly, there’s a global request timeout called [source-request-timeout](datasource-datasource-peers-configuration-part-2.md#source-request-timeout) that applies to all the DataSource application’s peers. If you don’t explicitly define it, peer level request timeouts aren’t enabled.

```
#
# Peers configuration
#
#
# Set a timeout on the response to
# any request sent to any peer.
#
source-request-timeout 3.0
add-peer
   remote-name fxpriceadapter1
   ...
end-peer

add-peer   
   remote-name fxpriceadapter2
   ... 
end-peer

#
# Data services configuration
#
service-request-timeout 12.0

add-data-service
   service-name    fx-prices
   include-pattern ^/FX/
   request-timeout 9.0
   ...
   add-source-group
      required   TRUE
      retry-time 3.0
      add-priority
         remote-label fxpriceadapter1
      end-priority
      add-priority
         remote-label fxpriceadapter2
      end-priority
   end-source-group
end-data-service
```

You can also set a timeout on the request reponses made by a specific peer, using the [request-timeout](datasource-datasource-peers-configuration-part-1.md#request-timeout) option of [add-peer](datasource-datasource-peers-configuration-part-1.md#add-peer). This overrides the `source-request-timeout` setting for that peer only:

```
#
# Peers configuration
#
#
# Set a timeout on the response to
# any request sent to any peer.
#
source-request-timeout 3.0
add-peer
   remote-name fxpriceadapter1
#
# Set a different request response
# timeout for the fxpriceadapter1
# peer only.
#
   request-timeout 2.0
   ...
end-peer

add-peer   
   remote-name fxpriceadapter2
   ... 
end-peer

#
# Data services configuration
#
service-request-timeout 12.0

add-data-service
   service-name    fx-prices
   include-pattern ^/FX/
   request-timeout 9.0
   ...
   add-source-group
      required   TRUE
      retry-time 3.0
      add-priority
         remote-label fxpriceadapter1
      end-priority
      add-priority
         remote-label fxpriceadapter2
      end-priority
   end-source-group
end-data-service
```

## Timing out connections to DataSource peers

When a DataSource application requests to connect to a DataSource peer, the peer may not exist or there might be no current network route to the peer. The operating system will attempt to connect for a time that’s dependent on various operating system parameters; it could typically be up to 4 minutes before the OS gives up and returns a connection error to the application. This delay’s usually too long for a typical Caplin Platform installation, so the DataSource application overrides it, using the [connect-timeout](datasource-datasource-peers-configuration-part-1.md#connect-timeout) option of the [add-peer](datasource-datasource-peers-configuration-part-1.md#add-peer) configuration item:

```
#
# Peers configuration
#
#
add-peer
   remote-name fxpriceadapter1
#
# Set a timeout (in seconds) on the 
# connection request for this peer.
#
   connect-timeout 5
   ...
end-peer
```

`connect-timeout` has a default value of 10 seconds, so if you don’t explicitly set it in the `add-peer` configuration, connection requests to that peer will time out after 10 seconds - rather less than the typical OS default!

You’d typically want to define ``connect-timeout``s in the configuration of an Integration Adapter that connects to one or more Liberators and/or Transformers, setting the timeout in the `add-peer` items that define the Liberator and Transformer connections.

Note that if you’ve set up a list of alternative peers in the `add-peer` configuration (see the [addr](datasource-datasource-peers-configuration-part-1.md#addr) and [port](datasource-datasource-peers-configuration-part-1.md#port) options), and the timeout expires when attempting to connect to one of the peers, the DataSource application attempts to fail over to the next peer connection defined in the `addr` option’s list and applies the timeout again.

## Other data service timeouts

**📌 NOTE**\
The `cleanup-stale-timeout` and `discard-timeout` configuration items aren’t available to Java-based DataSource applications, which don’t support data services.

In [Timing out requests to DataSource peers](#timing-out-requests-to-datasource-peers), we discussed various timers that apply to requests made to peers through data services. There are also a couple of other timers that apply to data services: `cleanup-stale-timeout` and `discard-timeout`.

* Define [cleanup-stale-timeout](datasource-data-services-configuration.md#cleanup-stale-timeout) when you want the DataSource application to delete stale objects from its cache.
* Define the [discard-timeout](datasource-data-services-configuration.md#discard-timeout) option of [add-data-service](datasource-data-services-configuration.md#add-data-service) when you want the DataSource application to discard the data for a subscribed subject once the last client application has unsubscribed from the subject. This option is particularly relevant to Liberator.

---

**See also:**

* How can I... [Enable heartbeats between DataSource applications](datasource-enable-heartbeats-between-datasource-applications.md)
