diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/chat/ChatRoomMediator.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/chat/ChatRoomMediator.java index 2d906d9f8..d3bbe4eb7 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/chat/ChatRoomMediator.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/chat/ChatRoomMediator.java @@ -46,6 +46,18 @@ public class ChatRoomMediator { } } + public boolean hasPendingMessages(String playerId) throws SubscriptionExpiredException { + _lock.readLock().lock(); + try { + GatheringChatRoomListener gatheringChatRoomListener = _listeners.get(playerId); + if (gatheringChatRoomListener == null) + throw new SubscriptionExpiredException(); + return gatheringChatRoomListener.hasMessages(); + } finally { + _lock.readLock().unlock(); + } + } + public List getPendingMessages(String playerId) throws SubscriptionExpiredException { _lock.readLock().lock(); try { diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/GatheringChatRoomListener.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/GatheringChatRoomListener.java index e3c29ece4..81004d3b0 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/GatheringChatRoomListener.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/GatheringChatRoomListener.java @@ -23,6 +23,10 @@ public class GatheringChatRoomListener implements ChatRoomListener { return messages; } + public synchronized boolean hasMessages() { + return _messages.size()>0; + } + public synchronized Date getLastConsumed() { return _lastConsumed; } diff --git a/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/AbstractResource.java b/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/AbstractResource.java index 6ace24295..6d49ce1c9 100644 --- a/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/AbstractResource.java +++ b/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/AbstractResource.java @@ -16,6 +16,8 @@ import javax.ws.rs.core.Response; public abstract class AbstractResource { protected final boolean _test = System.getProperty("test") != null; + protected final long _longPollingLength = 5000; + protected final long _longPollingInterval = 200; @Context protected PlayerDAO _playerDao; diff --git a/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/ChatResource.java b/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/ChatResource.java index 9957197fe..c1d157643 100644 --- a/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/ChatResource.java +++ b/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/ChatResource.java @@ -84,17 +84,15 @@ public class ChatResource extends AbstractResource { try { // Use long polling - List chatMessages; - int retry = 5; - do { - chatMessages = chatRoom.getPendingMessages(resourceOwner.getName()); - retry--; + long start = System.currentTimeMillis(); + while (System.currentTimeMillis()0 && chatMessages.size() == 0); + } + List chatMessages = chatRoom.getPendingMessages(resourceOwner.getName()); Collection usersInRoom = chatRoom.getUsersInRoom(); diff --git a/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/GameResource.java b/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/GameResource.java index 37fa04b2a..cbabe231f 100644 --- a/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/GameResource.java +++ b/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/GameResource.java @@ -173,11 +173,10 @@ public class GameResource extends AbstractResource { Element update = doc.createElement("update"); // Use long polling - int retry = 5; - while (retry>0 && !gameMediator.hasAnyNewMessages(resourceOwner, channelNumber)) { - retry--; + long start = System.currentTimeMillis(); + while (System.currentTimeMillis()< start+_longPollingLength && !gameMediator.hasAnyNewMessages(resourceOwner, channelNumber)) { try { - Thread.sleep(1000); + Thread.sleep(_longPollingInterval); } catch (InterruptedException exp) { }