embulk-output-multi 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cb52fdd126c8c9e752f186479dfdd1e8bb60560c
4
- data.tar.gz: fd2f7fa9b9ee60bd2d7aaaa598b9ade60c611abf
3
+ metadata.gz: 40d2c979fbce0853ed920cae18f0f867284e9491
4
+ data.tar.gz: e02bef302e6b8061f9029dc4d7077a00b7563623
5
5
  SHA512:
6
- metadata.gz: 4c8cd6915a54439599fc5a6f6373a6b72c2e678ecfa3ccf02d406a3342f2358b47bfe8b8dbe6661f74a59d622eda60fdd122bca2d5a9b8b95d0eb2d3d4cf6964
7
- data.tar.gz: 16179171d941d670370d374cda08d683fa36e4553422b313b0c1e1db4c6649525c66ef6a466a7a23505cac98c9a086f074ec5ca153d233e34c906e322da51d00
6
+ metadata.gz: ba665f2f4108d65c1cf48ad5a94789e6d719443bb0e8bc7f579f05357407918ab275b41cd55aa96af0ae0854e572427f55039a8502e332c8ab22d6707d6118f9
7
+ data.tar.gz: 7fa76fd0c1a8c06e89b2b0eff90e6b16e00985db269444a37812da6af0f40e3a74a748b00c7e3dfc675b35f7c60875e5f57efd87bf6963eacf57f05cc04a9e79
data/README.md CHANGED
@@ -18,7 +18,6 @@ This plugin can copies an output to multiple destinations.
18
18
  ## Configuration
19
19
 
20
20
  - **outputs**: Configuration of output plugins (array, required)
21
- - **stop_on_failed_output**: Set true if you want to immediately stop outputting of all plugins with a plugin's error (boolean, default "false")
22
21
 
23
22
  ## Example
24
23
 
data/gradle.properties CHANGED
@@ -1 +1 @@
1
- version=0.2.0
1
+ version=0.2.1
@@ -15,7 +15,7 @@ import java.util.concurrent.Executors;
15
15
  import java.util.concurrent.Future;
16
16
  import java.util.concurrent.atomic.AtomicReferenceArray;
17
17
 
18
- class RunControlTask implements Callable<List<TaskReport>> {
18
+ class AsyncRunControl {
19
19
  private static final String THREAD_NAME_FORMAT = "multi-run-control-%d";
20
20
  private final MultiOutputPlugin.PluginTask task;
21
21
  private final OutputPlugin.Control control;
@@ -24,7 +24,11 @@ class RunControlTask implements Callable<List<TaskReport>> {
24
24
  private final ExecutorService executorService;
25
25
  private Future<List<TaskReport>> result;
26
26
 
27
- RunControlTask(MultiOutputPlugin.PluginTask task, OutputPlugin.Control control) {
27
+ static AsyncRunControl start(MultiOutputPlugin.PluginTask task, OutputPlugin.Control control) {
28
+ return new AsyncRunControl(task, control).start();
29
+ }
30
+
31
+ private AsyncRunControl(MultiOutputPlugin.PluginTask task, OutputPlugin.Control control) {
28
32
  this.task = task;
29
33
  this.control = control;
30
34
  this.latch = new CountDownLatch(task.getOutputConfigs().size());
@@ -32,18 +36,6 @@ class RunControlTask implements Callable<List<TaskReport>> {
32
36
  this.executorService = Executors.newSingleThreadExecutor(
33
37
  new ThreadFactoryBuilder().setNameFormat(THREAD_NAME_FORMAT).build()
34
38
  );
35
- this.result = executorService.submit(this);
36
- }
37
-
38
- @Override
39
- public List<TaskReport> call() throws Exception {
40
- latch.await();
41
- List<TaskSource> taskSources = new ArrayList<>(this.taskSources.length());
42
- for (int i = 0; i < this.taskSources.length(); i++) {
43
- taskSources.add(this.taskSources.get(i));
44
- }
45
- task.setTaskSources(taskSources);
46
- return control.run(task.dump());
47
39
  }
48
40
 
49
41
  void cancel() {
@@ -62,4 +54,22 @@ class RunControlTask implements Callable<List<TaskReport>> {
62
54
  executorService.shutdown();
63
55
  }
64
56
  }
57
+
58
+ private AsyncRunControl start() {
59
+ this.result = executorService.submit(new RunControl());
60
+ return this;
61
+ }
62
+
63
+ private class RunControl implements Callable<List<TaskReport>> {
64
+ @Override
65
+ public List<TaskReport> call() throws Exception {
66
+ latch.await();
67
+ List<TaskSource> taskSources = new ArrayList<>(AsyncRunControl.this.taskSources.length());
68
+ for (int i = 0; i < AsyncRunControl.this.taskSources.length(); i++) {
69
+ taskSources.add(AsyncRunControl.this.taskSources.get(i));
70
+ }
71
+ task.setTaskSources(taskSources);
72
+ return control.run(task.dump());
73
+ }
74
+ }
65
75
  }
@@ -48,9 +48,9 @@ public class MultiOutputPlugin implements OutputPlugin {
48
48
  throw new ConfigException("'outputs' must have more than than or equals to 1 element.");
49
49
  }
50
50
  final ExecSession session = Exec.session();
51
- final RunControlTask controlTask = new RunControlTask(task, control);
51
+ final AsyncRunControl runControl = AsyncRunControl.start(task, control);
52
52
  return buildConfigDiff(mapWithPluginDelegate(task, session, delegate ->
53
- delegate.transaction(schema, taskCount, controlTask)
53
+ delegate.transaction(schema, taskCount, runControl)
54
54
  ));
55
55
  }
56
56
 
@@ -58,9 +58,9 @@ public class MultiOutputPlugin implements OutputPlugin {
58
58
  public ConfigDiff resume(TaskSource taskSource, Schema schema, int taskCount, OutputPlugin.Control control) {
59
59
  final PluginTask task = taskSource.loadTask(PluginTask.class);
60
60
  final ExecSession session = Exec.session();
61
- final RunControlTask controlTask = new RunControlTask(task, control);
61
+ final AsyncRunControl runControl = AsyncRunControl.start(task, control);
62
62
  return buildConfigDiff(mapWithPluginDelegate(task, session, delegate ->
63
- delegate.resume(schema, taskCount, controlTask)
63
+ delegate.resume(schema, taskCount, runControl)
64
64
  ));
65
65
  }
66
66
 
@@ -15,6 +15,7 @@ import org.slf4j.LoggerFactory;
15
15
  import java.util.ArrayList;
16
16
  import java.util.List;
17
17
  import java.util.concurrent.CancellationException;
18
+ import java.util.concurrent.ExecutionException;
18
19
  import java.util.concurrent.ExecutorService;
19
20
  import java.util.concurrent.Executors;
20
21
  import java.util.concurrent.Future;
@@ -46,17 +47,17 @@ class OutputPluginDelegate {
46
47
  );
47
48
  }
48
49
 
49
- Future<ConfigDiff> transaction(Schema schema, int taskCount, RunControlTask controlTask) {
50
+ Future<ConfigDiff> transaction(Schema schema, int taskCount, AsyncRunControl runControl) {
50
51
  return executorService.submit(() -> {
51
52
  try {
52
53
  LOGGER.debug("Run #transaction for {}", getPluginCode());
53
- return plugin.transaction(config, schema, taskCount, new ControlDelegate(pluginIndex, controlTask));
54
+ return plugin.transaction(config, schema, taskCount, new Control(pluginIndex, runControl));
54
55
  } catch (CancellationException e) {
55
56
  LOGGER.error("Canceled #transaction for {} by other plugin's error", getPluginCode());
56
57
  throw e;
57
58
  } catch (Exception e) {
58
59
  LOGGER.error("Transaction for {} failed.", getPluginCode(), e);
59
- controlTask.cancel();
60
+ runControl.cancel();
60
61
  throw e;
61
62
  } finally {
62
63
  executorService.shutdown();
@@ -64,17 +65,17 @@ class OutputPluginDelegate {
64
65
  });
65
66
  }
66
67
 
67
- Future<ConfigDiff> resume(Schema schema, int taskCount, RunControlTask controlTask) {
68
+ Future<ConfigDiff> resume(Schema schema, int taskCount, AsyncRunControl runControl) {
68
69
  return executorService.submit(() -> {
69
70
  try {
70
71
  LOGGER.debug("Run #resume for {}", getPluginCode());
71
- return plugin.resume(taskSource, schema, taskCount, new ControlDelegate(pluginIndex, controlTask));
72
+ return plugin.resume(taskSource, schema, taskCount, new Control(pluginIndex, runControl));
72
73
  } catch (CancellationException e) {
73
74
  LOGGER.error("Canceled #resume for {} by other plugin's error", getPluginCode());
74
75
  throw e;
75
76
  } catch (Exception e) {
76
77
  LOGGER.error("Resume for {} failed.", getPluginCode(), e);
77
- controlTask.cancel();
78
+ runControl.cancel();
78
79
  throw e;
79
80
  } finally {
80
81
  executorService.shutdown();
@@ -108,4 +109,35 @@ class OutputPluginDelegate {
108
109
  private static String generatePluginCode(PluginType type, int pluginIndex) {
109
110
  return String.format("%s-%d", type.getName(), pluginIndex);
110
111
  }
112
+
113
+ private static class Control implements OutputPlugin.Control {
114
+ private final int pluginIndex;
115
+ private final AsyncRunControl runControl;
116
+
117
+ Control(int index, AsyncRunControl runControl) {
118
+ this.pluginIndex = index;
119
+ this.runControl = runControl;
120
+ }
121
+
122
+ @Override
123
+ public List<TaskReport> run(TaskSource taskSource) {
124
+ runControl.addTaskSource(pluginIndex, taskSource);
125
+ List<TaskReport> reports;
126
+ try {
127
+ reports = runControl.waitAndGetResult();
128
+ } catch (InterruptedException e) {
129
+ Thread.currentThread().interrupt();
130
+ throw new RuntimeException(e);
131
+ } catch (ExecutionException e) {
132
+ throw new RuntimeException(e.getCause());
133
+ }
134
+
135
+ final List<TaskReport> result = new ArrayList<>();
136
+ for (TaskReport taskReport : reports) {
137
+ final TaskReport report = taskReport.get(TaskReports.class, MultiOutputPlugin.CONFIG_NAME_OUTPUT_TASK_REPORTS).get(pluginIndex);
138
+ result.add(report);
139
+ }
140
+ return result;
141
+ }
142
+ }
111
143
  }
@@ -82,8 +82,7 @@ class TransactionalPageOutputDelegate {
82
82
  @Override
83
83
  public TaskReport call() throws InterruptedException {
84
84
  while (true) {
85
- final Supplier<Object> task = taskQueue.take();
86
- final Object result = task.get();
85
+ final Object result = taskQueue.take().get();
87
86
  if (result instanceof TaskReport) {
88
87
  return (TaskReport) result;
89
88
  }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: embulk-output-multi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shinichi ISHIMURA
@@ -50,7 +50,7 @@ files:
50
50
  - LICENSE
51
51
  - README.md
52
52
  - build.gradle
53
- - classpath/embulk-output-multi-0.2.0.jar
53
+ - classpath/embulk-output-multi-0.2.1.jar
54
54
  - gradle.properties
55
55
  - gradle/dependency-locks/compileClasspath.lockfile
56
56
  - gradle/dependency-locks/testCompileClasspath.lockfile
@@ -60,11 +60,10 @@ files:
60
60
  - gradlew.bat
61
61
  - lib/embulk/output/multi.rb
62
62
  - settings.gradle
63
- - src/main/java/org/embulk/output/multi/ControlDelegate.java
63
+ - src/main/java/org/embulk/output/multi/AsyncRunControl.java
64
64
  - src/main/java/org/embulk/output/multi/MultiOutputPlugin.java
65
65
  - src/main/java/org/embulk/output/multi/OutputPluginDelegate.java
66
66
  - src/main/java/org/embulk/output/multi/PluginExecutionException.java
67
- - src/main/java/org/embulk/output/multi/RunControlTask.java
68
67
  - src/main/java/org/embulk/output/multi/TaskReports.java
69
68
  - src/main/java/org/embulk/output/multi/TransactionalPageOutputDelegate.java
70
69
  - src/test/java/org/embulk/output/multi/TestMultiOutputPlugin.java
@@ -1,40 +0,0 @@
1
- package org.embulk.output.multi;
2
-
3
- import org.embulk.config.TaskReport;
4
- import org.embulk.config.TaskSource;
5
- import org.embulk.spi.OutputPlugin;
6
-
7
- import java.util.ArrayList;
8
- import java.util.List;
9
- import java.util.concurrent.ExecutionException;
10
-
11
- class ControlDelegate implements OutputPlugin.Control {
12
- private final int pluginIndex;
13
- private final RunControlTask controlTask;
14
-
15
- ControlDelegate(int index, RunControlTask controlTask) {
16
- this.pluginIndex = index;
17
- this.controlTask = controlTask;
18
- }
19
-
20
- @Override
21
- public List<TaskReport> run(TaskSource taskSource) {
22
- controlTask.addTaskSource(pluginIndex, taskSource);
23
- List<TaskReport> reports;
24
- try {
25
- reports = controlTask.waitAndGetResult();
26
- } catch (InterruptedException e) {
27
- Thread.currentThread().interrupt();
28
- throw new RuntimeException(e);
29
- } catch (ExecutionException e) {
30
- throw new RuntimeException(e.getCause());
31
- }
32
-
33
- final List<TaskReport> result = new ArrayList<>();
34
- for (TaskReport taskReport : reports) {
35
- final TaskReport report = taskReport.get(TaskReports.class, MultiOutputPlugin.CONFIG_NAME_OUTPUT_TASK_REPORTS).get(pluginIndex);
36
- result.add(report);
37
- }
38
- return result;
39
- }
40
- }