Customer Portal

Stopping a graph midway

Comments 5

  • Avatar
    avackova
    0
    Comment actions Permalink
    Hello,
    you should check the file before running the graph and, if it is empty, don't run such graph at all.
    But if you persist on aborting graph by itself, it can be done in Reformat component. See following example class you can use in Reformat component:
    import org.jetel.component.DataRecordTransform;
    import org.jetel.data.DataRecord;
    import org.jetel.exception.TransformException;


    public class StopGraph extends DataRecordTransform {

    int recNo=0;

    public int transform(DataRecord[] arg0, DataRecord[] arg1)
    throws TransformException {
    defaultTransform(arg0, arg1);
    recNo++;
    return ALL;
    }

    public void finished() {
    if (recNo == 0) {
    System.err.println("There is no data. Killing the graph.");
    getGraph().getWatchDog().abort();
    }
    }
    }

    In transform method you just copy input record to output record and in finish method you kill the running graph. The Reader and Reformat should be in earlier phase than the rest of graph. Note that such solution make your graph slower for not empty files while you have to split the graph into the phases and add one more Reformat.
  • Avatar
    mukunku
    0
    Comment actions Permalink
    Thanks for the abort logic:
    getGraph().getWatchDog().abort();

    There should definitely be an Abort component by default that does this
  • Avatar
    imriskal
    0
    Comment actions Permalink
    We actually do have a component called Fail now. It requires at least one record flowing into it to work but this can be worked around by using a dummy record.
  • Avatar
    mukunku
    0
    Comment actions Permalink
    Hi @imriskal,

    Could a status code option be added to the fail component? Such as "End as Failed" or "End as Aborted".

    One example scenario I have is that I have a failed graph event listener that emails when something goes wrong. But there are times when I just want to abort the graph without triggering an "error".

    An option to just end the graph as "Success" would be helpful in this regard as well. Maybe an option to the existing Success component can be added that says "Cancel future phases and end graph after current phase finishes".
  • Avatar
    Vladimir Barton
    0
    Comment actions Permalink
    Hi Mukunku,
    the fail component is designed in a way that it can abort the parent jobflow or graph with a user-specified error message and at the same time return some results through the dictionary. Having said that, you could use the Fail component for both purposes. Let me present you with an example:

    • Adding a Status Code
      [list:o3t2v0sj][*:o3t2v0sj]You would place Fail as a standalone component in the very last phase of your jobflow.

    • You could assign a user-specified error message, “End as Aborted” for instance.

    • This would help you distinguish between a jobflow that ended by this intentional user abort and a jobflow that finished with an actual error.
    [/*:m:o3t2v0sj]
  • Cancel future phases and end graph after current phase finishes
      [*:o3t2v0sj]Let’s say you have at least 2 different phases in your jobflow.

  • If you placed the Fail component in between those 2 existing phases, you could intentionally prevent the higher phase from being executed.
  • [/*:m:o3t2v0sj][/list:o:o3t2v0sj]
    Note: this could not be achieved by using the Success component as it does not function as a stopper and the graph/jobflow would simply continue to run.

    Please also note that the aforementioned examples would answer just the basic questions. If they do not address your particular situation sufficiently, feel free to provide us with the graph in question so that we can get a better insight into the specific case. In similar situations, a minor redesign of a graph might do the trick.

    Regards,

Please sign in to leave a comment.