I am working on a project where we have multiple GUI clients running on user desktops to a single server. The clients will be distributed globally and will be connected via a WAN.
I want to make sure that there are no dependencies on applications running on the client PC apart from the release package of the GUI itself. The transport itself should be reliable (no dropped messages, replaying unacknowledged messages).
I thought of writing a custom TCP socket based transport for our application and implementing some logic to detect dropped or unacknowledged messages.
I am also considering using ActiveMQ (using JMS via the TCP/IP transport). Are there any other alternatives or suggestions?
Edit: TCP is a reliable transport, but I need to detect and replay messages that may have been dropped if a client disconnects or restarts.
TCP guarantees delivery in a happy world where there are no application errors or crashes.
Some TCP data might get acknowledged by the network stack, but before it could be processed, the application might have crashed (or server crash).
ActiveMQ with transactions let’s you handle those things. Even the application layer ack in AMQ will give you reliablitiy, with increased system complexity (of course).