Daniele,
In theory it should be enough to create a connection one time and then leave it indefinitely. The client is built to automatically keep the connection alive and to reconnect and either resume an existing or establish a new session any time it disconnects. This behavior should continue until you've explicitly disconnected the client.
What you do need to is add a SubscriptionListener (client.getSubscriptionManager().addSubscriptionListener(...)) and be sure to implement the onSubscriptionTransferFailed() method. This will get called when a reconnect happens and either the server doesn't support subscription transfers or the subscriptions no longer exist (e.g. because the server was restarted). You need to re-create the Subscription and its MonitoredItems in this case.
For your own information you can also periodically read or subscribe to the server's CurrentTime and State variables and/or add a SessionActivityListener to the client, which will be notified any time a session is activated or goes inactive. This is mostly for informational purposes as the client will automatically handle re-establishing a session.
We use Milo in the same basic scenario where I work and there are generally no issues, and the servers in the Siemens PLCs (1500s, anyway) seem to be pretty good. The OPC UA server in them does restart entirely every time a download happens, though, so you will definitely need to be re-creating subscriptions.