[ 
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)

Reply via email to