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
;
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
) {
31 this.versionId
= versionId
;
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
>() {
44 Thread thread
= new Thread(runnable
) {
47 sleepUninterruptably(THREAD_STARTUP_LATENCY_MS
);
48 DevSocketImplFactory
.setSocketNativeMode(callerNativeMode
);
49 ApiProxy
.setEnvironmentForCurrentThread(environment
);
53 environment
.callRequestEndListeners();
57 System
.setProperty("devappserver-thread-" + thread
.getName(), "true");
63 private void sleepUninterruptably(long sleepMillis
) {
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
);
78 public String
getEmail() {
83 public boolean isLoggedIn() {
88 public boolean isAdmin() {