I took the plunge and started moving our codebase over to deRPC. It's pretty
simple to get bootstrapped, though there's some deployment work we needed to do
to ensure that our .gwt.rpc files are made available to the backends.
I'm storing our history of .gwt.rpc files in S3, since we're already pushing
files like this into S3 during our deployment. It was trivial to hook up the
findClientOracleData to work with the existing process (though we're currently
gzipping the already-gzipped policy files):
@Override
protected InputStream findClientOracleData(String requestModuleBasePath, String
permutationStrongName) throws SerializationException {
try {
return new GZIPInputStream(
new URL("http://s3-bucket-name.amazonaws.com/"
+ permutationStrongName + ".gwt.rpc.gz").openStream());
} catch (MalformedURLException e) {
throw new SerializationException(e);
} catch (IOException e) {
throw new SerializationException(e);
}
}
I ran into a few small issues while developing this:
- NPE in the WebModeClientOracle.readStreamAsObject finally block if
objectInputStream can't be created (ie: if the format is invalid)
- If the GWT module base path URL isn't absolute, getRequestModuleBasePath
fails. We use relative base paths to simplify our hosted mode development.
- WebModePayloadSink seems to throw an NPE when push a null constructorIdent.
I'm still digging into this, but it might be related to the fact that we're
sending enums with enum value methods across the wire:
String constructorIdent = clientOracle.getMethodId(x.getTargetClass(),
constructorMethodName, x.getTargetClass());
assert constructorIdent != null : "constructorIdent "
+ constructorMethodName;
// constructor(new Seed),
push(constructorIdent);
RpcServlet is much nicer to work with that RemoveServiceServlet, kudos. It
would be nice if the service object (passed into decodeRequest and
invokeAndStreamResponse) were retrieved via a protected method, rather than
assumed to be 'this'. We wire the service object into the servlet at
configuration time via Spring, so I had to duplicate the contents of
processCall.
Overall we saw a small decrease in the initial code fragment (~5%). I didn't
notice any particular slowness while testing.
Matt.
--
http://groups.google.com/group/Google-Web-Toolkit-Contributors