private void notifyFeedEventSubscribers(FeedJobInfo jobInfo, FeedLifecycleEvent event) {
    JobType jobType = jobInfo.getJobType();
    List<FeedConnectionId> impactedConnections = new ArrayList<FeedConnectionId>();
    if (jobType.equals(JobType.INTAKE)) {
      FeedId feedId = ((FeedIntakeInfo) jobInfo).getFeedId();
      for (FeedConnectionId connId : eventSubscribers.keySet()) {
        if (connId.getFeedId().equals(feedId)) {
          impactedConnections.add(connId);
        }
      }
    } else {
      impactedConnections.add(((FeedConnectJobInfo) jobInfo).getConnectionId());
    }

    for (FeedConnectionId connId : impactedConnections) {
      List<IFeedLifecycleEventSubscriber> subscribers = eventSubscribers.get(connId);
      if (subscribers != null && !subscribers.isEmpty()) {
        for (IFeedLifecycleEventSubscriber subscriber : subscribers) {
          subscriber.handleFeedEvent(event);
        }
      }
    }
  }
  public void removeFeedJointsPostPipelineTermination(FeedConnectionId connectionId) {
    FeedConnectJobInfo cInfo = connectJobInfos.get(connectionId);
    List<IFeedJoint> feedJoints = feedPipeline.get(connectionId.getFeedId());

    IFeedJoint sourceJoint = cInfo.getSourceFeedJoint();
    List<FeedConnectionId> all = sourceJoint.getReceivers();
    boolean removeSourceJoint = all.size() < 2;
    if (removeSourceJoint) {
      feedJoints.remove(sourceJoint);
    }

    IFeedJoint computeJoint = cInfo.getComputeFeedJoint();
    if (computeJoint != null && computeJoint.getReceivers().size() < 2) {
      feedJoints.remove(computeJoint);
    }
  }