Created
December 7, 2009 16:55
-
-
Save WdWeaver/250924 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package testlib; | |
import java.io.IOException; | |
import java.util.concurrent.Future; | |
import java.util.logging.Logger; | |
import javax.servlet.ServletException; | |
import javax.servlet.http.HttpServlet; | |
import javax.servlet.http.HttpServletRequest; | |
import javax.servlet.http.HttpServletResponse; | |
import com.google.appengine.api.datastore.DatastoreService; | |
import com.google.appengine.api.datastore.DatastoreServiceFactory; | |
import com.google.appengine.api.datastore.Entity; | |
import com.google.appengine.api.datastore.Key; | |
import com.google.appengine.api.datastore.KeyRange; | |
import com.google.apphosting.api.ApiProxy; | |
import com.google.apphosting.api.ApiProxy.ApiConfig; | |
import com.google.apphosting.api.ApiProxy.ApiProxyException; | |
import com.google.apphosting.api.ApiProxy.Delegate; | |
import com.google.apphosting.api.ApiProxy.Environment; | |
import com.google.apphosting.api.ApiProxy.LogRecord; | |
import com.google.apphosting.api.DatastorePb.PutRequest; | |
import com.google.apphosting.api.DatastorePb.PutResponse; | |
public class MakeAsyncCallTestServlet extends HttpServlet { | |
private static final long serialVersionUID = 1L; | |
Logger logger = Logger.getLogger(MakeAsyncCallTestServlet.class.getName()); | |
@Override | |
protected void service(HttpServletRequest request, HttpServletResponse response) | |
throws ServletException, IOException { | |
Delegate<Environment> base = ApiProxy.getDelegate(); | |
ApiProxy.setDelegate(new MyDelegate(base)); | |
DatastoreService svc = DatastoreServiceFactory.getDatastoreService(); | |
KeyRange range = svc.allocateIds("testdata", 100); | |
long b4 = System.currentTimeMillis(); | |
for(Key key: range) { | |
Entity entity = new Entity(key); | |
entity.setProperty("testfield", key.getId()); | |
svc.put(entity); | |
} | |
response.getWriter().write(String.format("put time with makeAsyncCall: %d",System.currentTimeMillis() - b4)); | |
ApiProxy.setDelegate(base); | |
} | |
public class MyDelegate implements Delegate<Environment> { | |
Delegate<Environment> base; | |
MyDelegate(Delegate<Environment> base) { | |
this.base = base; | |
} | |
public void log(Environment env, LogRecord log) { | |
base.log(env,log); | |
} | |
public Future<byte[]> makeAsyncCall(Environment env, String pkg, | |
String method, byte[] data, ApiConfig config) { | |
return base.makeAsyncCall(env, pkg, method, data, config); | |
} | |
public byte[] makeSyncCall(Environment env, String pkg, String method, | |
byte[] data) throws ApiProxyException { | |
if("datastore_v3".equalsIgnoreCase(pkg)&&"Put".equalsIgnoreCase(method)) { | |
PutRequest request = new PutRequest(); | |
request.mergeFrom(data); | |
ApiConfig config = new ApiConfig(); | |
config.setDeadlineInSeconds(10.0); | |
Future<byte[]> responses = makeAsyncCall(env,pkg,method,data,config); | |
try { | |
PutResponse response = new PutResponse(); | |
response.addKey(request.getEntity(0).getKey()); | |
return response.toByteArray(); | |
} catch (Exception e) { | |
throw new ApiProxyException(e.getMessage()); | |
} | |
} else { | |
byte[] response = base.makeSyncCall(env, pkg, method, data); | |
return response; | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment