3

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

但是由于内存泄漏,在使用JProfiler进行调试后, 我知道在计时器内部创建了日期对象,并且由于线程创建,它没有被垃圾收集。

此外,我还附上了一张图片,它在调试模式下增加了线程。这可能不是战争我还没有经过战争测试。

1)我们如何使对象符合在线程内创建的垃圾收集?

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

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

处理程序代码:

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

    }

在此处输入图像描述

4

1 回答 1

1

即使使用 GWTEventService,往返成本也是一样的。在推送与拉取中,您并没有节省太多带宽或处理。我更喜欢以下方法之一

  1. 使用 RPC 的基于计时器的服务器轮询。将计时器设置为 5 到 10 分钟延迟(一个具有该延迟的 rpc 调用不会花费太多)
  2. Subir 建议对加载日期进行一次 RPC 调用并将其用于浏览器上的当前会话。
于 2013-04-17T16:50:35.093 回答