private static void putDeadlineMessage(JobDataMap jobData, DeadlineMessage deadlineMessage, Serializer serializer) { jobData.put(DEADLINE_NAME, deadlineMessage.getDeadlineName()); jobData.put(MESSAGE_ID, deadlineMessage.getIdentifier()); jobData.put(MESSAGE_TIMESTAMP, deadlineMessage.getTimestamp().toEpochMilli()); SerializedObject<byte[]> serializedDeadlinePayload = serializer.serialize(deadlineMessage.getPayload(), byte[].class); jobData.put(SERIALIZED_MESSAGE_PAYLOAD, serializedDeadlinePayload.getData()); jobData.put(MESSAGE_TYPE, serializedDeadlinePayload.getType().getName()); jobData.put(MESSAGE_REVISION, serializedDeadlinePayload.getType().getRevision()); SerializedObject<byte[]> serializedDeadlineMetaData = serializer.serialize(deadlineMessage.getMetaData(), byte[].class); jobData.put(MESSAGE_METADATA, serializedDeadlineMetaData.getData()); }
private JobDetail buildJobDetail(DeadlineMessage deadlineMessage, ScopeDescriptor deadlineScope, JobKey jobKey) { JobDataMap jobData = DeadlineJob.DeadlineJobDataBinder.toJobData(serializer, deadlineMessage, deadlineScope); return JobBuilder.newJob(DeadlineJob.class) .withDescription(deadlineMessage.getPayloadType().getName()) .withIdentity(jobKey) .usingJobData(jobData) .build(); }
private boolean deadlineNameMatch(DeadlineMessage message) { return deadlineNameMatchesAll() || deadlineName.equals(message.getDeadlineName()); }
@Override public String schedule(Instant triggerDateTime, String deadlineName, Object payloadOrMessage, ScopeDescriptor deadlineScope) { DeadlineMessage<?> deadlineMessage = processDispatchInterceptors(asDeadlineMessage(deadlineName, payloadOrMessage)); DeadlineMessage<?> scheduledMessage = new GenericDeadlineMessage<>(deadlineName, deadlineMessage, () -> triggerDateTime); schedules.add(new ScheduledDeadlineInfo(triggerDateTime, deadlineName, scheduledMessage.getIdentifier(), counter.getAndIncrement(), scheduledMessage, deadlineScope)); return scheduledMessage.getIdentifier(); }
@Test public void testDispatchInterceptorOnAggregate() { configuration.deadlineManager().registerDispatchInterceptor(messages -> (i, m) -> GenericDeadlineMessage.asDeadlineMessage(m.getDeadlineName(), new DeadlinePayload("fakeId"))); configuration.commandGateway().sendAndWait(new CreateMyAggregateCommand(IDENTIFIER)); assertPublishedEvents(new MyAggregateCreatedEvent(IDENTIFIER), new DeadlineOccurredEvent(new DeadlinePayload("fakeId"))); }
@Override public String schedule(Duration triggerDuration, String deadlineName, Object messageOrPayload, ScopeDescriptor deadlineScope) { DeadlineMessage<?> deadlineMessage = asDeadlineMessage(deadlineName, messageOrPayload); String deadlineId = deadlineMessage.getIdentifier(); runOnPrepareCommitOrNow(() -> { DeadlineMessage<?> interceptedDeadlineMessage = processDispatchInterceptors(deadlineMessage); DeadlineTask deadlineTask = new DeadlineTask(deadlineName, deadlineScope, interceptedDeadlineMessage, deadlineId); ScheduledFuture<?> scheduledFuture = scheduledExecutorService.schedule( deadlineTask, triggerDuration.toMillis(), TimeUnit.MILLISECONDS ); scheduledTasks.put(new DeadlineId(deadlineName, deadlineId), scheduledFuture); }); return deadlineId; }
private static void putDeadlineMessage(JobDataMap jobData, DeadlineMessage deadlineMessage, Serializer serializer) { jobData.put(DEADLINE_NAME, deadlineMessage.getDeadlineName()); jobData.put(MESSAGE_ID, deadlineMessage.getIdentifier()); jobData.put(MESSAGE_TIMESTAMP, deadlineMessage.getTimestamp().toEpochMilli()); SerializedObject<byte[]> serializedDeadlinePayload = serializer.serialize(deadlineMessage.getPayload(), byte[].class); jobData.put(SERIALIZED_MESSAGE_PAYLOAD, serializedDeadlinePayload.getData()); jobData.put(MESSAGE_TYPE, serializedDeadlinePayload.getType().getName()); jobData.put(MESSAGE_REVISION, serializedDeadlinePayload.getType().getRevision()); SerializedObject<byte[]> serializedDeadlineMetaData = serializer.serialize(deadlineMessage.getMetaData(), byte[].class); jobData.put(MESSAGE_METADATA, serializedDeadlineMetaData.getData()); }
@Test public void testHandlerInterceptorOnAggregate() { configuration.deadlineManager().registerHandlerInterceptor((uow, chain) -> { uow.transformMessage(deadlineMessage -> GenericDeadlineMessage .asDeadlineMessage(deadlineMessage.getDeadlineName(), new DeadlinePayload("fakeId"))); return chain.proceed(); }); configuration.commandGateway().sendAndWait(new CreateMyAggregateCommand(IDENTIFIER)); assertPublishedEvents(new MyAggregateCreatedEvent(IDENTIFIER), new DeadlineOccurredEvent(new DeadlinePayload("fakeId"))); }
@Override public String schedule(Instant triggerDateTime, String deadlineName, Object messageOrPayload, ScopeDescriptor deadlineScope) { DeadlineMessage<Object> deadlineMessage = asDeadlineMessage(deadlineName, messageOrPayload); String deadlineId = JOB_NAME_PREFIX + deadlineMessage.getIdentifier(); runOnPrepareCommitOrNow(() -> { DeadlineMessage interceptedDeadlineMessage = processDispatchInterceptors(deadlineMessage); try { JobDetail jobDetail = buildJobDetail(interceptedDeadlineMessage, deadlineScope, new JobKey(deadlineId, deadlineName)); scheduler.scheduleJob(jobDetail, buildTrigger(triggerDateTime, jobDetail.getKey())); } catch (SchedulerException e) { throw new DeadlineException("An error occurred while setting a timer for a deadline", e); } }); return deadlineId; }
} else if (logger.isInfoEnabled()) { logger.info("Job successfully executed. Deadline message [{}] processed.", deadlineMessage.getPayloadType().getSimpleName());
private static void putDeadlineMessage(JobDataMap jobData, DeadlineMessage deadlineMessage, Serializer serializer) { jobData.put(DEADLINE_NAME, deadlineMessage.getDeadlineName()); jobData.put(MESSAGE_ID, deadlineMessage.getIdentifier()); jobData.put(MESSAGE_TIMESTAMP, deadlineMessage.getTimestamp().toEpochMilli()); SerializedObject<byte[]> serializedDeadlinePayload = serializer.serialize(deadlineMessage.getPayload(), byte[].class); jobData.put(SERIALIZED_MESSAGE_PAYLOAD, serializedDeadlinePayload.getData()); jobData.put(MESSAGE_TYPE, serializedDeadlinePayload.getType().getName()); jobData.put(MESSAGE_REVISION, serializedDeadlinePayload.getType().getRevision()); SerializedObject<byte[]> serializedDeadlineMetaData = serializer.serialize(deadlineMessage.getMetaData(), byte[].class); jobData.put(MESSAGE_METADATA, serializedDeadlineMetaData.getData()); }
@Test public void testDispatchInterceptorOnSaga() { EventMessage<Object> testEventMessage = asEventMessage(new SagaStartingEvent(IDENTIFIER, DO_NOT_CANCEL_BEFORE_DEADLINE)); configuration.deadlineManager().registerDispatchInterceptor(messages -> (i, m) -> GenericDeadlineMessage.asDeadlineMessage(m.getDeadlineName(), new DeadlinePayload("fakeId"))); configuration.eventStore().publish(testEventMessage); assertPublishedEvents(new SagaStartingEvent(IDENTIFIER, DO_NOT_CANCEL_BEFORE_DEADLINE), new DeadlineOccurredEvent(new DeadlinePayload("fakeId"))); }
@Override public String schedule(Duration triggerDuration, String deadlineName, Object messageOrPayload, ScopeDescriptor deadlineScope) { DeadlineMessage<?> deadlineMessage = asDeadlineMessage(deadlineName, messageOrPayload); String deadlineId = deadlineMessage.getIdentifier(); runOnPrepareCommitOrNow(() -> { DeadlineMessage<?> interceptedDeadlineMessage = processDispatchInterceptors(deadlineMessage); DeadlineTask deadlineTask = new DeadlineTask(deadlineName, deadlineScope, interceptedDeadlineMessage, deadlineId); ScheduledFuture<?> scheduledFuture = scheduledExecutorService.schedule( deadlineTask, triggerDuration.toMillis(), TimeUnit.MILLISECONDS ); scheduledTasks.put(new DeadlineId(deadlineName, deadlineId), scheduledFuture); }); return deadlineId; }
private JobDetail buildJobDetail(DeadlineMessage deadlineMessage, ScopeDescriptor deadlineScope, JobKey jobKey) { JobDataMap jobData = DeadlineJob.DeadlineJobDataBinder.toJobData(serializer, deadlineMessage, deadlineScope); return JobBuilder.newJob(DeadlineJob.class) .withDescription(deadlineMessage.getPayloadType().getName()) .withIdentity(jobKey) .usingJobData(jobData) .build(); }
@Test public void testHandlerInterceptorOnSaga() { EventMessage<Object> testEventMessage = asEventMessage(new SagaStartingEvent(IDENTIFIER, DO_NOT_CANCEL_BEFORE_DEADLINE)); configuration.deadlineManager().registerHandlerInterceptor((uow, chain) -> { uow.transformMessage(deadlineMessage -> GenericDeadlineMessage .asDeadlineMessage(deadlineMessage.getDeadlineName(), new DeadlinePayload("fakeId"))); return chain.proceed(); }); configuration.eventStore().publish(testEventMessage); assertPublishedEvents(new SagaStartingEvent(IDENTIFIER, DO_NOT_CANCEL_BEFORE_DEADLINE), new DeadlineOccurredEvent(new DeadlinePayload("fakeId"))); }
@Override public String schedule(Instant triggerDateTime, String deadlineName, Object messageOrPayload, ScopeDescriptor deadlineScope) { DeadlineMessage<Object> deadlineMessage = asDeadlineMessage(deadlineName, messageOrPayload); String deadlineId = JOB_NAME_PREFIX + deadlineMessage.getIdentifier(); runOnPrepareCommitOrNow(() -> { DeadlineMessage interceptedDeadlineMessage = processDispatchInterceptors(deadlineMessage); try { JobDetail jobDetail = buildJobDetail(interceptedDeadlineMessage, deadlineScope, new JobKey(deadlineId, deadlineName)); scheduler.scheduleJob(jobDetail, buildTrigger(triggerDateTime, jobDetail.getKey())); } catch (SchedulerException e) { throw new DeadlineException("An error occurred while setting a timer for a deadline", e); } }); return deadlineId; }
private JobDetail buildJobDetail(DeadlineMessage deadlineMessage, ScopeDescriptor deadlineScope, JobKey jobKey) { JobDataMap jobData = DeadlineJob.DeadlineJobDataBinder.toJobData(serializer, deadlineMessage, deadlineScope); return JobBuilder.newJob(DeadlineJob.class) .withDescription(deadlineMessage.getPayloadType().getName()) .withIdentity(jobKey) .usingJobData(jobData) .build(); }
private boolean deadlineNameMatch(DeadlineMessage message) { return deadlineNameMatchesAll() || deadlineName.equals(message.getDeadlineName()); }
@Override public void execute(JobExecutionContext context) throws JobExecutionException { if (LOGGER.isDebugEnabled()) { LOGGER.debug("Starting a deadline job"); } JobDetail jobDetail = context.getJobDetail(); JobDataMap jobData = jobDetail.getJobDataMap(); try { SchedulerContext schedulerContext = context.getScheduler().getContext(); Serializer serializer = (Serializer) schedulerContext.get(JOB_DATA_SERIALIZER); TransactionManager transactionManager = (TransactionManager) schedulerContext.get(TRANSACTION_MANAGER_KEY); ScopeAwareProvider scopeAwareComponents = (ScopeAwareProvider) schedulerContext.get(SCOPE_AWARE_RESOLVER); DeadlineMessage<?> deadlineMessage = deadlineMessage(serializer, jobData); ScopeDescriptor deadlineScope = deadlineScope(serializer, jobData); DefaultUnitOfWork<DeadlineMessage<?>> unitOfWork = DefaultUnitOfWork.startAndGet(deadlineMessage); unitOfWork.attachTransaction(transactionManager); unitOfWork.execute(() -> executeScheduledDeadline(scopeAwareComponents, deadlineMessage, deadlineScope)); if (LOGGER.isInfoEnabled()) { LOGGER.info("Job successfully executed. Deadline message [{}] processed.", deadlineMessage.getPayloadType().getSimpleName()); } } catch (Exception e) { LOGGER.error("Exception occurred during processing a deadline job [{}]", jobDetail.getDescription(), e); throw new JobExecutionException(e); } }
private boolean deadlineNameMatch(DeadlineMessage message) { return deadlineNameMatchesAll() || deadlineName.equals(message.getDeadlineName()); }