Revision created by MOE tool push_codebase.
[gae.git] / java / src / main / com / google / appengine / tools / development / BackgroundThreadFactory.java
blobfdec9407d9932fb13f3c3fc7674fd718a9934d7b
1 // Copyright 2011 Google Inc. All Rights Reserved.
3 package com.google.appengine.tools.development;
5 import com.google.apphosting.api.ApiProxy;
7 import java.security.AccessController;
8 import java.security.PrivilegedAction;
9 import java.util.concurrent.ThreadFactory;
10 import java.util.logging.Level;
11 import java.util.logging.Logger;
13 /**
14 * This {@link ThreadFactory} creates {@link Thread} objects that
15 * live independent of the current request. This means that they
16 * receive their own {@code LocalEnvironment} and have their own set
17 * of request ID and {@link RequestEndListener} objects.
20 public class BackgroundThreadFactory implements ThreadFactory {
21 private static final Logger logger = Logger.getLogger(BackgroundThreadFactory.class.getName());
23 private static final int API_CALL_LATENCY_MS = 20;
24 private static final int THREAD_STARTUP_LATENCY_MS = 20;
26 private final String appId;
27 private final String versionId;
29 public BackgroundThreadFactory(String appId, String versionId) {
30 this.appId = appId;
31 this.versionId = versionId;
34 @Override
35 public Thread newThread(final Runnable runnable) {
36 final LocalBackgroundEnvironment environment = new LocalBackgroundEnvironment(appId, versionId);
38 final boolean callerNativeMode = DevSocketImplFactory.isNativeSocketMode();
40 sleepUninterruptably(API_CALL_LATENCY_MS);
41 return AccessController.doPrivileged(new PrivilegedAction<Thread>() {
42 @Override
43 public Thread run() {
44 Thread thread = new Thread(runnable) {
45 @Override
46 public void run() {
47 sleepUninterruptably(THREAD_STARTUP_LATENCY_MS);
48 DevSocketImplFactory.setSocketNativeMode(callerNativeMode);
49 ApiProxy.setEnvironmentForCurrentThread(environment);
50 try {
51 runnable.run();
52 } finally {
53 environment.callRequestEndListeners();
57 System.setProperty("devappserver-thread-" + thread.getName(), "true");
58 return thread;
60 });
63 private void sleepUninterruptably(long sleepMillis) {
64 try {
65 Thread.sleep(sleepMillis);
66 } catch (InterruptedException ex) {
67 logger.log(Level.INFO, "Interrupted simulating latency:", ex);
68 Thread.currentThread().interrupt();
72 private static class LocalBackgroundEnvironment extends LocalEnvironment {
73 public LocalBackgroundEnvironment(String appId, String majorVersionId) {
74 super(appId, majorVersionId);
77 @Override
78 public String getEmail() {
79 return null;
82 @Override
83 public boolean isLoggedIn() {
84 return false;
87 @Override
88 public boolean isAdmin() {
89 return false;