Connection Options

Target Version: NServiceBus 7.x
RavenDB's implementation of distributed transactions contains a bug that could cause an endpoint, in certain (rare) conditions, to lose data. If RavenDB is configured to enlist in distributed transactions, read DTC not supported for RavenDB Persistence.
Using RavenDB version 4 and higher in a cluster configuration with multiple nodes is not supported. For more information, read cluster configuration with multiple nodes not supported.

The following sections outline various ways to connect to the RavenDB server. Specifying an external shared store (providing a fully configured RavenDB DocumentStore instance) is preferred so that the configuration of the DocumentStore is not obscured.

When the RavenDB DocumentStore is created by the user at endpoint configuration time it's important to dispose it, by calling the Dispose() method, before shutting down the endpoint process.

External shared store at initialization

To use an external DocumentStore, but defer its creation until NServiceBus initializes, a custom factory delegate can be provided which will allow the DocumentStore to be created with access to the settings and the dependency injection container. This gives the ability to configure the document store based on conventions derived from endpoint data present in the settings object. For example, the DocumentStore instance can be configured to use the Endpoint Name as its database name by accessing readOnlySettings.EndpointName().

DocumentStore documentStore;
var persistence = endpointConfiguration.UsePersistence<RavenDBPersistence>();
persistence.SetDefaultDocumentStore(
    (settings, builder) =>
    {
        documentStore = new DocumentStore();
        // configure documentStore here
        return documentStore;
    });

External store at initialization for a specific persister

A DocumentStore can be created at initialization time, with access to endpoint settings and the dependency injection container, for usage in a specific persister (e.g. timeouts) by using the following code:

//TODO: instances of DocumentStore should be disposed of at endpoint cleanup time
DocumentStore subscriptionStore;
DocumentStore sagaStore;
DocumentStore timeoutStore;
DocumentStore gatewayStore;

var persistence = endpointConfiguration.UsePersistence<RavenDBPersistence>();
persistence.UseDocumentStoreForSubscriptions(
    (settings, builder) =>
    {
        subscriptionStore = new DocumentStore();
        // configure documentStore here
        return subscriptionStore;
    });
persistence.UseDocumentStoreForSagas(
    (settings, builder) =>
    {
        sagaStore = new DocumentStore();
        // configure documentStore here
        return sagaStore;
    });
persistence.UseDocumentStoreForTimeouts(
    (settings, builder) =>
    {
        timeoutStore = new DocumentStore();
        // configure documentStore here
        return timeoutStore;
    });
persistence.UseDocumentStoreForGatewayDeduplication(
    (settings, builder) =>
    {
        gatewayStore = new DocumentStore();
        // configure documentStore here
        return gatewayStore;
    });

External shared store for all persisters

The RavenDB DocumentStore instance can be provided directly to NServiceBus to use for all persisters. This enables sharing the same application database for NServiceBus data as well.

var documentStore = new DocumentStore();
// configure documentStore here
var persistence = endpointConfiguration.UsePersistence<RavenDBPersistence>();
persistence.SetDefaultDocumentStore(documentStore);

External store for a specific persister

An externally created DocumentStore instance can be used for a specific persister (e.g. timeouts) by using the following code:

var documentStore = new DocumentStore();
// configure documentStore here
var persistence = endpointConfiguration.UsePersistence<RavenDBPersistence>();
persistence.UseDocumentStoreForSubscriptions(documentStore);
persistence.UseDocumentStoreForSagas(documentStore);
persistence.UseDocumentStoreForGatewayDeduplication(documentStore);

Default

By default, a DocumentStore is created that connects to http://localhost:8080 and uses the endpoint name as its database name. This default connection is used for all the persisters.

Database used

After connecting to a RavenDB server, decide which database to use. Unless NServiceBus finds a default database specified in the connection string, NServiceBus uses the endpoint name as the database name. This means that if the endpoint is named MyServer, the database name will be MyServer. Each endpoint has a separate database unless explicitly overridden via the connection string.

See also How to specify endpoint name.

Database creation

Prior to RavenDB version 4.0, RavenDB automatically creates the database if it doesn't already exist. This is no longer the case in RavenDB versions 4.0 and above.

Samples


Last modified