опрос веб-службы в Java - PullRequest
1 голос
/ 08 мая 2011

Я реализовал службу чата и клиент рабочего стола, используя Java, программа прекрасно работает, но клиент потребляет много ресурсов ЦП, идея такова:

  • У каждого клиента есть очередь событий на сервере
  • различные события добавляются в очередь во время выполнения программы, например, новый пользователь входит в систему, поэтому добавляется событие для обновления списка пользователей, если новое сообщение отправляется, добавляется другое событие ... и т. Д.
  • клиент имеет поток, который непрерывно опрашивает события в своей очереди и соответствующим образом отвечает на эти события

Единственная проблема заключается в том, что поток опроса потребляет много ресурсов ЦП, я не знаю, поможет ли использование асинхронных веб-служб ..

например:

Это класс, в который события добавляются в очередь

public class Session {

    private String owner;
    private int sessionID;
    private BlockingQueue<Events> eventsQueue = new LinkedBlockingQueue<Events>();

    public Session() {
    }

    public Session(String owner, int sessionID) {
        this.owner = owner;
        this.sessionID = sessionID;
    }

    public Events getEvent() {
        try {
            return eventsQueue.take();
        } catch (InterruptedException ex) {
            System.err.println("Error retreiving Events");
        }
        return null;
    }


    public void addEvent(Events ev) {
        try {
            eventsQueue.put(ev);
            eventsQueue.put(ev);
            System.out.println("New Event Created with ID : " + ev.getId());
            System.out.println("Number Of Evenets in Queue " + getOwner() + " : " + eventsQueue.size());
        } catch (InterruptedException ex) {
            System.err.println("Error Creating New Event");
        }
    }

    public int queueSize() {
        return eventsQueue.size();
    }

    public String getOwner() {
        return owner;
    }

    public void setOwner(String owner) {
        this.owner = owner;
    }

    public int getSessionID() {
        return sessionID;
    }

    public void setSessionID(int sessionID) {
        this.sessionID = sessionID;
    }
}

А это тема опроса

public class pollingThread implements Runnable {

    public void run() {
        while (true) {
            if (checkQueue(Login.getUserName()) != null) {
                final Events ev = (Events) ObjectSerialization.Deserialize(checkQueue(Login.getUserName()));
                if (ev != null) {
                    switch (ev.getId()) {
                        case 1:
                            System.out.println("Event Retreived : " + ev.getEventType());
                            RefreshOnlineList RfEv = (RefreshOnlineList) ev;
                            if (RfEv.getLogEvent().equals("1") && !RfEv.getUname().equals(Login.getUserName())) {
                                Chatter.showTrayMessage(RfEv.getUname() + " Has Just logged In", MessageType.INFO);
                            } else if (!RfEv.getUname().equals(Login.getUserName())) {
                                Chatter.showTrayMessage(RfEv.getUname() + " Has Just logged Out", MessageType.INFO);
                            }
                            Chatter.updateUsersCounter();
                            Chatter.updateList();
                            break;
                        case 2:
                            System.out.println("Event Retreived : " + ev.getEventType());
                            final RegistrationEvent RegEv = (RegistrationEvent) ev;
                            Chatter.showTrayMessage(RegEv.getUser().getUser_name() + " Has Just Registered", MessageType.INFO);
                            SwingUtilities.invokeLater(new Runnable() {

                                public void run() {
                                    Chatter.addNewUserPanel(RegEv.getUser());
                                }
                            });
                            break;
                        case 3:
                            System.out.println("Event Retreived : " + ev.getEventType());
                            final ChatRequestEvent ChEv = (ChatRequestEvent) ev;
                            SwingUtilities.invokeLater(
                                    new Runnable() {

                                        public void run() {
                                            int res = JOptionPane.showConfirmDialog(
                                                    null,
                                                    ChEv.getRequestingUser() + " Wishes to connect with you !! ",
                                                    "Incoming Request",
                                                    JOptionPane.YES_NO_OPTION);
                                            if (res == 1) {
                                                replyRequest(ChEv.getRequestingUser(), ChEv.getReceivingUser(), false, ChEv.getRequestID());
                                            } else {
                                                chatWindow s = new chatWindow(ChEv.getRequestID(), ChEv.getRequestingUser() + " - " + ChEv.getReceivingUser());
                                                Chatter.addChatwindow(ChEv.getRequestID(), s);
                                                Chatter.setUserIsChatting(ChEv.getRequestingUser(), true);
                                                chatWindow.main(ChEv.getRequestID(), ChEv.getRequestingUser() + " - " + ChEv.getReceivingUser() + " Are Talking ...", s);
                                                replyRequest(ChEv.getRequestingUser(), ChEv.getReceivingUser(), true, ChEv.getRequestID());
                                                startChatSession(Login.getUserName(), ChEv.getRequestingUser(), ChEv.getRequestID(), Chatter.getDate());
                                            }
                                        }
                                    });
                            break;
                        case 4:
                            System.out.println("Event Retreived : " + ev.getEventType());
                            final RequestResponseEvent ResponseEv = (RequestResponseEvent) ev;
                            SwingUtilities.invokeLater(
                                    new Runnable() {

                                        public void run() {
                                            if (ResponseEv.isResponse()) {
                                                chatWindow s = new chatWindow(ResponseEv.getChatRequestID(), ResponseEv.getRequestinguser() + " - " + ResponseEv.getReceivingUser());
                                                Chatter.addChatwindow(ResponseEv.getChatRequestID(), s);
                                                Chatter.setUserIsChatting(ResponseEv.getReceivingUser(), true);
                                                chatWindow.main(ResponseEv.getChatRequestID(), ResponseEv.getRequestinguser() + " - " + ResponseEv.getReceivingUser() + " Are Talking ...", s);
                                            } else {
                                                JOptionPane.showMessageDialog(null, ResponseEv.getReceivingUser() + " Ignored Your Request");
                                            }
                                        }
                                    });
                            break;
                        case 5:
                            System.out.println("Event Retreived : " + ev.getEventType());
                            //Add Code to beautify the message not only the body
                            final SendMessageEvent MessageEv = (SendMessageEvent) ev;
                            SwingUtilities.invokeLater(
                                    new Runnable() {

                                        public void run() {
                                            Chatter.addMessage(MessageEv.getMessage(), MessageEv.getChatID());
                                        }
                                    });
                            break;
                        case 6:
                            System.out.println("Event Retreived : " + ev.getEventType());
                            final LeaveChatEvent LeaveEv = (LeaveChatEvent) ev;
                            SwingUtilities.invokeLater(new Runnable() {

                                public void run() {
                                    System.out.println(LeaveEv.getUserName() + " has left the Chat with ID: " + LeaveEv.getChatID());
                                    Chatter.addMessage(new shared.Message(LeaveEv.getUserName(), 1), LeaveEv.getChatID());
                                    Chatter.setUserIsChatting(LeaveEv.getUserName(), false);
                                }
                            });
                            break;
                        case 7:
                            System.out.println("Event Retreived : " + ev.getEventType());
                            final GroupChatRequestEvent GroupChatEvent = (GroupChatRequestEvent) ev;
                            SwingUtilities.invokeLater(
                                    new Runnable() {

                                        public void run() {
                                            int res = JOptionPane.showConfirmDialog(
                                                    null,
                                                    GroupChatEvent.getRequestingUser() + " Wants to Join his Group Conference !! ",
                                                    "Incoming Request",
                                                    JOptionPane.YES_NO_OPTION);
                                            if (res != 1) {
                                                chatWindow s = new chatWindow(GroupChatEvent.getChatID(), "Conference - " + GroupChatEvent.getRequestingUser() + " - " + Login.getUserName());
                                                Chatter.addChatwindow(GroupChatEvent.getChatID(), s);
                                                Chatter.setUserIsChatting(GroupChatEvent.getRequestingUser(), true);
                                                chatWindow.main(GroupChatEvent.getChatID(), "Conference - " + GroupChatEvent.getRequestingUser() + " - " + Login.getUserName() + " Are Talking ...", s);
                                                joinChat(Login.getUserName(), GroupChatEvent.getChatID());
                                            }
                                        }
                                    });
                            break;
                        case 8:
                            System.out.println("Event Retreived : " + ev.getEventType());
                            final LeaveChatEvent joinEv = (LeaveChatEvent) ev;
                            SwingUtilities.invokeLater(new Runnable() {

                                public void run() {
                                    System.out.println(joinEv.getUserName() + " has Joined the Chat with ID: " + joinEv.getChatID());
                                    Chatter.addMessage(new shared.Message(joinEv.getUserName(), 2), joinEv.getChatID());
                                    Chatter.setUserIsChatting(joinEv.getUserName(), true);
                                }
                            });
                            break;
                        case 9:
                            System.out.println("Event Retreived : " + ev.getEventType());
                            final UpdateStatusEvent updateEv = (UpdateStatusEvent) ev;
                            SwingUtilities.invokeLater(new Runnable() {

                                public void run() {
                                    System.out.println(updateEv.getUser() + " has updated his status to " + updateEv.getStatus());
                                    Chatter.updateStatusList(updateEv.getUser(), updateEv.getStatus());
                                }
                            });
                            break;
                        case 10:
                            System.out.println("Event Retreived : " + ev.getEventType());
                            final RefreshDetailsEvent refEvenet = (RefreshDetailsEvent) ev;
                            SwingUtilities.invokeLater(new Runnable() {

                                public void run() {
                                    System.out.println(refEvenet.getUser() + " has updated his Details ");
                                    Chatter.updateDetails(refEvenet.getUser());
                                }
                            });
                            break;
                        case 11:
                            System.out.println("Event Retreived : " + ev.getEventType());
                            final BlockedEvent BlockedEv = (BlockedEvent) ev;
                            SwingUtilities.invokeLater(new Runnable() {

                                public void run() {
                                    System.out.println(BlockedEv.getUserName() + " has Been Blocked ");
                                    JOptionPane.showMessageDialog(null, "You have Been Blocked\nReason: " + BlockedEv.getReason());
                                    Chatter.signOut();
                                }
                            });
                            break;
                    }
                }
            }
        }
    }

    private static byte[] checkQueue(java.lang.String uname) {
        db.Database service = new db.Database();
        db.DatabasePortType port = service.getDatabaseHttpSoap12Endpoint();
        return port.checkQueue(uname);
    }

    private static void replyRequest(java.lang.String requestingUser, java.lang.String receivingUser, java.lang.Boolean result, java.lang.Integer id) {
        db.Database service = new db.Database();
        db.DatabasePortType port = service.getDatabaseHttpSoap12Endpoint();
        port.replyRequest(requestingUser, receivingUser, result, id);
    }

    private static void startChatSession(java.lang.String initiatingUser, java.lang.String receivingUser, java.lang.Integer id, java.lang.String sessionTime) {
        db.Database service = new db.Database();
        db.DatabasePortType port = service.getDatabaseHttpSoap12Endpoint();
        port.startChatSession(initiatingUser, receivingUser, id, sessionTime);
    }

    private static void joinChat(java.lang.String uname, java.lang.Integer chatID) {
        db.Database service = new db.Database();
        db.DatabasePortType port = service.getDatabaseHttpSoap12Endpoint();
        port.joinChat(uname, chatID);
    }
}

И проверка очереди

благодарю за помощь

1 Ответ

2 голосов
/ 08 мая 2011

Вместо того, чтобы клиенты опрашивали главный сервер, я бы сказал, использовать технологию push, чтобы сервер отправлял изменения соответствующему клиенту, если таковые имеются. Однако это может потребовать большого количества изменений в зависимости от вашей текущей архитектуры.

UPDATE:

Основная идея: Вместо того, чтобы клиент опрашивал сервер, чтобы получить обновления, если они есть, измените ваш клиентский код так, чтобы он ожидал получения обновлений от сервера (другой поток на стороне клиента ожидает получения обновлений от сервера). На сервере будет список событий с информацией о клиенте, поэтому он отправит правильные данные правильному клиенту.

Таким образом, на стороне клиента вам понадобится как минимум 2 потока: один для отправки обновлений на сервер, а другой ожидает получения обновлений с сервера (выдаваемый сервером).

...