So I've finally tracked down the culprit that was causing us grief with async on WebLogic. It appears that our ViewQueue (a class for keeping track of the views that need to be updated) was based on LinkedBlockingQueue, a concurrent utility class that is found in the Java 5 as well as the backport library we use to support Java 1.4. I'm not sure what the interaction was that was causing the problem, but that LinkedBlockingQueue was showing that it had no entries (isEmpty() was true) but that it's size was > 0.
In the SendUpdatedViews class, the constructor has this tidbit:
...
Set viewIdentifiers = new HashSet(allUpdatedViews);
if (!viewIdentifiers.isEmpty()) {
...
So even though there should have been viewIdentifiers in the set (and the ViewQueue did report a size > 0), the isEmpty method was resolving to true. My hunch is that internally it was using the Interation which, when I tried it, didn't return anything to iterate over. The end result is that there were no updates making their way back to the client. This included our "Pong" heartbeat responses. So the client would eventually interpret this as a network connection issue and timeout. This was only a problem in WebLogic for some reason as it worked find in Liferay and JBoss portal.
What I've done is to switch ViewQueue extends LinkedBlockingQueue to ViewQueue extends ConcurrentLinkedQueue. WebLogic seems to like this better as async now works properly and Liferay doesn't seem to mind either.
Targetting for 1.7