From c16161d91900f3f14bd40580917c813768f86ecd Mon Sep 17 00:00:00 2001 From: marcins78 Date: Tue, 8 Jan 2013 11:48:50 +0000 Subject: [PATCH] Using long polling to reduce number of calls. --- ...heringParticipantCommunicationChannel.java | 4 ++++ .../lotro/game/DefaultUserFeedback.java | 4 ++++ .../lotro/game/LotroGameMediator.java | 22 +++++++++++++++++++ .../gempukku/lotro/server/ChatResource.java | 13 ++++++++++- .../gempukku/lotro/server/GameResource.java | 10 +++++++++ 5 files changed, 52 insertions(+), 1 deletion(-) diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GatheringParticipantCommunicationChannel.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GatheringParticipantCommunicationChannel.java index 352f772fc..bcdf9a818 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GatheringParticipantCommunicationChannel.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GatheringParticipantCommunicationChannel.java @@ -170,6 +170,10 @@ public class GatheringParticipantCommunicationChannel implements GameStateListen return result; } + public boolean hasGameEvents() { + return _events.size()>0; + } + public Date getLastConsumed() { return _lastConsumed; } diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/DefaultUserFeedback.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/DefaultUserFeedback.java index 01ca1d5ad..c4740869a 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/DefaultUserFeedback.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/DefaultUserFeedback.java @@ -47,6 +47,10 @@ public class DefaultUserFeedback implements UserFeedback { return _warnings.remove(playerId); } + public boolean hasWarning(String playerId) { + return _warnings.containsKey(playerId); + } + public Set getUsersPendingDecision() { return _awaitingDecisionMap.keySet(); } diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/LotroGameMediator.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/LotroGameMediator.java index 23e7f130d..2a60be2c1 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/LotroGameMediator.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/LotroGameMediator.java @@ -333,6 +333,28 @@ public class LotroGameMediator { } } + public boolean hasAnyNewMessages(Player player, int channelNumber) throws PrivateInformationException, SubscriptionConflictException, SubscriptionExpiredException { + String playerName = player.getName(); + if (!player.getType().contains("a") && !_allowSpectators && !_playersPlaying.contains(playerName)) + throw new PrivateInformationException(); + + _readLock.lock(); + try { + GatheringParticipantCommunicationChannel communicationChannel = _communicationChannels.get(playerName); + if (communicationChannel != null) { + if (communicationChannel.getChannelNumber() == channelNumber) { + return communicationChannel.hasGameEvents() || _userFeedback.hasWarning(playerName); + } else { + throw new SubscriptionConflictException(); + } + } else { + throw new SubscriptionExpiredException(); + } + } finally { + _readLock.unlock(); + } + } + public void processCommunicationChannel(Player player, int channelNumber, ParticipantCommunicationVisitor visitor) throws PrivateInformationException, SubscriptionConflictException, SubscriptionExpiredException { String playerName = player.getName(); if (!player.getType().contains("a") && !_allowSpectators && !_playersPlaying.contains(playerName)) 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 8de41c491..9957197fe 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 @@ -83,7 +83,18 @@ public class ChatResource extends AbstractResource { } try { - List chatMessages = chatRoom.getPendingMessages(resourceOwner.getName()); + // Use long polling + List chatMessages; + int retry = 5; + do { + chatMessages = chatRoom.getPendingMessages(resourceOwner.getName()); + retry--; + try { + Thread.sleep(1000); + } catch (InterruptedException exp) { + + } + } while (retry>0 && chatMessages.size() == 0); 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 931765e15..37fa04b2a 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 @@ -172,6 +172,16 @@ public class GameResource extends AbstractResource { Document doc = documentBuilder.newDocument(); Element update = doc.createElement("update"); + // Use long polling + int retry = 5; + while (retry>0 && !gameMediator.hasAnyNewMessages(resourceOwner, channelNumber)) { + retry--; + try { + Thread.sleep(1000); + } catch (InterruptedException exp) { + + } + } gameMediator.processCommunicationChannel(resourceOwner, channelNumber, new SerializationVisitor(doc, update)); doc.appendChild(update);