All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jetlinks.rule.engine.defaults.DefaultTask Maven / Gradle / Ivy

package org.jetlinks.rule.engine.defaults;

import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import org.jetlinks.rule.engine.api.RuleConstants;
import org.jetlinks.rule.engine.api.RuleData;
import org.jetlinks.rule.engine.api.scheduler.ScheduleJob;
import org.jetlinks.rule.engine.api.task.Task;
import org.jetlinks.rule.engine.api.task.TaskExecutor;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.HashMap;
import java.util.Map;

@Slf4j
public class DefaultTask implements Task {

    @Getter
    private final String workerId;

    @Getter
    private final String schedulerId;

    private final AbstractExecutionContext context;

    private final TaskExecutor executor;

    private long lastStateTime;

    private long startTime;

    public DefaultTask(String schedulerId,
                       String workerId,
                       AbstractExecutionContext context,
                       TaskExecutor executor) {
        this.schedulerId = schedulerId;
        this.workerId = workerId;
        this.context = context;
        this.executor = executor;
        //监听状态切换事件
        executor.onStateChanged((from, to) -> {
            lastStateTime = System.currentTimeMillis();
            Map data = new HashMap<>();
            data.put("from", from.name());
            data.put("to", to.name());
            data.put("taskId", getId());
            data.put("instanceId", context.getInstanceId());
            data.put("nodeId", context.getJob().getNodeId());
            data.put("timestamp", System.currentTimeMillis());

            Flux.merge(
                    context.getEventBus()
                            .publish(RuleConstants.Topics.state(context.getInstanceId(), context.getJob().getNodeId()), data),
                    context.getEventBus()
                            .publish(RuleConstants.Topics.event(context.getInstanceId(), context.getJob().getNodeId(), to.name()), context.newRuleData(data))
            )
                    .doOnError(err -> log.error(err.getMessage(), err))
                    .subscribe();

        });
    }

    @Override
    public String getId() {
        return DigestUtils.md5Hex(workerId + ":" + context.getInstanceId() + ":" + context.getJob().getNodeId());
    }

    @Override
    public String getName() {
        return executor.getName();
    }

    @Override
    public ScheduleJob getJob() {
        return context.getJob();
    }

    @Override
    public Mono setJob(ScheduleJob job) {
        return Mono.fromRunnable(() -> {
            ScheduleJob old = context.getJob();
            context.setJob(job);
            try {
                executor.validate();
            } catch (Throwable e) {
                context.setJob(old);
                throw e;
            }
        });
    }

    @Override
    public Mono reload() {
        log.debug("reload task[{}]:[{}]", getId(), getJob());
        return Mono.fromRunnable(executor::reload);
    }

    @Override
    public Mono start() {
        log.debug("start task[{}]:[{}]", getId(), getJob());
        return Mono.fromRunnable(executor::start)
                .doOnSuccess((v) -> startTime = System.currentTimeMillis());
    }

    @Override
    public Mono pause() {
        log.debug("pause task[{}]:[{}]", getId(), getJob());
        return Mono.fromRunnable(executor::pause);
    }

    @Override
    public Mono shutdown() {
        log.debug("shutdown task[{}]:[{}]", getId(), getJob());
        return Mono
                .fromRunnable(executor::shutdown)
                .then(Mono.fromRunnable(context::doShutdown));
    }

    @Override
    public Mono execute(RuleData data) {
        log.debug("execute task[{}]:[{}]", getId(), getJob());
        return context
                .getEventBus()
                .publish(RuleConstants.Topics.input(getJob().getInstanceId(), getJob().getNodeId()), data)
                .then();
    }

    @Override
    public Mono getState() {
        return Mono.just(executor.getState());
    }

    @Override
    public Mono debug(boolean debug) {
        log.debug("set task debug[{}] [{}]:[{}]", debug, getId(), getJob());
        return Mono.fromRunnable(() -> context.setDebug(debug));
    }

    @Override
    public Mono getLastStateTime() {
        return Mono.just(lastStateTime);
    }

    @Override
    public Mono getStartTime() {
        return Mono.just(startTime);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy