3

I haven't been able to find any guide on how to programmatically setup tomcat session replication when using an embedded tomcat with spring boot. It was even a hard time finding out about the "tomcat-catalina-ha" dependency.

I have a working Tomcat session replication example working when setup on a non-embedded tomcat, but converting it over to Java config hasn't been working. I looked into Hazelcast, but a few of the options I need require the enterprise license. I've also been told that storing sessions in a traditional database doesn't scale well.

I'm looking for a guide or example project that implements Tomcat session replication using an embedded tomcat. Barring that, I'd be interested in why there are no guides in the first place?

1 Answer 1

2

So after more research, I found this documentation:

The list listed here is the only place that configuration and how-to questions belong, ever.

Looking through the mailing list archive, I was able to find one example of programmatic cluster configuration: https://marc.info/?l=tomcat-user&m=160220406421937&w=2

It was able to take me most of the way, I had been setting my cluster on the context via:

@Configuration
public class MyConfig implements WebServerFactoryCustomize<TomcatServletWebServerFactory> {

@Override
public void customize(TomcatServletWebServerFactory factory) {
    factory.addContextCustomizers(context -> {
        //cluster setup
        SimpleTcpCluster simpleTcpCluster = new SimpleTcpCluster();
        // order of your interceptors does matter fyi
        // rest of setup details, very similar to mailing list archive

        // Make sure the DeltaManager is created for me
        context.setDistributable(true);

        // The key point:
        //context.setCluster(simpleTcpCluster);

        // The fix instead of context.setCluster
        // context.getParent() is an instance of StandardHost
        // And if you are coping from a server.xml, it's also clear
        // that the cluster element is set on the host
        context.getParent().setCluster(simpleTcpCluster);

        // Basically by setting it on the `host`, it allows the startup to 
        // recognize it early enough to start the cluster up.
    });
}

When I set the cluster on the context, none of the cluster elements were ever actually started.

I would also note that when investigating this, I found an article(2013) showing how to load a server.xml when using an embedded tomcat, although I didn't not try it.

Final note: I used the StaticMembershipService vs the multicast stuff, or the StaticMembershipInterceptor.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.