Normally I close the sender or receiver before rolling back any pending transactions if the session is transacted, close the session and finally close the connection just to make sure the server has been notified. I don't know if that helps.
It looks like closing the connection doesn't close everything as it's supposed to but you'd need to post a working example to be sure.
I realized what I was doing wrong:
Contrary to my belief, I did in fact have unclosed JMS connections in my system. Namely, I was using some older test client code that *wasn't* closing connections, and it was these connection timeout messages that HornetQ was tossing around the logs. If anyone else has this problem, using jconsole can be helpful for troubleshooting. Once you have your jconsole window running and you are attached to your HornetQ process, click on the "mbeans" tab. Click on org.hornetq-->Server-->JMS-->Operations. Click on "listRemoteAddresses". A window will appear showing all current subscribers with remote IP addresses and ports.