
io.github.vipcxj.jasync.ng.runtime.schedule.PortalTask Maven / Gradle / Ivy
package io.github.vipcxj.jasync.ng.runtime.schedule;
import io.github.vipcxj.jasync.ng.spec.*;
import io.github.vipcxj.jasync.ng.spec.functional.JAsyncPortalTask1;
public class PortalTask implements Task {
private final JAsyncPortalTask1 jumperTask;
private JPortal portal;
private JDisposable disposable;
private int repeated;
private boolean disposed;
public PortalTask(JAsyncPortalTask1 jumperTask) {
this.jumperTask = jumperTask;
this.disposed = false;
}
public void bindPortal(JPortal portal) {
this.portal = portal;
}
private void doSchedule(JThunk thunk, JContext context) {
if (!disposed) {
++repeated;
try {
JPromise next = jumperTask.invoke(portal, context);
next = next != null ? next : JPromise.empty();
next.onError(thunk::reject)
.onSuccess(thunk::resolve)
.async(context);
} catch (Throwable t) {
thunk.reject(t, context);
}
}
}
@Override
public void schedule(JThunk thunk, JContext context) {
if (!disposed) {
if (repeated % 150 == 0) {
this.disposable = context.getScheduler().schedule(() -> {
doSchedule(thunk, context);
});
if (disposed) {
this.disposable.dispose();
}
} else {
doSchedule(thunk, context);
}
}
}
@Override
public void cancel() {
if (!disposed) {
this.disposed = true;
if (disposable != null) {
disposable.dispose();
}
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy