Please note: Although this question mentions Java, I think it's an OOP/concurrency problem at heart and can probably be answered by anyone with significant programming experience.
So I'm building a ConfigurationLoader
that will read Configuration
POJO from a remote service and make it available via an API. A few things:
- As soon as the
ConfigurationLoader
is asked for theConfiguration
the first time, a background thread (worker) will ping the remote service every, say, 30 seconds, for updates and then apply those updates to theConfiguration
instance; and - If the
Configuration
is modified, the background worker will be notified of the change and will push the "new"Configuration
to the remote service; - Both the
ConfigurationLoader
and theConfiguration
must be thread-safe
So when I think "thread safety" the first thing I think of is immutability, which leads me towards excellent projects like Immutables. The problem is that Configuration
can't be immutable because we need to be able to change it on the client-side and then let the loader ripple those changes back to the server.
My next thought was to try and make both ConfigurationLoader
and Configuration
singletons, but the problem is there is that the ConfigurationLoader
takes a lot of arguments to instantiate it, and as this excellent answer points out, a singleton that takes arguments in construction is not a true singleton.
// Groovy pseudo-code
class Configuration {
// Immutable? Singleton? Other?
}
class ConfigurationLoader {
// private fields
Configuration configuration
ConfigurationLoader(int fizz, boolean buzz, Foo foo, List<Bar> bars) {
super()
this.fizz = fizz
this.buzz = buzz;
// etc.
}
Configuration loadConfiguration() {
if(configuration == null) {
// Create background worker that will constantly update
// 'configuration'
}
}
}
What are my options here? How do I create both the loader and the config to be thread-safe, where the config is changeable by the client-side (on-demand) or asynchronously by a background worker thread?