Thats a good question. In the past, I've used a content services switch to monitor the service and change routing to a different box - this has worked for a number of customers - but the issue has always been that the JDE services do not like anonymous requests "poking" it.
What is really needed is some sort of monitoring system that sits on the application server itself, and publishes a "service port". That way, this service port can be monitored and if it goes down, the client can be directed to a different IP.
I started work on "flipper" a while back - in effect, this would monitor the application server JDE services, and if they did not respond, then "flipper" would turn off its monitor port (port 6900 for example) - and the second part of "flipper" which ran on citrix servers would then change the citrix servers hosts file and point a virtual application servers' machine name to a different IP. Unfortunately I never had time to finish the project.
The real issue, however, is what actually constitutes as a "down" server. Sometimes, the kernels go completely haywire or zombie but the JDENet listener still responds to requests. Not only that, but depending on what release of the service pack you're on, the kernels seem to disappear and reappear without any major issues.
As for Microsoft Network Load Balancing - its totally useless. In effect, it performs "round robin" IP DNS changes - in fact, most "Microsoft clustering" is not much good for failover.