什么是经常向客户端发送服务器时间的正确方法?

时间:2013-04-17 11:51:38

标签: java gwt jprofiler

我有一个gwt应用程序。我需要经常向客户端显示服务器日期,为此,我使用了GWTEventService。当用户登录应用程序时,我发送一个rpc并创建一个定时器,它将定期向客户端发送事件。

但是由于内存泄漏,在使用JProfiler进行调试后,我开始知道在计时器内部创建的日期对象,并且由于创建了线程,因此它不会被垃圾回收。

此外,我附加了一个图像,它在调试模式下增加了线程。可能没有在战争中我还没有用war测试。

1)我们怎样才能使对象符合在线程内创建的垃圾收集?

2)将服务器时间发送给客户端的其他方法是什么?

3)我们如何使用JProfiler测试GWT战争?

处理程序代码:

  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);
            }
        }

    }

enter image description here

1 个答案:

答案 0 :(得分:1)

即使使用GWTEventService,往返费用也是一样的。您不会在推送与拉动中节省大量带宽或处理。我希望采用以下方法之一

  1. 使用RPC进行基于计时器的服务器轮询。将定时器设置为5到10分钟的延迟(一次rpc调用,延迟时间不会太大)
  2. Subir建议在加载日期进行一次RPC调用,并将其用于浏览器上的当前会话。