Becky,
Currently the refresh_token will only be sent when exchanging your authorization_code for the access_token/refresh_token, this may change in the future though. The best practice is anytime you get a refresh_token back you should replace your current refresh_token with the one sent back to you. Which leads into handling authorization failures when using tokens.
To be able to gracefully handle authorization failures, i.e. expired tokens, or invalid refresh_tokens, there are two layers you need to have. The first is that whenever you get a 401 when you attempt to use an access_token you should try and use your refresh_token to generate a new access_token. And the second is if you get an error when use your refresh token to generate a new access token then you will need to ask the user to grant you permission again using the full oauth2 flow.
There are some cases where you would only want to handle invalid access_tokens but not invalid refresh_tokens. That being if you are using a token for a different user than the one interacting with your tool, i.e. using a Teachers access_token to enable the tool to do more when the student is interacting with it. In that case you wouldn't be able to reauthorize the user to get a new token since the user associated with the token is not available.
Since it sounds like your tool is using a single access_token for multiple users, I would not recommend refreshing it before every request, instead I would to only refresh it when you needed to, i.e. when it expires or you could set a rule to refresh it if it is less than X minutes prior to expiration, where x is a reasonably small value, i.e 5 minutes. Then in your code you would want the refresh to be a singleton, so you don't have multiple refreshes happening at the same time.
I would like to get some more information about the token working after you invalidate it, I tried to reproduce it on my side and wasn't able to. Could you provide me some more detailed steps on what you are doing in that situation?
Hopefully I have addressed everything, but in case I didn't, please let me know.
Thanks