Skip to content

Commit a628ce3

Browse files
authored
Executor module (#876)
1 parent 03413e6 commit a628ce3

File tree

95 files changed

+230
-118
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

95 files changed

+230
-118
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ dependencies {
145145
return candidates.find { findProject(it) != null }
146146
}
147147

148-
['main', 'logger', 'events', 'events-domain', 'api', 'http-api', 'http', 'fallback', 'backoff', 'tracker', 'submitter'].each { moduleName ->
148+
['main', 'logger', 'executor', 'events', 'events-domain', 'api', 'http-api', 'http', 'fallback', 'backoff', 'tracker', 'submitter'].each { moduleName ->
149149
def resolvedPath = resolveProjectPath(moduleName)
150150
if (resolvedPath != null) {
151151
include project(resolvedPath)

events-domain/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ android {
1616
dependencies {
1717
implementation libs.annotation
1818

19+
api clientModuleProject('executor')
1920
implementation clientModuleProject('api')
2021
implementation clientModuleProject('events')
2122
implementation clientModuleProject('logger')

events-domain/src/main/java/io/split/android/client/service/executor/SplitTaskType.java

Lines changed: 0 additions & 13 deletions
This file was deleted.

executor/.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
/build
2+
.gradle
3+
local.properties
4+
.classpath
5+
.settings

executor/README.md

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
# executor
2+
3+
Generic task scheduling and execution infrastructure for the Split Android SDK.
4+
5+
## Purpose
6+
7+
Provides a pausable task executor with support for scheduled and immediate task execution, parallel task execution with timeout, serial and batch task wrappers, main thread task execution via Android Handler, and pause/resume/stop controls.
8+
9+
## Usage
10+
11+
### Basic Task Execution
12+
13+
```java
14+
SplitTaskExecutor executor = new SplitTaskExecutorImpl();
15+
16+
SplitTask task = () -> {
17+
// Do work
18+
return SplitTaskExecutionInfo.success(SplitTaskType.GENERIC_TASK);
19+
};
20+
21+
executor.submit(task, null);
22+
```
23+
24+
### Scheduled Execution
25+
26+
```java
27+
executor.schedule(
28+
task,
29+
60, // delay in seconds
30+
null // optional listener
31+
);
32+
```
33+
34+
### Parallel Execution
35+
36+
```java
37+
SplitParallelTaskExecutor<Result> parallelExecutor =
38+
new SplitParallelTaskExecutorFactoryImpl().build();
39+
40+
List<Callable<Result>> tasks = Arrays.asList(
41+
() -> fetchData1(),
42+
() -> fetchData2()
43+
);
44+
45+
List<Result> results = parallelExecutor.executeParallelTasks(tasks, 60);
46+
```
47+
48+
### Lifecycle Management
49+
50+
```java
51+
executor.pause(); // Pause scheduled tasks
52+
executor.resume(); // Resume scheduled tasks
53+
executor.stop(); // Stop and shutdown executor
54+
```
55+
56+
## Dependencies
57+
58+
- **logger**: Logging abstraction
59+
- **Android framework**: Handler/Looper for main thread execution
60+
- **AndroidX annotations**: @NonNull, @Nullable, etc.

executor/build.gradle

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
plugins {
2+
id 'com.android.library'
3+
}
4+
5+
apply from: "$projectDir/../gradle/common-android-library.gradle"
6+
7+
android {
8+
namespace 'io.split.android.client.executor'
9+
10+
compileOptions {
11+
sourceCompatibility JavaVersion.VERSION_1_8
12+
targetCompatibility JavaVersion.VERSION_1_8
13+
}
14+
}
15+
16+
dependencies {
17+
implementation libs.annotation
18+
implementation clientModuleProject('logger')
19+
20+
testImplementation libs.junit4
21+
testImplementation libs.mockitoCore
22+
}

main/src/main/java/io/split/android/client/service/executor/SplitBaseTaskExecutor.java renamed to executor/src/main/java/io/split/android/client/service/executor/SplitBaseTaskExecutor.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
package io.split.android.client.service.executor;
22

3-
import static io.split.android.client.utils.Utils.checkArgument;
4-
import static io.split.android.client.utils.Utils.checkNotNull;
5-
63
import android.os.Handler;
74
import android.os.Looper;
85

@@ -12,6 +9,7 @@
129

1310
import java.util.List;
1411
import java.util.Map;
12+
import java.util.Objects;
1513
import java.util.UUID;
1614
import java.util.concurrent.ConcurrentHashMap;
1715
import java.util.concurrent.ScheduledFuture;
@@ -42,8 +40,10 @@ public String schedule(@NonNull SplitTask task,
4240
long periodInSecs,
4341
@Nullable SplitTaskExecutionListener executionListener
4442
) {
45-
checkNotNull(task);
46-
checkArgument(periodInSecs > 0);
43+
Objects.requireNonNull(task);
44+
if (periodInSecs <= 0) {
45+
throw new IllegalArgumentException("periodInSecs must be positive");
46+
}
4747

4848
String taskId = null;
4949
if (!mScheduler.isShutdown()) {
@@ -62,7 +62,7 @@ public String schedule(@NonNull SplitTask task,
6262
long initialDelayInSecs,
6363
@Nullable SplitTaskExecutionListener executionListener
6464
) {
65-
checkNotNull(task);
65+
Objects.requireNonNull(task);
6666
String taskId = null;
6767
if (!mScheduler.isShutdown()) {
6868
ScheduledFuture<?> taskFuture = mScheduler.schedule(
@@ -77,7 +77,7 @@ public String schedule(@NonNull SplitTask task,
7777
@Override
7878
public void submit(@NonNull SplitTask task,
7979
@Nullable SplitTaskExecutionListener executionListener) {
80-
checkNotNull(task);
80+
Objects.requireNonNull(task);
8181
if (!mScheduler.isShutdown()) {
8282
mScheduler.submit(new TaskWrapper(task, executionListener));
8383
}

main/src/main/java/io/split/android/client/service/executor/SplitClientEventTaskExecutor.java renamed to executor/src/main/java/io/split/android/client/service/executor/SplitClientEventTaskExecutor.java

File renamed without changes.

main/src/main/java/io/split/android/client/service/executor/SplitSingleThreadTaskExecutor.java renamed to executor/src/main/java/io/split/android/client/service/executor/SplitSingleThreadTaskExecutor.java

File renamed without changes.

events-domain/src/main/java/io/split/android/client/service/executor/SplitTask.java renamed to executor/src/main/java/io/split/android/client/service/executor/SplitTask.java

File renamed without changes.

0 commit comments

Comments
 (0)