will valintine
will valintine

Reputation: 25

WSO2 Enterprise Integrator (6.5) - how to Store and retrieve Registry data using dynamic registry path

I have a sequence to utilise an API which issues time-constrained bearer tokens from an authorization endpoint based on client ID and Secret. The Bearer Token remains valid for 1 hour and so I'm storing the bearer token and its expiry time in the registry whenever I renew the token and on subsequent calls will use the stored token rather than request a new one - unless it's expired.

This is all working as expected - however - it is feasible that this Sequence could be called from processes that have different client IDs - so for scalability I would like to modify the process so the Token and expiry are held under a registry branch for each client_id.

I'm unable to find a way to dynamically create the registry entries to incorporate the client_id in the registry path.

I can Read from a dynamic path successfully as follows:

<property expression="get-property('registry', fn:concat('conf:/resource/MyApplication/',$ctx:client_id,'/TokenExpiry'))" name="RegBearerExpiryStr" scope="default" type="STRING"/>

but I cannot work out how to successfully Write a registry entry in a similar fashion.

I have tried the following with no success - I can see from the wire logs that everything in the key name is being interpreted literally :

<property expression="json-eval($.access_token)" name="fn:concat('conf:/resource/MyApplication/',$ctx:client_id,'/TokenExpiry'))" scope="registry" type="STRING"/>

and

<property expression="json-eval($.access_token)" name="conf:/resource/MyApplication/{$ctx:client_id}/TokenExpiry" scope="registry" type="STRING"/>

I'm running EI 6.4 and 6.5

Any brilliant ideas - there must surely be a way to create a dynamic path for writing as well as reading ?

Upvotes: 0

Views: 434

Answers (1)

tmoasz
tmoasz

Reputation: 1330

I personally use jsonObject XML and use OM type for storing complex types as WSO2 has better xml type support.

<property expression="//jsonObject" name="token" scope="default" type="OM"/> 
<property name="conf:/storage/SampleToken.xml" scope="registry" expression="$ctx:token" type="OM"/>

But, there is one "pitfall", as WSO2 are cacheing the registry entries for default 15seconds. So you will read old values for some time. If that is a problem i use workaround. I use script mediator for better handling that, and with checking if that resource exist or not. I tested it on EI 6.5

<script language="js"><![CDATA[
 var regUrl = mc.getProperty('regUrl');
 var registry = mc.getConfiguration().getRegistry();
 
 if(registry.isResourceExists(regUrl) == false) {
    registry.newResource(regUrl, false);
 }   
 registry.updateResource(regUrl,mc.getProperty('token'));

 var regEntry = registry.getRegistryEntry(regUrl);
 regEntry.setCachableDuration(0);
 registry.updateRegistryEntry(regEntry);]]>
</script>

I also made some blog post, may be also useful:: Reading, modifying and writing data in WSO2 Enterprise Integrator registry on an example

Upvotes: 1

Related Questions