-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathDestroyer.java
More file actions
128 lines (122 loc) · 5.43 KB
/
Destroyer.java
File metadata and controls
128 lines (122 loc) · 5.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package io.split.android.client;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.Lock;
import io.split.android.client.factory.FactoryMonitor;
import io.split.android.client.impressions.ImpressionListener;
import io.split.android.client.lifecycle.SplitLifecycleManager;
import io.split.android.client.network.HttpClient;
import io.split.android.client.service.executor.SplitTaskExecutor;
import io.split.android.client.service.synchronizer.SyncManager;
import io.split.android.client.shared.SplitClientContainer;
import io.split.android.client.storage.common.SplitStorageContainer;
import io.split.android.client.telemetry.TelemetrySynchronizer;
import io.split.android.client.utils.logger.Logger;
class Destroyer implements Runnable {
// Lock to prevent concurrent shutdowns and ensure sequence
private final Lock mInitLock;
// Whe
private final AtomicBoolean mCheckClients;
private final SplitClientContainer mClientContainer;
private final SplitStorageContainer mStorageContainer;
private final long mInitStartTime;
private final TelemetrySynchronizer mTelemetrySynchronizer;
private final ExecutorService mImpressionsLoggingTaskExecutor;
private final ExecutorService mImpressionsObserverExecutor;
private final SyncManager mSyncManager;
private final SplitLifecycleManager mLifecycleManager;
private final FactoryMonitor mFactoryMonitor;
private final String mApiKey;
private final ImpressionListener mCustomerImpressionListener;
private final HttpClient mDefaultHttpClient;
private final SplitManager mSplitManager;
private final SplitTaskExecutor mSplitTaskExecutor;
private final SplitTaskExecutor mSplitSingleThreadTaskExecutor;
private final AtomicBoolean mIsTerminated;
Destroyer(
Lock initLock,
AtomicBoolean checkClients,
SplitClientContainer clientContainer,
SplitStorageContainer storageContainer,
long initStartTime,
TelemetrySynchronizer telemetrySynchronizer,
ExecutorService impressionsLoggingTaskExecutor,
ExecutorService impressionsObserverExecutor,
SyncManager syncManager,
SplitLifecycleManager lifecycleManager,
FactoryMonitor factoryMonitor,
String apiKey,
ImpressionListener customerImpressionListener,
HttpClient defaultHttpClient,
SplitManager splitManager,
SplitTaskExecutor splitTaskExecutor,
SplitTaskExecutor splitSingleThreadTaskExecutor,
AtomicBoolean isTerminated
) {
mInitLock = initLock;
mCheckClients = checkClients;
mClientContainer = clientContainer;
mStorageContainer = storageContainer;
mInitStartTime = initStartTime;
mTelemetrySynchronizer = telemetrySynchronizer;
mImpressionsLoggingTaskExecutor = impressionsLoggingTaskExecutor;
mImpressionsObserverExecutor = impressionsObserverExecutor;
mSyncManager = syncManager;
mLifecycleManager = lifecycleManager;
mFactoryMonitor = factoryMonitor;
mApiKey = apiKey;
mCustomerImpressionListener = customerImpressionListener;
mDefaultHttpClient = defaultHttpClient;
mSplitManager = splitManager;
mSplitTaskExecutor = splitTaskExecutor;
mSplitSingleThreadTaskExecutor = splitSingleThreadTaskExecutor;
mIsTerminated = isTerminated;
}
@Override
public void run() {
mInitLock.lock();
try {
if (mCheckClients.get() && !mClientContainer.getAll().isEmpty()) {
Logger.d("Avoiding shutdown due to active clients");
return;
}
Logger.w("Shutdown called for split");
mStorageContainer
.getTelemetryStorage()
.recordSessionLength(
System.currentTimeMillis() - mInitStartTime
);
mTelemetrySynchronizer.flush();
mTelemetrySynchronizer.destroy();
Logger.d("Successful shutdown of telemetry");
mImpressionsLoggingTaskExecutor.shutdown();
mImpressionsObserverExecutor.shutdown();
Logger.d("Successful shutdown of impressions logging executor");
mSyncManager.stop();
Logger.d("Flushing impressions and events");
mLifecycleManager.destroy();
mClientContainer.destroy();
Logger.d("Successful shutdown of lifecycle manager");
mFactoryMonitor.remove(mApiKey);
Logger.d("Successful shutdown of segment fetchers");
mCustomerImpressionListener.close();
Logger.d("Successful shutdown of ImpressionListener");
mDefaultHttpClient.close();
Logger.d("Successful shutdown of httpclient");
mSplitManager.destroy();
Logger.d("Successful shutdown of manager");
mSplitTaskExecutor.stop();
mSplitSingleThreadTaskExecutor.stop();
Logger.d("Successful shutdown of task executor");
mStorageContainer.getAttributesStorageContainer().destroy();
Logger.d("Successful shutdown of attributes storage");
mIsTerminated.set(true);
Logger.d("SplitFactory has been destroyed");
} catch (Exception e) {
Logger.e(e, "We could not shutdown split");
} finally {
mCheckClients.set(false);
mInitLock.unlock();
}
}
}