我试图找出是否应该将我的gwt-rpc调用迁移到新的GWT2.1 RequestFactory cals.
Google文档模糊地提到RequestFactory是一种更好的客户端 - 服务器通信方法,用于"面向数据的服务"
我可以从文档中提炼出来的是有一个新的Proxy类可以简化通信(你不会来回传递实际的实体而只是代理,所以它更轻,更容易管理)
这是重点吗?还是我在大局中遗漏了其他东西?
我正在通过GWT Request Factory将对象列表传输到客户端.对象只包含几个字符串,列表只包含20个对象.要传输这个小数据列表,需要一秒钟.首先,我认为需要优化查询.但测量显示:
从数据库中检索对象只需要
300ms
转移到客户端总共需要一秒钟
1136ms
所以这似乎是请求工厂开销.我已经使用了自己的ServiceLayerDecorator并且已经覆盖了isLive()函数,所以它总是返回true.我可以采取任何其他措施加快速度并将性能提升到可接受的范围吗?
更新:
我创建了将我的实体对象数据复制到DTO并使用RPC传输它们以比较RPC和Request工厂性能的逻辑.如您所见,RPC逻辑要快得多.现在我想知道这是设计还是我的申请中存在缺陷.
20个转移对象:
Request factory: 1252 ms
RPC: 420 ms
28个转移对象:
Request factory: 1654 ms
RPC: 460 ms
78个转移对象:
Request factory: 3963 ms
RPC: 769 ms
================================================== ==========
UPDATE2
所以我编写了一个非常简单的示例应用程序,以确保我的应用程序没有任何过滤器或其他干扰组件.应用程序从服务器加载10个带有4个String字段的对象.我使用Request工厂和RPC完成了它并停止了时间.
代码可以在这里找到:https: //github.com/jan10101/requstFactoryVSRPC
这里的生活演示:http: //requestfactorytest.appspot.com/
测试应用程序证实了我的观察结果:与RPC性能相比,请求工厂性能非常糟糕.在开发模式下,RPC的性能大约高出40倍,在生产模式下仍然是4倍.我是第一个注意到性能问题的人吗?
以下屏幕截图显示了测试结果,如果您不想自己尝试.
开发模式下的结果:

生产代码的结果(在app引擎上):

我正在使用GWT,Java和EclipseLink开发Web应用程序.这些选择中的每一个都是我为实现该程序而做出的选择.GWT是唯一没有牢牢把握它与Spring之类的东西相比的选择.现在我使用GWT小部件来实现客户端和GWT RequestFactory来实现EclipseLink中实体的服务器 - 客户端通信.
所以我认为GWT主要是一个小部件库,它有一个简单的服务器 - 客户端通信框架.这与我查看Spring的方式大致相同,Spring是一个小部件库,具有更高级和更复杂的框架,用于控制服务器 - 客户端通信 - 有可能它不像GWT那样方便地实现AJAX.
因此,考虑到这些,我认为GWT是理解并最终与Spring合作的垫脚石.但是,谷歌,荷兰国际集团再次对这个话题,我已经遇到几个主题这样一个那一个,似乎违背原来的概念是什么春天是,和这意味着什么了GWT.
你知道在哪里可以找到新的GWT 2.1 RequestFactory的代码示例吗?谷歌的教程还不够好.
我正在尝试创建一个与Google表单创建页面非常相似的页面.

这就是我尝试使用GWT MVP框架(地点和活动)和编辑器对其进行建模的方式.
CreateFormActivity(活动和演示者)
CreateFormView(用于视图的界面,具有嵌套的Presenter界面)
CreateFormViewImpl(实现CreateFormView和Editor <FormProxy>
CreateFormViewImpl具有以下子编辑器:
QuestionListEditor实现IsEditor <ListEditor <QuestionProxy,QuestionEditor >>
QuestionEditor实现编辑器<QuestionProxy> QuestionEditor具有以下子编辑器:
每种问题类型的编辑器:
TextQuestionEditor
ParagraphTextQuestionEditor
MultipleChoiceQuestionEditor
CheckboxesQuestionEditor
ListQuestionEditor
ScaleQuestionEditor
GridQuestionEditor
问题编辑
public class QuestionDataEditor extends Composite implements
CompositeEditor<QuestionDataProxy, QuestionDataProxy, Editor<QuestionDataProxy>>,
LeafValueEditor<QuestionDataProxy>, HasRequestContext<QuestionDataProxy> {
interface Binder extends UiBinder<Widget, QuestionDataEditor> {}
private CompositeEditor.EditorChain<QuestionDataProxy, Editor<QuestionDataProxy>> chain;
private QuestionBaseDataEditor subEditor …Run Code Online (Sandbox Code Playgroud) 我正在寻找有关如何使用GWT 2.1 Editor框架的一些文档或示例.谷歌的文档是呃,有点缺乏.
从可用的有限文档中,我已经能够理解编辑器(理论上)将允许您更轻松地将GUI元素绑定到数据模型.这将缓解将数据复制到TextArea/ListBox/CheckBox,然后将用户的更改复制回底层模型(最终是数据库)的常见任务.
如果确实能够实现这一目标,那将非常受欢迎.就目前而言,我对如何实施其中任何一个都感到很头疼.任何指向文档或示例的指针都将受到高度赞赏.
我正在使用GWT 2.4和Spring 3.1,我想用Spring Security保护我的应用程序.我一直在寻找一个没有单独的JSP登录页面的GWT解决方案.我发现只有使用JSP进行登录的旧站点,因此该线程可以产生一种解决方案,以标准方式将GWT与Spring Security完全集成.无论如何,如果有一个已成功完成此操作的引用,则可以使用指向该引用的链接关闭该线程.
到目前为止,这是我的第一个方法:
ApplicationContext的-security.xml文件:
<http auto-config="false" use-expressions="true" entry-point-ref="customAuthenticationEntryPoint">
<intercept-url pattern="/ApplicationScaffold.html" access="permitAll" />
<intercept-url pattern="/**" access="hasRole('ROLE_USER')" />
</http>
<beans:bean id="customAuthenticationEntryPoint" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint"
c:loginFormUrl="/ApplicationScaffold.html" />
<!-- Configure Authentication mechanism -->
<authentication-manager alias="authenticationManager">
<authentication-provider>
...
</authentication-provider>
</authentication-manager>
Run Code Online (Sandbox Code Playgroud)
ApplicationScaffold.html(我的应用程序是使用Spring Roo创建的)是包含GWT登录页面的起始页面.
web.xml中:
<display-name>securitytest</display-name>
<description>Roo generated application</description>
<!-- Enable escaping of form submission contents -->
<context-param>
<param-name>defaultHtmlEscape</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:META-INF/spring/applicationContext*.xml</param-value>
</context-param>
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter>
<filter-name>HttpMethodFilter</filter-name> …Run Code Online (Sandbox Code Playgroud) 我正在考虑将基于GWT-RPC的当前服务层迁移到其他地方.它是大约10个服务接口,每个接口有5个方法,涉及大约20个不同的域实体,因此您可以了解更改整个事物所需的工作量,这显然是我想要最小化的.我也使用Gilead和基于Guice的集中式Servlet来处理所有RPC请求.
改变的主要原因是:
我正在考虑的选项是:
RequestFactory,被提升为更快的野兽.但是我担心将域对象的客户端代码中的所有引用替换为它们的代理对应物会是很多工作,而且我也懒得实际构建所有代理.
一个完整的JSON/REST方法使用RestyGWT,看起来它会让我仍然使用域对象,但我担心它最终会导致更慢的反序列化?我不是基于任何事实,但找不到任何基准.这只是一种印象.
我真的很想得到建议.
谢谢!
通过GWT RPC更新对象可以轻松撤消.我们需要在内存中克隆先前的实体状态并在撤消时应用它.
但是当我们使用RequestFactory时,没有具体的更新操作.RequestFactory将实体修改发送到服务器并更新存储库实体本身.我们无法拦截更新过程.
如何对使用RequestFactory进行的更新实现撤消?
在使用GWT requestfactory时,我观察到非常糟糕的性能.例如,将我的服务层花费2秒到fullfil的请求将GWT花费20秒来序列化.我的服务正在返回~100将是EntityProxies.这些对象中的每一个都将成为4个ValueProxies和2个EntityProxies(100个根级EntityProxies,400个ValueProxies和200个额外的EntityProxies).但是,我发现在更小的数据集上,性能降低了10倍.
日志片段示例:
D 2012-10-18 22:42:39.546 ServiceLayerDecorator invoke: Inoking service layer took 2265 ms
D 2012-10-18 22:42:58.957 RequestFactoryServlet doPost: Entire request took 22870 ms
Run Code Online (Sandbox Code Playgroud)
我在ServiceLayerDecorator#invoke方法中添加了一些分析代码,并将整个servlet包装在一个计时器中.我已经自己分析了服务,它确实在~2s内返回结果.
我正在使用GWT 2.4,但已经在GWT 2.5rc1和GWT 2.5rc2上进行了测试.我的后端是GAE,但我不认为这是在这里发挥作用.
我发现这个针对2.4的错误,这似乎是非常相关的.我已经手动应用了这个谷歌群组的补丁而没有任何运气.
我的域名模型如下:
class Trip {
protected Address origin; // becomes ValueProxy
protected Address destination; becomes ValueProxy
protected Set<TripPassenger> tripPassengers; // Set of ValueProxies
}
class TripPassenger {
protected Passenger passenger;
}
class Passenger {
protected Account account;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:
gwt ×10
requestfactory ×10
java ×3
gwt-rpc ×2
performance ×2
spring ×2
gwt-editors ×1
gwt2 ×1
json ×1
login ×1
rpc ×1
undo ×1