提交 6f0d880a 编写于 作者: S serge-rider

#2372 Task execution framework


Former-commit-id: cab10e4c
上级 5bd1930f
......@@ -16,14 +16,9 @@
*/
package org.jkiss.dbeaver.tools.transfer.ui.wizard;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.IWizardContainer;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IExportWizard;
import org.eclipse.ui.IImportWizard;
import org.eclipse.ui.IWorkbench;
......@@ -35,7 +30,6 @@ import org.jkiss.dbeaver.model.runtime.DBRRunnableContext;
import org.jkiss.dbeaver.model.struct.DBSObject;
import org.jkiss.dbeaver.model.task.DBTTask;
import org.jkiss.dbeaver.runtime.DBWorkbench;
import org.jkiss.dbeaver.runtime.ui.DBPPlatformUI;
import org.jkiss.dbeaver.tools.transfer.*;
import org.jkiss.dbeaver.tools.transfer.internal.DTMessages;
import org.jkiss.dbeaver.tools.transfer.registry.DataTransferNodeDescriptor;
......@@ -49,11 +43,9 @@ import org.jkiss.dbeaver.tools.transfer.ui.registry.DataTransferPageType;
import org.jkiss.dbeaver.ui.DialogSettingsMap;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.task.TaskConfigurationWizard;
import org.jkiss.dbeaver.utils.RuntimeUtils;
import org.jkiss.utils.ArrayUtils;
import org.jkiss.utils.CommonUtils;
import java.lang.reflect.InvocationTargetException;
import java.util.*;
public class DataTransferWizard extends TaskConfigurationWizard implements IExportWizard, IImportWizard {
......@@ -83,17 +75,19 @@ public class DataTransferWizard extends TaskConfigurationWizard implements IExpo
private Map<Class, NodePageSettings> nodeSettings = new LinkedHashMap<>();
DataTransferWizard(@NotNull DBRRunnableContext runnableContext, DBTTask task) {
this(
runnableContext,
getNodesFromLocation(runnableContext, task, "producers", IDataTransferProducer.class),
getNodesFromLocation(runnableContext, task, "consumers", IDataTransferConsumer.class),
task);
super(task);
this.settings = new DataTransferSettings(runnableContext, task);
loadSettings(runnableContext);
}
DataTransferWizard(@NotNull DBRRunnableContext runnableContext, @Nullable Collection<IDataTransferProducer> producers, @Nullable Collection<IDataTransferConsumer> consumers, @Nullable DBTTask task) {
super(task);
this.settings = new DataTransferSettings(producers, consumers);
loadSettings(runnableContext);
}
private void loadSettings(@NotNull DBRRunnableContext runnableContext) {
setDialogSettings(
UIUtils.getSettingsSection(
DTUIActivator.getDefault().getDialogSettings(),
......@@ -104,20 +98,20 @@ public class DataTransferWizard extends TaskConfigurationWizard implements IExpo
Collection<DBSObject> objectTypes = settings.getSourceObjects();
List<DataTransferNodeDescriptor> nodes = new ArrayList<>();
DataTransferRegistry registry = DataTransferRegistry.getInstance();
if (CommonUtils.isEmpty(producers)) {
if (ArrayUtils.isEmpty(settings.getInitProducers())) {
nodes.addAll(registry.getAvailableProducers(objectTypes));
} else {
for (IDataTransferProducer source : producers) {
for (IDataTransferProducer source : settings.getInitProducers()) {
DataTransferNodeDescriptor node = registry.getNodeByType(source.getClass());
if (node != null && !nodes.contains(node)) {
nodes.add(node);
}
}
}
if (CommonUtils.isEmpty(consumers)) {
if (ArrayUtils.isEmpty(settings.getInitConsumers())) {
nodes.addAll(registry.getAvailableConsumers(objectTypes));
} else {
for (IDataTransferConsumer target : consumers) {
for (IDataTransferConsumer target : settings.getInitConsumers()) {
DataTransferNodeDescriptor node = registry.getNodeByType(target.getClass());
if (node != null && !nodes.contains(node)) {
nodes.add(node);
......@@ -130,7 +124,7 @@ public class DataTransferWizard extends TaskConfigurationWizard implements IExpo
}
}
Map<String, Object> configuration = task == null ? null : JSONUtils.getObject(task.getProperties(), "configuration");
Map<String, Object> configuration = getCurrentTask() == null ? null : JSONUtils.getObject(getCurrentTask().getProperties(), "configuration");
if (configuration != null) {
loadConfiguration(runnableContext, configuration);
} else {
......@@ -246,30 +240,14 @@ public class DataTransferWizard extends TaskConfigurationWizard implements IExpo
saveSettings();
DTUIActivator.getDefault().saveDialogSettings();
// Start consumers
DataTransferWizardExecutor executor = new DataTransferWizardExecutor(getRunnableContext(), getSettings());
try {
UIUtils.run(getContainer(), true, true, monitor -> {
try {
List<DataTransferPipe> dataPipes = settings.getDataPipes();
for (int i = 0; i < dataPipes.size(); i++) {
DataTransferPipe pipe = dataPipes.get(i);
pipe.initPipe(getSettings(), i, dataPipes.size());
pipe.getConsumer().startTransfer(monitor);
}
} catch (DBException e) {
throw new InvocationTargetException(e);
}
});
} catch (InvocationTargetException e) {
DBWorkbench.getPlatformUI().showError("Transfer init failed", "Can't start data transfer", e.getTargetException());
return false;
} catch (InterruptedException e) {
executor.executeTask();
} catch (DBException e) {
DBWorkbench.getPlatformUI().showError(e.getMessage(), "Can't init data transfer", e);
return false;
}
// Run export jobs
executeJobs();
// Done
return true;
}
......@@ -290,44 +268,6 @@ public class DataTransferWizard extends TaskConfigurationWizard implements IExpo
saveConfiguration(dialogSettings);
}
private void executeJobs() {
// Schedule jobs for data providers
int totalJobs = settings.getDataPipes().size();
if (totalJobs > settings.getMaxJobCount()) {
totalJobs = settings.getMaxJobCount();
}
for (int i = 0; i < totalJobs; i++) {
DataTransferJob job = new DataTransferJob(settings);
job.addJobChangeListener(new JobChangeAdapter() {
@Override
public void done(IJobChangeEvent event) {
// Run async to avoid blocking progress monitor dialog
UIUtils.asyncExec(() -> {
// Make a sound
Display.getCurrent().beep();
// Notify agent
long time = job.getElapsedTime();
boolean hasErrors = job.isHasErrors();
DBPPlatformUI platformUI = DBWorkbench.getPlatformUI();
if (time > platformUI.getLongOperationTimeout() * 1000) {
platformUI.notifyAgent(
"Data transfer completed", !hasErrors ? IStatus.INFO : IStatus.ERROR);
}
if (settings.isShowFinalMessage() && !hasErrors) {
// Show message box
UIUtils.showMessageBox(
null,
DTMessages.data_transfer_wizard_name,
"Data transfer completed (" + RuntimeUtils.formatExecutionTime(time) + ")",
SWT.ICON_INFORMATION);
}
});
}
});
job.schedule();
}
}
private void addNodeSettings(DataTransferNodeDescriptor node) {
if (node == null) {
return;
......@@ -506,23 +446,6 @@ public class DataTransferWizard extends TaskConfigurationWizard implements IExpo
}
}
private static <T> List<T> getNodesFromLocation(@NotNull DBRRunnableContext runnableContext, DBTTask task, String nodeType, Class<T> nodeClass) {
Map<String, Object> config = task.getProperties();
List<T> result = new ArrayList<>();
Object nodeList = config.get(nodeType);
if (nodeList instanceof Collection) {
for (Object nodeObj : (Collection)nodeList) {
if (nodeObj instanceof Map) {
Object node = JSONUtils.deserializeObject(runnableContext, task, (Map<String, Object>) nodeObj);
if (nodeClass.isInstance(node)) {
result.add(nodeClass.cast(node));
}
}
}
}
return result;
}
public void saveTaskState(Map<String, Object> state) {
List<IDataTransferNode> producers = new ArrayList<>();
List<IDataTransferNode> consumers = new ArrayList<>();
......
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2019 Serge Rider (serge@jkiss.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jkiss.dbeaver.tools.transfer.ui.wizard;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.runtime.AbstractJob;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.DBRRunnableContext;
import org.jkiss.dbeaver.model.runtime.DBRRunnableWithProgress;
import org.jkiss.dbeaver.model.task.DBTTaskExecutionListener;
import org.jkiss.dbeaver.runtime.DBWorkbench;
import org.jkiss.dbeaver.runtime.ui.DBPPlatformUI;
import org.jkiss.dbeaver.tools.transfer.DataTransferSettings;
import org.jkiss.dbeaver.tools.transfer.internal.DTMessages;
import org.jkiss.dbeaver.tools.transfer.task.DTTaskHandlerTransfer;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.utils.GeneralUtils;
import org.jkiss.dbeaver.utils.RuntimeUtils;
import java.lang.reflect.InvocationTargetException;
import java.util.Locale;
class DataTransferWizardExecutor implements DBRRunnableContext, DBTTaskExecutionListener {
private static final Log log = Log.getLog(DataTransferWizard.class);
private DBRRunnableContext staticContext;
private DataTransferSettings settings;
private long startTime;
private boolean started;
public DataTransferWizardExecutor(DBRRunnableContext staticContext, DataTransferSettings settings) {
this.staticContext = staticContext;
this.settings = settings;
}
void executeTask() throws DBException {
startTime = System.currentTimeMillis();
DTTaskHandlerTransfer handlerTransfer = new DTTaskHandlerTransfer();
handlerTransfer.executeWithSettings(this, Locale.getDefault(), log, this, settings);
}
@Override
public void taskStarted(@NotNull Object task) {
this.started = true;
}
@Override
public void taskFinished(@NotNull Object task, @Nullable Throwable error) {
this.started = false;
UIUtils.asyncExec(() -> {
// Make a sound
Display.getCurrent().beep();
// Notify agent
long time = System.currentTimeMillis() - startTime;
boolean hasErrors = error != null;
DBPPlatformUI platformUI = DBWorkbench.getPlatformUI();
if (time > platformUI.getLongOperationTimeout() * 1000) {
platformUI.notifyAgent(
"Data transfer completed", !hasErrors ? IStatus.INFO : IStatus.ERROR);
}
if (settings.isShowFinalMessage() && !hasErrors) {
// Show message box
UIUtils.showMessageBox(
null,
DTMessages.data_transfer_wizard_name,
"Data transfer completed (" + RuntimeUtils.formatExecutionTime(time) + ")",
SWT.ICON_INFORMATION);
}
});
}
@Override
public void subTaskFinished(@Nullable Throwable error) {
}
@Override
public void run(boolean fork, boolean cancelable, DBRRunnableWithProgress runnable) throws InvocationTargetException, InterruptedException {
if (!started) {
staticContext.run(false, true, runnable);
} else {
new AbstractJob(DTMessages.data_transfer_wizard_job_name) {
@Override
protected IStatus run(DBRProgressMonitor monitor) {
try {
runnable.run(monitor);
} catch (InvocationTargetException e) {
return GeneralUtils.makeErrorStatus("Error running data transfer", e.getTargetException());
} catch (InterruptedException e) {
return Status.CANCEL_STATUS;
}
return Status.OK_STATUS;
}
}.schedule();
}
}
}
\ No newline at end of file
......@@ -13,6 +13,7 @@ Export-Package: org.jkiss.dbeaver.tools.transfer,
org.jkiss.dbeaver.tools.transfer.stream,
org.jkiss.dbeaver.tools.transfer.stream.exporter,
org.jkiss.dbeaver.tools.transfer.stream.importer,
org.jkiss.dbeaver.tools.transfer.task,
org.jkiss.dbeaver.tools.transfer.internal
Require-Bundle: org.eclipse.core.runtime,
org.eclipse.core.expressions,
......
......@@ -16,30 +16,37 @@
*/
package org.jkiss.dbeaver.tools.transfer;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.osgi.util.NLS;
import org.jkiss.dbeaver.model.runtime.AbstractJob;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.runtime.DBWorkbench;
import org.jkiss.dbeaver.model.runtime.DBRRunnableWithProgress;
import org.jkiss.dbeaver.model.task.DBTTaskExecutionListener;
import org.jkiss.dbeaver.tools.transfer.internal.DTMessages;
import org.jkiss.utils.CommonUtils;
import java.lang.reflect.InvocationTargetException;
import java.util.Locale;
/**
* Data transfer job
*/
public class DataTransferJob extends AbstractJob {
public class DataTransferJob implements DBRRunnableWithProgress {
private DataTransferSettings settings;
private long elapsedTime;
private boolean hasErrors;
public DataTransferJob(DataTransferSettings settings)
private Locale locale;
private Log log;
private DBTTaskExecutionListener listener;
public DataTransferJob(DataTransferSettings settings, Locale locale, Log log, DBTTaskExecutionListener listener)
{
super(DTMessages.data_transfer_wizard_job_name);
this.settings = settings;
setUser(true);
this.locale = locale;
this.log = log;
this.listener = listener;
}
public DataTransferSettings getSettings() {
......@@ -55,39 +62,41 @@ public class DataTransferJob extends AbstractJob {
}
@Override
public boolean belongsTo(Object family)
{
return family == settings;
}
@Override
protected IStatus run(DBRProgressMonitor monitor)
{
public void run(DBRProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
hasErrors = false;
long startTime = System.currentTimeMillis();
for (; ;) {
if (monitor.isCanceled()) {
break;
}
DataTransferPipe transferPipe = settings.acquireDataPipe(monitor);
if (transferPipe == null) {
break;
}
if (!transferData(monitor, transferPipe)) {
hasErrors = true;
try {
if (!transferData(monitor, transferPipe)) {
hasErrors = true;
}
} catch (DBException e) {
listener.subTaskFinished(e);
throw new InvocationTargetException(e);
}
}
listener.subTaskFinished(null);
elapsedTime = System.currentTimeMillis() - startTime;
return Status.OK_STATUS;
}
private boolean transferData(DBRProgressMonitor monitor, DataTransferPipe transferPipe)
private boolean transferData(DBRProgressMonitor monitor, DataTransferPipe transferPipe) throws DBException
{
IDataTransferProducer producer = transferPipe.getProducer();
IDataTransferConsumer consumer = transferPipe.getConsumer();
IDataTransferSettings consumerSettings = settings.getNodeSettings(settings.getConsumer());
//IDataTransferSettings consumerSettings = settings.getNodeSettings(settings.getConsumer());
setName(NLS.bind(DTMessages.data_transfer_wizard_job_container_name,
CommonUtils.truncateString(producer.getObjectName(), 200),
CommonUtils.truncateString(consumer.getObjectName(), 200)));
monitor.beginTask(
NLS.bind(DTMessages.data_transfer_wizard_job_container_name,
CommonUtils.truncateString(producer.getObjectName(), 200),
CommonUtils.truncateString(consumer.getObjectName(), 200)), 1);
IDataTransferSettings nodeSettings = settings.getNodeSettings(settings.getProducer());
try {
......@@ -105,8 +114,10 @@ public class DataTransferJob extends AbstractJob {
}
return true;
} catch (Exception e) {
DBWorkbench.getPlatformUI().showError("Data export error", e.getMessage(), e);
return false;
log.error("Error transfering data from " + producer.getObjectName() + " to " + consumer.getObjectName(), e);
throw new DBException("Data transfer error", e);
} finally {
monitor.done();
}
}
......
......@@ -16,11 +16,15 @@
*/
package org.jkiss.dbeaver.tools.transfer;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.data.json.JSONUtils;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.DBRRunnableContext;
import org.jkiss.dbeaver.model.struct.DBSObject;
import org.jkiss.dbeaver.model.task.DBTTask;
import org.jkiss.dbeaver.runtime.DBWorkbench;
import org.jkiss.dbeaver.tools.transfer.registry.DataTransferNodeDescriptor;
import org.jkiss.dbeaver.tools.transfer.registry.DataTransferProcessorDescriptor;
......@@ -127,6 +131,13 @@ public class DataTransferSettings {
}
}
public DataTransferSettings(DBRRunnableContext runnableContext, DBTTask task) {
this(
getNodesFromLocation(runnableContext, task, "producers", IDataTransferProducer.class),
getNodesFromLocation(runnableContext, task, "consumers", IDataTransferConsumer.class)
);
}
public boolean isConsumerOptional() {
return consumerOptional;
}
......@@ -135,7 +146,7 @@ public class DataTransferSettings {
return producerOptional;
}
public IDataTransferNode[] getInitProducers() {
public IDataTransferProducer[] getInitProducers() {
return initProducers;
}
......@@ -328,4 +339,21 @@ public class DataTransferSettings {
}
private static <T> List<T> getNodesFromLocation(@NotNull DBRRunnableContext runnableContext, DBTTask task, String nodeType, Class<T> nodeClass) {
Map<String, Object> config = task.getProperties();
List<T> result = new ArrayList<>();
Object nodeList = config.get(nodeType);
if (nodeList instanceof Collection) {
for (Object nodeObj : (Collection)nodeList) {
if (nodeObj instanceof Map) {
Object node = JSONUtils.deserializeObject(runnableContext, task, (Map<String, Object>) nodeObj);
if (nodeClass.isInstance(node)) {
result.add(nodeClass.cast(node));
}
}
}
}
return result;
}
}
......@@ -19,10 +19,16 @@ package org.jkiss.dbeaver.tools.transfer.task;
import org.jkiss.code.NotNull;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.DBRRunnableContext;
import org.jkiss.dbeaver.model.task.DBTTask;
import org.jkiss.dbeaver.model.task.DBTTaskExecutionListener;
import org.jkiss.dbeaver.model.task.DBTTaskHandler;
import org.jkiss.dbeaver.tools.transfer.DataTransferJob;
import org.jkiss.dbeaver.tools.transfer.DataTransferPipe;
import org.jkiss.dbeaver.tools.transfer.DataTransferSettings;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
import java.util.Locale;
/**
......@@ -32,10 +38,57 @@ public class DTTaskHandlerTransfer implements DBTTaskHandler {
@Override
public void executeTask(
@NotNull DBRProgressMonitor monitor,
@NotNull DBRRunnableContext runnableContext,
@NotNull DBTTask task,
@NotNull Locale locale, @NotNull Log log) throws DBException
@NotNull Locale locale,
@NotNull Log log,
@NotNull DBTTaskExecutionListener listener) throws DBException
{
throw new DBException("Not implemented yet");
DataTransferSettings settings = new DataTransferSettings(runnableContext, task);
executeWithSettings(runnableContext, locale, log, listener, settings);
}
public void executeWithSettings(@NotNull DBRRunnableContext runnableContext, @NotNull Locale locale, @NotNull Log log, @NotNull DBTTaskExecutionListener listener, DataTransferSettings settings) throws DBException {
// Start consumers
List<DataTransferPipe> dataPipes = settings.getDataPipes();
try {
runnableContext.run(false, false, monitor -> {
try {
for (int i = 0; i < dataPipes.size(); i++) {
DataTransferPipe pipe = dataPipes.get(i);
pipe.initPipe(settings, i, dataPipes.size());
pipe.getConsumer().startTransfer(monitor);
}
} catch (DBException e) {
throw new InvocationTargetException(e);
}
});
} catch (InvocationTargetException e) {
throw new DBException("Error starting data transfer", e.getTargetException());
} catch (InterruptedException e) {
return;
}
listener.taskStarted(settings);
// Schedule jobs for data providers
int totalJobs = settings.getDataPipes().size();
if (totalJobs > settings.getMaxJobCount()) {
totalJobs = settings.getMaxJobCount();
}
Throwable error = null;
for (int i = 0; i < totalJobs; i++) {
DataTransferJob job = new DataTransferJob(settings, locale, log, listener);
try {
runnableContext.run(true, true, job);
} catch (InvocationTargetException e) {
error = e.getTargetException();
} catch (InterruptedException e) {
break;
}
listener.subTaskFinished(error);
}
listener.taskFinished(settings, error);
}
}
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2019 Serge Rider (serge@jkiss.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jkiss.dbeaver.model.task;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
/**
* Task execution listener
*/
public interface DBTTaskExecutionListener {
void taskStarted(@NotNull Object task);
void taskFinished(@NotNull Object task, @Nullable Throwable error);
void subTaskFinished(@Nullable Throwable error);
}
......@@ -19,7 +19,7 @@ package org.jkiss.dbeaver.model.task;
import org.jkiss.code.NotNull;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.DBRRunnableContext;
import java.util.Locale;
......@@ -29,10 +29,11 @@ import java.util.Locale;
public interface DBTTaskHandler {
void executeTask(
@NotNull DBRProgressMonitor monitor,
@NotNull DBRRunnableContext runnableContext,
@NotNull DBTTask task,
@NotNull Locale locale,
@NotNull Log log)
@NotNull Log log,
@NotNull DBTTaskExecutionListener listener)
throws DBException;
}
......@@ -18,11 +18,12 @@ package org.jkiss.dbeaver.registry.task;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.runtime.AbstractJob;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.ProxyProgressMonitor;
import org.jkiss.dbeaver.model.runtime.*;
import org.jkiss.dbeaver.model.task.DBTTaskExecutionListener;
import org.jkiss.dbeaver.model.task.DBTTaskHandler;
import org.jkiss.dbeaver.utils.GeneralUtils;
......@@ -30,13 +31,14 @@ import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.InvocationTargetException;
import java.util.Date;
import java.util.Locale;
/**
* TaskRunJob
*/
public class TaskRunJob extends AbstractJob {
public class TaskRunJob extends AbstractJob implements DBRRunnableContext, DBTTaskExecutionListener {
private static final String RUN_LOG_PREFIX = "run_";
private static final String RUN_LOG_EXT = "log";
......@@ -44,6 +46,7 @@ public class TaskRunJob extends AbstractJob {
private final TaskImpl task;
private final Locale locale;
private Log taskLog;
private DBRProgressMonitor activeMonitor;
protected TaskRunJob(TaskImpl task, Locale locale) {
super("Task [" + task.getType().getName() + "] runner - " + task.getName());
......@@ -76,8 +79,29 @@ public class TaskRunJob extends AbstractJob {
}
private void executeTask(DBRProgressMonitor monitor) throws DBException {
activeMonitor = monitor;
DBTTaskHandler taskHandler = task.getType().createHandler();
taskHandler.executeTask(monitor, task, locale, taskLog);
taskHandler.executeTask(this, task, locale, taskLog, this);
}
@Override
public void run(boolean fork, boolean cancelable, DBRRunnableWithProgress runnable) throws InvocationTargetException, InterruptedException {
runnable.run(activeMonitor);
}
@Override
public void taskStarted(@NotNull Object task) {
}
@Override
public void taskFinished(@NotNull Object task, @Nullable Throwable error) {
}
@Override
public void subTaskFinished(@Nullable Throwable error) {
}
private class LoggingProgressMonitor extends ProxyProgressMonitor {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册