Search in sources :

Example 1 with JobDetails

use of org.kie.kogito.jobs.service.model.job.JobDetails in project kogito-apps by kiegroup.

the class HttpJobExecutor method execute.

@Override
public CompletionStage<JobDetails> execute(CompletionStage<JobDetails> futureJob) {
    return futureJob.thenCompose(job -> {
        // Using just POST method for now
        String callbackEndpoint = Optional.ofNullable(job.getRecipient()).filter(HTTPRecipient.class::isInstance).map(HTTPRecipient.class::cast).map(HTTPRecipient::getEndpoint).orElse("");
        String limit = Optional.ofNullable(job.getTrigger()).filter(IntervalTrigger.class::isInstance).map(interval -> getRepeatableJobCountDown(job)).map(String::valueOf).orElse(null);
        final HTTPRequestCallback callback = HTTPRequestCallback.builder().url(callbackEndpoint).method(HTTPRequestCallback.HTTPMethod.POST).addQueryParam("limit", limit).build();
        return ReactiveStreams.fromPublisher(executeCallback(callback).convert().toPublisher()).map(response -> JobExecutionResponse.builder().message(response.statusMessage()).code(getResponseCode(response)).now().jobId(job.getId()).build()).flatMap(this::handleResponse).findFirst().run().thenApply(response -> response.map(r -> job).orElse(null)).exceptionally(ex -> {
            LOGGER.error("Generic error executing job {}", job, ex);
            jobStreams.publishJobError(JobExecutionResponse.builder().message(ex.getMessage()).now().jobId(job.getId()).build());
            return job;
        });
    });
}
Also used : HTTPRequestCallback(org.kie.kogito.jobs.service.model.HTTPRequestCallback) HttpConverters(org.kie.kogito.jobs.service.converters.HttpConverters) JobStreams(org.kie.kogito.jobs.service.stream.JobStreams) Logger(org.slf4j.Logger) HttpRequest(io.vertx.mutiny.ext.web.client.HttpRequest) LoggerFactory(org.slf4j.LoggerFactory) HttpResponse(io.vertx.mutiny.ext.web.client.HttpResponse) HTTPRequestCallback(org.kie.kogito.jobs.service.model.HTTPRequestCallback) Uni(io.smallrye.mutiny.Uni) Inject(javax.inject.Inject) JobDetails(org.kie.kogito.jobs.service.model.job.JobDetails) CompletionStage(java.util.concurrent.CompletionStage) Buffer(io.vertx.mutiny.core.buffer.Buffer) Vertx(io.vertx.mutiny.core.Vertx) PostConstruct(javax.annotation.PostConstruct) URIBuilder(org.kie.kogito.jobs.api.URIBuilder) WebClient(io.vertx.mutiny.ext.web.client.WebClient) Optional(java.util.Optional) IntervalTrigger(org.kie.kogito.timer.impl.IntervalTrigger) ApplicationScoped(javax.enterprise.context.ApplicationScoped) URI(java.net.URI) ReactiveStreams(org.eclipse.microprofile.reactive.streams.operators.ReactiveStreams) JobExecutionResponse(org.kie.kogito.jobs.service.model.JobExecutionResponse) PublisherBuilder(org.eclipse.microprofile.reactive.streams.operators.PublisherBuilder) HTTPRecipient(org.kie.kogito.jobs.service.model.job.Recipient.HTTPRecipient) HTTPRecipient(org.kie.kogito.jobs.service.model.job.Recipient.HTTPRecipient)

Example 2 with JobDetails

use of org.kie.kogito.jobs.service.model.job.JobDetails in project kogito-apps by kiegroup.

the class JobResource method patch.

@PATCH
@Path("/{id}")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public CompletionStage<ScheduledJob> patch(@PathParam("id") String id, @RequestBody Job job) {
    LOGGER.debug("REST patch update {}", job);
    JobDetails jobToBeMerged = ScheduledJobAdapter.to(ScheduledJobBuilder.from(job));
    // validating allowed patch attributes
    if (Objects.nonNull(jobToBeMerged.getPayload()) || StringUtils.isNotEmpty(jobToBeMerged.getId()) || StringUtils.isNotEmpty(jobToBeMerged.getScheduledId()) || StringUtils.isNotEmpty(jobToBeMerged.getCorrelationId()) || (Objects.nonNull(jobToBeMerged.getExecutionCounter()) && jobToBeMerged.getExecutionCounter() > 0) || Objects.nonNull(jobToBeMerged.getPriority()) || (Objects.nonNull(jobToBeMerged.getRetries()) && jobToBeMerged.getRetries() > 0) || Objects.nonNull(jobToBeMerged.getRecipient()) || Objects.nonNull(jobToBeMerged.getStatus())) {
        throw new IllegalArgumentException("Patch an only be applied to the Job scheduling trigger attributes");
    }
    return scheduler.reschedule(id, jobToBeMerged.getTrigger()).map(ScheduledJobAdapter::of).findFirst().run().thenApply(j -> j.orElseThrow(() -> new NotFoundException("Failed to reschedule job " + job)));
}
Also used : NotFoundException(javax.ws.rs.NotFoundException) JobDetails(org.kie.kogito.jobs.service.model.job.JobDetails) Path(javax.ws.rs.Path) Produces(javax.ws.rs.Produces) Consumes(javax.ws.rs.Consumes) PATCH(javax.ws.rs.PATCH)

Example 3 with JobDetails

use of org.kie.kogito.jobs.service.model.job.JobDetails in project kogito-apps by kiegroup.

the class HttpJobExecutorTest method testExecutePeriodic.

@Test
void testExecutePeriodic(@Mock HttpRequest<Buffer> request, @Mock MultiMap params) {
    JobDetails scheduledJob = JobDetails.builder().id(JOB_ID).recipient(new Recipient.HTTPRecipient(ENDPOINT)).trigger(ScheduledJobAdapter.intervalTrigger(DateUtil.now(), 10, 1)).executionCounter(1).build();
    Map queryParams = assertExecuteAndReturnQueryParams(request, params, scheduledJob, false);
    assertThat(queryParams).hasSize(1).containsEntry("limit", "8");
}
Also used : Map(java.util.Map) MultiMap(io.vertx.mutiny.core.MultiMap) JobDetails(org.kie.kogito.jobs.service.model.job.JobDetails) Test(org.junit.jupiter.api.Test)

Example 4 with JobDetails

use of org.kie.kogito.jobs.service.model.job.JobDetails in project kogito-apps by kiegroup.

the class ReactiveMessagingEventConsumerTest method onCancelJobWithExistingJobSuccessful.

@Test
void onCancelJobWithExistingJobSuccessful() {
    JobDetails jobDetails = JobDetails.builder().id(JOB_ID).build();
    prepareCancelJobWithExistingJob(jobDetails);
    executeSuccessfulCancelJob();
}
Also used : JobDetails(org.kie.kogito.jobs.service.model.job.JobDetails) Test(org.junit.jupiter.api.Test)

Example 5 with JobDetails

use of org.kie.kogito.jobs.service.model.job.JobDetails in project kogito-apps by kiegroup.

the class ReactiveMessagingEventConsumerTest method onCreateProcessInstanceJobExistingNonScheduledSuccessful.

private void onCreateProcessInstanceJobExistingNonScheduledSuccessful(JobStatus nonScheduledStatus) {
    JobDetails existingJob = JobDetails.builder().id(JOB_ID).status(nonScheduledStatus).build();
    prepareCreateProcessInstanceJobWithExistingJobResult(existingJob);
    executeSuccessfulNonScheduledJobExecution();
}
Also used : JobDetails(org.kie.kogito.jobs.service.model.job.JobDetails)

Aggregations

JobDetails (org.kie.kogito.jobs.service.model.job.JobDetails)34 Test (org.junit.jupiter.api.Test)26 ZonedDateTime (java.time.ZonedDateTime)7 PointInTimeTrigger (org.kie.kogito.timer.impl.PointInTimeTrigger)7 Recipient (org.kie.kogito.jobs.service.model.job.Recipient)6 ArgumentMatchers.anyString (org.mockito.ArgumentMatchers.anyString)6 JsonObject (io.vertx.core.json.JsonObject)4 JobStatus (org.kie.kogito.jobs.service.model.JobStatus)4 MultiMap (io.vertx.mutiny.core.MultiMap)3 Tuple (io.vertx.mutiny.sqlclient.Tuple)3 Map (java.util.Map)3 Job (org.kie.kogito.jobs.api.Job)3 CreateProcessInstanceJobRequestEvent (org.kie.kogito.jobs.api.event.CreateProcessInstanceJobRequestEvent)3 JobServiceException (org.kie.kogito.jobs.service.exception.JobServiceException)3 Trigger (org.kie.kogito.timer.Trigger)3 Date (java.util.Date)2 CancelJobRequestEvent (org.kie.kogito.jobs.api.event.CancelJobRequestEvent)2 FindOptions (io.quarkus.mongodb.FindOptions)1 Uni (io.smallrye.mutiny.Uni)1 Vertx (io.vertx.mutiny.core.Vertx)1