You can identify when CloudBees Feature Management SDK has loaded configuration from local
storage or network by adding the onConfigurationFetched
handler to
RoxOptions
.
Examples
The following are examples of code in different SDKs that add the
onConfigurationFetched
handler:
Swift
Android
React Native
JavaScript
Node.js
JavaScript SSR
JVM
.NET
Python
Go
Ruby
PHP
C
C++
let options = ROXOptions()
options.onConfigurationFetched = { (result: RoxFetcherResult) -> Void in
print(result)
};
ROX.setup(withKey:appKey, options:options)
RoxOptions options = new RoxOptions.Builder()
.withConfigurationFetchedHandler(new ConfigurationFetchedHandler() {
@Override
public void onConfigurationFetched(FetcherResults results) {
Logger.info("Got Rollout configuration");
}
}).build();
Rox.setup(this.getApplication(), options);
const configurationFetchedHandler = fetcherResults => {
console.log(fetcherResults);
};
const options = {
configurationFetchedHandler : configurationFetchedHandler
};
Rox.setup(appKey, options);
const configurationFetchedHandler = fetcherResults => {
console.log(fetcherResults);
};
const options = {
configurationFetchedHandler : configurationFetchedHandler
};
Rox.setup(appKey, options);
const configurationFetchedHandler = fetcherResults => {
console.log(fetcherResults);
};
const options = {
configurationFetchedHandler : configurationFetchedHandler
};
Rox.setup(appKey, options);
import {Rox} from 'rox-ssr';
const configurationFetchedHandler = fetcherResults => {
console.log(fetcherResults);
};
const options = {
configurationFetchedHandler : configurationFetchedHandler
};
Rox.setup(appKey, options);
RoxOptions options = new RoxOptions.Builder()
.withConfigurationFetchedHandler(new ConfigurationFetchedHandler() {
@Override
public void onConfigurationFetched(FetcherResults results) {
Logger.info("Got Rollout configuration");
}
}).build();
Rox.setup(ROLLOUT_KEY, options);
var options = new RoxOptions(new RoxOptions.RoxOptionsBuilder
{
ConfigurationFetchedHandler = (sender, e) =>
{
Console.WriteLine("Got Rollout configuration");
}
});
Rox.setup(ROLLOUT_KEY, options);
from my_container import MyContainer
from rox.server.rox_server import Rox
from rox.server.rox_options import RoxOptions
my_container = MyContainer()
Rox.register('test', my_container)
# setup configuration_fetched_handler in the options object
options = RoxOptions(
configuration_fetched_handler=lambda o:
print("applied-from=%s creation-date=%s has-changes=%s error=%s" % (o.fetcher_status , o.creation_date , o.has_changes , o.error_details) )
)
cancel_event = Rox.setup(ROLLOUT_KEY, options).result();
import (
"github.com/rollout/rox-go/v5/server"
"github.com/rollout/rox-go/v5/core/model"
)
type Container struct {}
var flags = &Container {}
rox.Register('test', flags)
options := server.NewRoxOptions(server.RoxOptionsBuilder {
ConfigurationFetchedHandler: func(e *model.ConfigurationFetchedArgs) {
fmt.Println("applied-from=", e.FetcherStatus ,"creation-date=", e.CreationDate,"has-changes=", e.HasChanges, "errors=", e.ErrorDetails)},
})
<- rox.Setup(ROLLOUT_KEY, options)
require_relative 'container'
require 'rox/server/rox_server'
require 'rox/server/rox_options'
configuration_fetched_handler = proc do |e|
puts "applied-from=#{e.fetcher_status} creation-date=#{e.creation_date} has-changes=#{e.has_changes} error=#{e.error_details}"
end
container = Container()
Rox::Server::RoxServer.register('', container)
# setup configuration_fetched_handler in the options object
option = Rox::Server::RoxOptions.new(
configuration_fetched_handler: configuration_fetched_handler
)
Rox::Server::RoxServer.setup(<ROLLOUT_KEY>, option).join
use Rox\Server\Rox;
use Rox\Server\RoxOptions;
use Rox\Server\RoxOptionsBuilder;
use Rox\Core\Configuration\ConfigurationFetchedArgs;
use Rox\Core\Configuration\FetcherStatus;
use Rox\Core\Configuration\FetcherError;
$roxOptionsBuilder = (new RoxOptionsBuilder())
->setConfigurationFetchedHandler(function (ConfigurationFetchedArgs $args) {
if ($args != null) {
echo "applied-from=" . $args->getFetcherStatus(); // FetcherStatus
echo " creation-date=" . $args->getCreationDate();
echo " has-Changes=" . $args->isHasChanges();
echo " error=" . $args->getErrorDetails(); // FetcherError
}
})
Rox::setup(ROLLOUT_KEY, new RoxOptions($roxOptionsBuilder));
void configuration_fetched_handler(void *target, RoxConfigurationFetchedArgs *args) {
if (args != NULL) {
printf("applied-from=%d", args->fetcher_status);
printf(" creation-date=%s", args->creation_date);
printf(" has-Changes=%s", args->has_changes ? "yes" : "no");
printf(" error=%d", args->error_details);
}
}
int main(int argc, char **argv) {
RoxOptions *options = rox_options_create();
rox_options_set_configuration_fetched_handler(options, NULL, &configuration_fetched_handler);
rox_setup(DEFAULT_API_KEY, options);
rox_shutdown();
}
class ConfigurationFetchedHandler : public Rox::ConfigurationFetchedHandler {
public:
explicit ConfigurationFetchedHandler() {}
public:
void ConfigurationFetched(Rox::ConfigurationFetchedArgs *args) override {
if (args != NULL) {
printf("applied-from=%d", args->fetcher_status); // FetcherStatus enum
printf(" creation-date=%s", args->creation_date);
printf(" has-Changes=%s", args->has_changes ? "yes" : "no");
printf(" error=%d", args->error_details); // FetchError enum
}
}
};
int main(int argc, char **argv) {
ConfigurationFetchedHandler configurationFetchedHandler = ConfigurationFetchedHandler();
Rox::Options *options = Rox::OptionsBuilder()
.SetConfigurationFetchedHandler(&configurationFetchedHandler)
.Build();
Rox::Setup(DEFAULT_API_KEY, options);
Rox::Shutdown();
}
FetcherResult information
The FetcherResult
has the following information regarding the actual
fetch:
-
fetcherStatus
- an enum that identifies which configuration was fetched (from the network, from local storage, an error occurred) -
creationDate
- Date of configuration creation -
errorDetails
- The description of the error if one exists -
hasChanges
- Does this configuration differ from the one it is replacing