[
https://issues.apache.org/jira/browse/GOBBLIN-1673?focusedWorklogId=803242&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-803242
]
ASF GitHub Bot logged work on GOBBLIN-1673:
-------------------------------------------
Author: ASF GitHub Bot
Created on: 24/Aug/22 14:30
Start Date: 24/Aug/22 14:30
Worklog Time Spent: 10m
Work Description: homatthew commented on code in PR #3539:
URL: https://github.com/apache/gobblin/pull/3539#discussion_r953878946
##########
gobblin-runtime/src/main/java/org/apache/gobblin/runtime/messaging/DynamicWorkUnitUtils.java:
##########
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.gobblin.runtime.messaging;
+
+import com.google.common.base.Optional;
+import com.google.gson.Gson;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import java.time.Duration;
+import java.time.Instant;
+import java.time.temporal.ChronoUnit;
+import lombok.NonNull;
+import org.apache.gobblin.runtime.messaging.data.DynamicWorkUnitMessage;
+import org.apache.gobblin.util.LoggingUncaughtExceptionHandler;
+
+
+public final class DynamicWorkUnitUtils {
+ private static final Gson GSON = new Gson();
+ private static final String PROPS_PREFIX = "DynamicWorkUnit.Props";
+ private static final String MESSAGE_IMPLEMENTATION = PROPS_PREFIX +
".MessageImplementationClass";
+
+ private DynamicWorkUnitUtils() {
+ throw new RuntimeException("Cannot instantiate utils class");
+ }
+
+ /**
+ * Helper method for deserializing {@link DynamicWorkUnitMessage}
+ * @param json Serialized message using {@link DynamicWorkUnitUtils#toJson}
+ * @return {@link DynamicWorkUnitMessage} POJO representation of the given
json
+ */
+ public static <T extends DynamicWorkUnitMessage> DynamicWorkUnitMessage
fromJson(JsonElement json) {
+ try {
+ JsonObject obj = json.getAsJsonObject();
+ Class<T> clazz = (Class<T>)
Class.forName(obj.get(MESSAGE_IMPLEMENTATION).getAsString());
+ return GSON.fromJson(json, clazz);
+ } catch (IllegalStateException | ClassNotFoundException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Helper method for serializing {@link DynamicWorkUnitMessage}
+ * @param msg Message object to serialize
+ * @return json representation of message object
+ */
+ public static JsonElement toJson(@NonNull DynamicWorkUnitMessage msg) {
+ JsonElement json = GSON.toJsonTree(msg);
+ JsonObject obj = json.getAsJsonObject();
+ obj.addProperty(MESSAGE_IMPLEMENTATION, msg.getClass().getName());
+ return obj;
+ }
+
+ /**
+ * Helper method for periodically executing runnable. Useful method to allow
{@link DynamicWorkUnitConsumer} to poll
+ * for new messages
+ * @param runnable
+ * @param timeBetweenRunStarts
+ */
+ public static void runInBackground(Runnable runnable, Duration
timeBetweenRunStarts) {
+ Thread idleProcessThread = new Thread(() -> {
+ while (true) {
+ Instant nextStartTime = Instant.now().plus(timeBetweenRunStarts);
+ runnable.run();
+ try {
+ long timeToSleepMs = Instant.now().until(nextStartTime,
ChronoUnit.MILLIS);
+ if(timeToSleepMs > 0) {
Review Comment:
Fun fact. This
https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html
class does what this method does but better. I will remove it in the next
iteration. This method's behavior is the exact same as `scheduleAtFixedRate`
method.
No minimum wait time is because this method was intended to be used with a
message consumer. If the time of execution exceeds the `timeBetweenRunStarts`
time, then we probably have a backlog of messages that still need to be
processed (hence we want to run the consumer again).
Issue Time Tracking
-------------------
Worklog Id: (was: 803242)
Remaining Estimate: 71h 20m (was: 71.5h)
Time Spent: 40m (was: 0.5h)
> [Helix Dynamic Workunit] Message Schema for splitting workuntis
> ---------------------------------------------------------------
>
> Key: GOBBLIN-1673
> URL: https://issues.apache.org/jira/browse/GOBBLIN-1673
> Project: Apache Gobblin
> Issue Type: New Feature
> Components: gobblin-helix
> Reporter: Matthew Ho
> Assignee: Abhishek Tiwari
> Priority: Major
> Original Estimate: 72h
> Time Spent: 40m
> Remaining Estimate: 71h 20m
>
> For the Helix Dynamic Workunits, task runners will produce messages
> indicating the current workunit health and the application master will
> consume these messages.
> A message will be sent from the task runner to the AM when the task runner
> experiences lag during ingestion. This ticket is the schema proposal for this
> message.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)