我正在使用RequestBuilder花费太长时间的超时GWT请求:
RequestBuilder requestBuilder = _service.getStatistics(callback);
requestBuilder.setTimeoutMillis(5000);
try {
requestBuilder.send();
} catch (RequestException e) {
GWT.getUncaughtExceptionHandler().onUncaughtException(e);
}
Run Code Online (Sandbox Code Playgroud)
有没有办法通知被调用的远程服务该调用在客户端超时并且应该被取消?
我正在尝试理解GWT使用的RPC功能,并遵循本指南.如果我按照指南操作并在单独的类文件中调用服务器,那么它的工作正常.但是,当我尝试在entryPoints创建的调用时,它将无法工作.
我想知道为什么会这样,以及如何解决它?
package com.async.me.client;
import com.async.me.client.widgets.HelloWidget;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.RootPanel;
/**
* Entry point classes define <code>onModuleLoad()</code>.
*/
public class Async_test implements EntryPoint {
private Button specialButton = new Button("Special");
private DataServiceAsync service;
public void onModuleLoad() {
// set widget on "content" element
RootPanel content = RootPanel.get("content");
content.add(specialButton);
service = (DataServiceAsync) GWT.create(DataService.class);
specialButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
System.out.println("Sometihng");
service.getData(new AsyncCallback() {
public void onFailure(Throwable …Run Code Online (Sandbox Code Playgroud) 我的应用程序有很多RPC调用,它们都有.onFailure(Throwable caught)方法.我在客户端和服务器代码NotLoggedInException之间共享一个类.如果用户没有基于会话/ cookie /权限等的相关权限,则由服务器抛出此操作.
理想情况下,我希望在其他地方传递给.onFailure()代码之前在一个地方处理此异常,因为这种处理无处不在并且需要安全性.有一个GWT.setUncaughtExceptionHandler(),但这似乎是在处理后调用不理想的(如果.onFailure意外消耗太多).
有人有一个优雅的解决方案吗?一个丑陋的解决方案是将延迟绑定的.create()代理包装在实现异步接口的同一聚合类中.
旁注:服务器之前发布了一个重定向,但我不喜欢这个范例,并希望它由应用程序的事件总线处理.
更新:上面提到的丑陋的答案
public abstract class CustomAsyncCallback implements AsyncCallback{
@Override
public CustomAsyncCallback(AsyncCallback<T> callback)
{
this.wrap = callback ;
}
AsyncCallback<T> wrap ;
@Override
public void onFailure(Throwable caught) {
if (!handleException())
{
wrap.onFailure(caught) ;
}
}
@Override
public void onSuccess(T t) {
wrap.onSuccess(t) ;
}
Run Code Online (Sandbox Code Playgroud)
}
public class WrapDeferredBinding implements RpcInterfaceAsync { RpcInterfaceAsync service = GWT.create(RpcInterface.class);
public void method1(int arg1, AsyncCallback<Boolean> callback)
{
service.method1(arg1, new CustomAsyncCallback<Boolean>(callback)) ;
}
public void method2 ....
public void method3 .... …Run Code Online (Sandbox Code Playgroud) 在我的servlet中,我有这条线
CookieManager.getRequestCookieValue(request,"app-openid-identifier"); CookieManager.getRequestCookieValue(request,"app-openid-uniqueid");
在我的gwt客户端复合文件中,如何为"app-openid-identifier"设置cookie并执行"get"来调用servlet?
我目前有一个GWT应用程序,它使用它将RequestBuilde消息发送到我拥有的servlet(使用POST和GET),并且我的servlet(in doPost和doGet)"暂停"请求(这是通过使用Servlets 3.0规范完成的)并将其添加到队列中.
另外,我有一个守护程序线程,它在后台运行,并在有新数据时"播放"请求.
这对我来说很有用,除了我现在只是发送字符串这个事实,我想利用RPC机制发送对象.
我的问题是这样的:
如果我创建我的myServiceImpl课程,
我RemoteServiceServlet应该如何处理doPost,doGet如果有的话?
我需要暂停我的请求以利用异步支持,应该在哪里完成?我虽然可能this.getThreadLocalRequest()在myServiceImpl课堂上调用我的RPC方法中的方法,但我不确定它会有多么明智.
我不确定我是否理解GWT如何处理来自该异步接口的客户端的调用.有没有机会调用doGetservlet的例子,并确保它调用所需的RPC方法?
对不起,如果我搞得一团糟,那就是我无法找到更详细的技术信息,正如RPC业务的工作方式.
欣赏任何借贷手
Ittai
我使用GWT框架在RPC模式中创建自己的方法.现在,我需要添加另一种方法.
所以,我为RPC的每个部分编写了这段代码:
package org.sinfonet.client;
import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
@RemoteServiceRelativePath("gwtservice")
public interface GWTService extends RemoteService {
public String checkLogin(String nickname, String password);
public boolean anotherFunction(String nickname);
}
#########################################################
package org.sinfonet.client;
import com.google.gwt.user.client.rpc.AsyncCallback;
public interface GWTServiceAsync {
public void checkLogin(String nickname, String password, AsyncCallback<String> callback);
public void anotherFunction(String nickname, AsyncCallback<java.lang.Boolean> asyncCallback);
}
#########################################################
package org.sinfonet.server;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import java.util.ArrayList;
import org.sinfonet.client.GWTService;
import org.sinfonet.mgmt.Configuration;
import org.sinfonet.mgmt.Database;
public class GWTServiceImpl extends RemoteServiceServlet implements GWTService {
public String checkLogin(String nickname, String password) {
Database mydb=Configuration.getDatabase(); …Run Code Online (Sandbox Code Playgroud) 当我使用RPC时,我遇到了Eclipse的问题.如果我使用单个方法调用它的方向正确,但如果我添加一个新方法来处理服务器,我会收到以下错误:
com.google.gwt.core.client.JavaScriptException: (null): null
at com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:237)
at com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:126)
at com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:561)
at com.google.gwt.dev.shell.ModuleSpace.invokeNativeBoolean(ModuleSpace.java:184)
at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeBoolean(JavaScriptHost.java:35)
at com.google.gwt.user.client.rpc.impl.RpcStatsContext.isStatsAvailable(RpcStatsContext.java)
at com.google.gwt.user.client.rpc.impl.RequestCallbackAdapter.onResponseReceived(RequestCallbackAdapter.java:221)
at com.google.gwt.http.client.Request.fireOnResponseReceived(Request.java:287)
at com.google.gwt.http.client.RequestBuilder$1.onReadyStateChange(RequestBuilder.java:395)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:157)
at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessagesWhileWaitingForReturn(BrowserChannelServer.java:326)
at com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:207)
at com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:126)
at com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:561)
at com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:269)
at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91)
at com.google.gwt.core.client.impl.Impl.apply(Impl.java)
at com.google.gwt.core.client.impl.Impl.entry0(Impl.java:214)
at sun.reflect.GeneratedMethodAccessor13.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:157)
at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:281)
at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:531)
at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:352)
at java.lang.Thread.run(Thread.java:619)
Run Code Online (Sandbox Code Playgroud)
我可以在异步调用中获得更多服务吗?我哪里错了?
这是我的实现MyService:
package de.vogella.gwt.helloworld.client;
import com.google.gwt.user.client.rpc.RemoteService; …Run Code Online (Sandbox Code Playgroud) 我在序列化(java.util)对象中可用的日期字段时遇到以下错误.我的GWT版本是2.1.1,APP引擎SDk是1.4.2.
有人对这个问题有任何想法吗?
com.google.gwt.user.client.rpc.SerializationException: java.lang.reflect.InvocationTargetException
at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeWithCustomSerializer(ServerSerializationStreamWriter.java:764)
at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeImpl(ServerSerializationStreamWriter.java:727)
at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:616)
at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:126)
at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter$ValueWriter$8.write(ServerSerializationStreamWriter.java:152)
at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeValue(ServerSerializationStreamWriter.java:534)
at com.google.gwt.user.server.rpc.RPC.encodeResponse(RPC.java:609)
at com.google.gwt.user.server.rpc.RPC.encodeResponseForSuccess(RPC.java:467)
at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:564)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:207)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:243)
at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:58)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:70)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:351)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:938)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) …Run Code Online (Sandbox Code Playgroud) 在这个例子中,有一个很好的描述如何使用a创建超时逻辑Timer#schedule.但那里有一个陷阱.我们有2个rpc请求:首先在服务器上进行大量计算(或者可能从数据库中检索大量数据),然后是一个立即返回结果的微小请求.如果我们提出第一个请求,我们将不会立即收到结果,而是我们将超时并且在超时后我们发出第二个微小的请求然后abortFlag从示例中为真,所以我们可以检索第二个请求的结果,但我们也可以检索之前超时的第一个请求的结果(因为AsyncCallback第一个调用的对象没有被销毁).
所以我们需要在超时发生后取消某个rpc调用.我怎样才能做到这一点?
您好我有这样的功能:
@Override
public boolean checkExist(String name) {
final boolean check[] = new boolean[] { false };
getAllRecordFromServer(new SearchCallback() {
@Override
public void onSearchResult(Map<String, Item> itemsMap) {
//do some action set true when map key equals name
check[0] = true;
}
@Override
public void onSearchError(XMLPacket error) {
// TODO Auto-generated method stub
}
});
return check[0];
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找解决方案并找到一些文章,但我不知道如何在gwt中执行:/此代码无法正常工作...因为您知道这是异步回调.
我怎样才能解决这个问题,我必须在回调结束后返回值.