каков правильный подход к частой отправке серверного времени клиенту?

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

Но из-за утечки памяти после отладки с использованием JProfiler я узнал этот объект даты создан внутри таймера, и из-за создания потока он не собирается мусором.

Также я прикрепил одно изображение, которое увеличивает поток в режиме отладки. Возможно, это не война. Я еще не тестировался в войне.

1) Как мы можем сделать объект подходящим для сборки мусора, который создается внутри потока?

2) какой другой способ отправить серверное время клиенту?

3) Как мы можем протестировать GWT War с помощью JProfiler?

Код обработчика:

  public class UtilityCallerActionHandler extends RemoteEventServiceServlet implements
            ActionHandler<UtilityCaller, UtilityCallerResult> {

        private static Timer myEventGeneratorTimer;

        @Inject
        public UtilityCallerActionHandler() {
        }

        @Override
        public UtilityCallerResult execute(UtilityCaller action,
                ExecutionContext context) throws ActionException {
            try{
                if(myEventGeneratorTimer == null) {
                    myEventGeneratorTimer = new Timer(true);
                    myEventGeneratorTimer.schedule(new ServerTimerTask(), 0, 10000);
                }
                return new UtilityCallerResult();
            }catch (Exception e) {
                CommonUtil.printStackTrace(e);
                long exceptionBeanId = 0l;
                if (e instanceof NTException) {
                    exceptionBeanId = ((NTException)e).getExceptionBeanId();
                }
                throw new NTActionException(NTException.getStackTrace(e),e.getCause(), exceptionBeanId);
            }
        }

        @Override
        public void undo(UtilityCaller action, UtilityCallerResult result,
                ExecutionContext context) throws ActionException {
        }

        @Override
        public Class<UtilityCaller> getActionType() {
            return UtilityCaller.class;
        }

        private class ServerTimerTask extends TimerTask
        {
            public void run() {
                final Date theEventMessage = new Date();
                //create the event
                Event theEvent = new NTTimerEvent(theEventMessage);
                //add the event, so clients can receive it
                addEvent(NTTimerEvent.SERVER_MESSAGE_DOMAIN, theEvent);
            }
        }

    }

введите здесь описание изображения


person bNd    schedule 17.04.2013    source источник
comment
ИМХО Вы должны отправлять только один раз. Сохраните разницу на стороне клиента и используйте ее для отображения времени сервера позже.   -  person Subir Kumar Sao    schedule 17.04.2013
comment
Почему бы вам не справиться с этим на стороне клиента с помощью Таймер вместо отправки информации?   -  person Ronan Quillevere    schedule 17.04.2013
comment
@RonanQuillevere AFAIK По таймеру на стороне клиента я должен каждый раз отправлять в него запрос rpc, который называется пулом серверов. Здесь я использую отправку сервера, чтобы избежать запроса от клиента к серверу. если у меня не будет другого, то я пойду на это.   -  person bNd    schedule 17.04.2013
comment
Возможно, вам стоит взглянуть на веб-сокеты (я считаю, что комета не основана на веб-сокетах). Я никогда не пробовал какое-либо решение GWT на их основе, но кажется, что некоторые люди работают над этим.   -  person Ronan Quillevere    schedule 17.04.2013


Ответы (1)


Даже при использовании GWTEventService стоимость поездки туда и обратно одинакова. Вы не экономите много пропускной способности или обработки в push vs pull. Я бы предпочел один из следующих подходов

  1. Опрос сервера по таймеру с использованием RPC. Установите таймер на задержку от 5 до 10 минут (один вызов rpc с такой задержкой не стоит много)
  2. Предложение Subir сделать один вызов RPC для даты при загрузке и использовать его для текущего сеанса в браузере.
person appbootup    schedule 17.04.2013