Support Questions

Find answers, ask questions, and share your expertise

Update properties of controller service in Nifi

avatar
New Contributor

Dear NiFi enthousiasts,

 

I'm configuring a flow where I make a connection with several websockets. Each ws-url contains a unique authentication token obtained via a seperate http-request and is now manually added to the ws-url. Whenever the connection is lost for more than 20 min, my token becomes invalid and I have to manually request new tokes and update the JettyWebSocketClient for each of the websocket connections. this is time consuming and error-prone. To avoid this, I would like to automate this.

 

I was thinking I could store the token in an attribute and pass it to the controller but apparently you cannot pass flow-file attributes to a controller. And on top of that you have to disable before you can update.


So, the question is, how can I update the ws-url in the JettyWebSocketClient with new tokens?

 

In order to get the tokens, I need to do a http GET request with x-www-form-urlencoded headers, a signIn command, username and password. This returns a JSON with the token. I replaced the real token with "token".

{
  "data": {
    "clientToken": "token"
  }
}

websocket-url:

 

ws://{url:port}/api/v1/......X-AUTHENTICATION-TOKEN={token}

 

flow

Screenshot NiFi Flow.png

3 REPLIES 3

avatar
Master Mentor

@Tine 

 

The JettyWebSocketClient NiFi controller does support NiFi EL (variable registry only)  in the WebSocketURI property.  This means that you can means you could use for example ${token} in the URL you set in this Controller service.  Variables can be set on the process group. 

 

So you have two option here and both involve using the NiFi Rest-API.
Both start with obtaining the new token (perhaps via a rest-api call using the invokeHTTP processor?

 

1. Use NiFi's rest-API to stop, modify, and start theJettyWebSocketClient

2. Use NiFi's rest-API to modify a NiFi variable set on a process group.  Advantage here is the token variable can be used by multiple processors with the process group (or sub-process groups) where it was defined.  Allowing you to make only one update.

 

So consider building a flow that upon failure you trigger an invokeHTTP to get a new token and then another invokeHTTP to update the variable via NiFi's rest_API.  Then loop failed FlowFile back to processor that failed to try again.

When working with NiFi's rest-api, it is helps to use your browser's developer tools to capture the rest api calls as you manually perform them via the NiFi UI.  NiFi's rest-api documentation is also available within the embedded docs of your NiFi installation (global menu --> Help).

 

Hope this helps,

Matt

avatar
New Contributor

Hey Matt,

 

Thanks for your reply. This really helps a lot.

If this leads to a solution, I will post the results here and accept as solution.

Best,

Tine 

avatar
New Contributor

Dear @Tine,

 

I have exactly the same use case. Have you implemented the proposed solutions from above? I would really appreciate it if you could share your experience!

 

Thanks in advance!

Valentina