[[Singleton_MSC_services]]
= Singleton MSC services

WildFly allows any user MSC service to be installed as a singleton MSC
service via a public API. Once installed, the service will only ever
start on 1 node in the cluster at a time. If the node providing the
service is shutdown, or fails, another node on which the service was
installed will start automatically.

[[installing-an-msc-service-using-an-existing-singleton-policy]]
== Installing an MSC service using an existing singleton policy

While singleton MSC services have been around since AS7, WildFly 10 adds
the ability to leverage the singleton subsystem to create singleton MSC
services from existing singleton policies.

The singleton subsystem exposes capabilities for each singleton policy
it defines. These policies, represented via the
`org.wildfly.clustering.singleton.SingletonPolicy` interface, can be
referenced via the following name:
"org.wildfly.clustering.singleton.policy" +
e.g.

[source, java]
----
public class MyServiceActivator implements ServiceActivator {
    @Override
    public void activate(ServiceActivatorContext context) {
        ServiceName name = ServiceName.parse("my.service.name");
        Service<?> service = new MyService();
        try {
            SingletonPolicy policy = (SingletonPolicy) context.getServiceRegistry().getRequiredService(ServiceName.parse(SingletonPolicy.CAPABILITY_NAME)).awaitValue();
            policy.createSingletonServiceBuilder(name, service).build(context.getServiceTarget()).install();
        } catch (InterruptedException e) {
            throw new ServiceRegistryException(e);
        }
    }
}
----

[[installing-an-msc-service-using-dynamic-singleton-policy]]
== Installing an MSC service using dynamic singleton policy

Alternatively, you can build singleton policy dynamically, which is
particularly useful if you want to use a custom singleton election
policy. Specifically, `SingletonPolicy` is a generalization of the
`org.wildfly.clustering.singleton.SingletonServiceBuilderFactory`
interface, which includes support for specifying an election policy and,
optionally, a quorum. +
e.g.

[source, java]
----
public class MyServiceActivator implements ServiceActivator {
    @Override
    public void activate(ServiceActivatorContext context) {
        String containerName = "server";
        ElectionPolicy policy = new MySingletonElectionPolicy();
        int quorum = 3;
        ServiceName name = ServiceName.parse("my.service.name");
        Service<?> service = new MyService();
        try {
            SingletonServiceBuilderFactory factory = (SingletonServiceBuilderFactory) context.getServiceRegistry().getRequiredService(SingletonServiceName.BUILDER.getServiceName(containerName))).awaitValue();
            factory.createSingletonServiceBuilder(name, service)
                .electionPolicy(policy)
                .quorum(quorum)
                .build(context.getServiceTarget()).install();
        } catch (InterruptedException e) {
            throw new ServiceRegistryException(e);
        }
    }
}
----
