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