Thanks for clearing this up, Oliver!
I was going straight from the documentation. On the page
https://commons.apache.org/proper/commons-configuration/userguide/howto_concurrency.html
I can't find anything about setting up the builder parameters.
So I'm extremely happy to learn that you can configure the builder with
a synchronizer. So I guess the "tension" now is that part of the
documentation says, "it's better to use a builder than the configuration
itself, especially if you want auto-loading", and then the part that
actually talks about synchronization seems to favor working with the
configuration and doesn't even mention that I can set the synchronizer
on the builder.
At the very least
https://commons.apache.org/proper/commons-configuration/userguide/howto_concurrency.html
should mention the configuration params.
Cheers,
Garret
On 11/27/2016 8:58 AM, Gary Gregory wrote:
Do we need better Javadocs to make this obvious?
Gary
On Nov 27, 2016 7:02 AM, "Oliver Heger" <oliver.he...@oliver-heger.de
<mailto:oliver.he...@oliver-heger.de>> wrote:
Hi,
Am 25.11.2016 um 22:55 schrieb Garret Wilson:
I'm reading the documentation for the new
commons-configuration 2.x. I
have a simple need: load a configuration file from a
properties file,
reload it when the file changes, and make the configuration
thread-safe
for reading.
From the documentation I understand that I shouldn't keep the
Configuration object around, because it may be reloaded if the
file
changes. Instead I should keep a ConfigurationBuilder around.
So my
application's getConfiguration() would look like this:
public Configuration getConfiguration() {
return configurationBuilder.getConfiguration();
}
But I need it to be thread-safe. So I do this:
public Configuration getConfiguration() {
Configuration
configuration=configurationBuilder.getConfiguration();
configuration.setSynchronizer(new ReadWriteSynchronizer());
return configuration;
}
Oops! It turns out that we don't know if the builder returns
the same
configuration or a new configuration, so we could be swapping
out the
synchronizer on the same configuration. That introduces a race
condition
and defeats the thread safety!
So are we expected to keep a separate synchronizer around and
make sure
the new/existing configuration uses it?
private final Synchronizer synchronizer = new
ReadWriteSynchronizer();
public Configuration getConfiguration() {
Configuration
configuration=configurationBuilder.getConfiguration();
configuration.setSynchronizer(synchronizer);
return configuration;
}
Wow, that's getting complicated. The problem is that Apache
Commons
Configuration2 recommends that the builder be the ultimate
source of the
configuration, yet it associates the syncrhonizer with the actual
configuration instance. Shouldn't we set the synchronizer on
the builder
and let it manage the synchronizer of the new configurations?
Or do you
want each configuration to potentially have different
synchronizers? But
is that realistic---would synchronized and unsynchronized
configurations
play well together if they are backed by the same builder? I'm
trying to
understand what the expected usage is.
you configure the builder to set the correct synchronizer on newly
created Configuration objects. To achieve this, call the builder's
configure() method with a parameters object. Focused on the
synchronizer, this looks as follows:
Synchronizer sync = ...;
Parameters params = new Parameters();
BasicConfigurationBuilder<PropertiesConfiguration> builder =
new BasicConfigurationBuilder<PropertiesConfiguration>(
PropertiesConfiguration.class)
.configure(params.basic()
.setSynchronizer(sync));
Just insert your type parameters for the configuration type. All
properties configured this way are automatically set on the
Configuration each time a new instance is created.
Oliver
Garret
---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@commons.apache.org
<mailto:user-unsubscr...@commons.apache.org>
For additional commands, e-mail: user-h...@commons.apache.org
<mailto:user-h...@commons.apache.org>
---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@commons.apache.org
<mailto:user-unsubscr...@commons.apache.org>
For additional commands, e-mail: user-h...@commons.apache.org
<mailto:user-h...@commons.apache.org>