use of co.cask.cdap.notifications.feeds.NotificationFeedException in project cdap by caskdata.
the class NotificationFeedHttpHandler method deleteFeed.
@DELETE
@Path("/feeds/categories/{feed-category}/names/{feed-name}")
public void deleteFeed(HttpRequest request, HttpResponder responder, @PathParam("namespace-id") String namespaceId, @PathParam("feed-category") String category, @PathParam("feed-name") String name) {
try {
NotificationFeedId feed;
try {
feed = new NotificationFeedId(namespaceId, category, name);
} catch (IllegalArgumentException e) {
responder.sendString(HttpResponseStatus.BAD_REQUEST, e.getMessage());
return;
}
feedManager.deleteFeed(feed);
responder.sendStatus(HttpResponseStatus.OK);
} catch (NotificationFeedNotFoundException e) {
responder.sendStatus(HttpResponseStatus.NOT_FOUND);
} catch (NotificationFeedException e) {
responder.sendString(HttpResponseStatus.INTERNAL_SERVER_ERROR, String.format("Could not delete Notification Feed. %s", e.getMessage()));
} catch (Throwable t) {
LOG.debug("Error in deleting notification feed.", t);
responder.sendString(HttpResponseStatus.INTERNAL_SERVER_ERROR, t.getMessage());
}
}
use of co.cask.cdap.notifications.feeds.NotificationFeedException in project cdap by caskdata.
the class DistributedStreamService method createHeartbeatsFeed.
/**
* Create Notification feed for stream's heartbeats, if it does not already exist.
*/
private void createHeartbeatsFeed() throws NotificationFeedException {
NotificationFeedInfo streamHeartbeatsFeed = new NotificationFeedInfo(NamespaceId.SYSTEM.getEntityName(), Constants.Notification.Stream.STREAM_INTERNAL_FEED_CATEGORY, Constants.Notification.Stream.STREAM_HEARTBEAT_FEED_NAME, "Stream heartbeats feed.");
LOG.debug("Ensuring Stream HeartbeatsFeed exists.");
boolean isRetry = false;
while (true) {
try {
feedManager.getFeed(streamHeartbeatsFeed);
LOG.debug("Stream HeartbeatsFeed exists.");
return;
} catch (NotificationFeedNotFoundException notFoundException) {
if (!isRetry) {
LOG.debug("Creating Stream HeartbeatsFeed.");
}
feedManager.createFeed(streamHeartbeatsFeed);
LOG.info("Stream HeartbeatsFeed created.");
return;
} catch (NotificationFeedException | RetryableException e) {
if (!isRetry) {
LOG.warn("Could not ensure existence of HeartbeatsFeed. Will retry until successful. " + "Retry failures will be logged at debug level.", e);
} else {
LOG.debug("Could not ensure existence of HeartbeatsFeed. Will retry until successful.", e);
}
isRetry = true;
waitBeforeRetryHeartbeatsFeedOperation();
}
}
}
use of co.cask.cdap.notifications.feeds.NotificationFeedException in project cdap by caskdata.
the class DistributedStreamService method subscribeToHeartbeatsFeed.
/**
* Subscribe to the streams heartbeat notification feed. One heartbeat contains data for all existing streams,
* we filter that to only take into account the streams that this {@link DistributedStreamService} is a leader
* of.
*
* @return a {@link Cancellable} to cancel the subscription
* @throws NotificationFeedNotFoundException if the heartbeat feed does not exist
*/
private Cancellable subscribeToHeartbeatsFeed() throws NotificationFeedNotFoundException {
LOG.debug("Subscribing to stream heartbeats notification feed");
NotificationFeedId heartbeatsFeed = new NotificationFeedId(NamespaceId.SYSTEM.getNamespace(), Constants.Notification.Stream.STREAM_INTERNAL_FEED_CATEGORY, Constants.Notification.Stream.STREAM_HEARTBEAT_FEED_NAME);
boolean isRetry = false;
while (true) {
try {
return notificationService.subscribe(heartbeatsFeed, new NotificationHandler<StreamWriterHeartbeat>() {
@Override
public Type getNotificationType() {
return StreamWriterHeartbeat.class;
}
@Override
public void received(StreamWriterHeartbeat heartbeat, NotificationContext notificationContext) {
LOG.trace("Received heartbeat {}", heartbeat);
for (Map.Entry<StreamId, Long> entry : heartbeat.getStreamsSizes().entrySet()) {
StreamSizeAggregator streamSizeAggregator = aggregators.get(entry.getKey());
if (streamSizeAggregator == null) {
LOG.trace("Aggregator for stream {} is null", entry.getKey());
continue;
}
streamSizeAggregator.bytesReceived(heartbeat.getInstanceId(), entry.getValue());
}
}
}, heartbeatsSubscriptionExecutor);
} catch (NotificationFeedException e) {
if (!isRetry) {
LOG.warn("Unable to subscribe to HeartbeatsFeed. Will retry until successfully subscribed. " + "Retry failures will be logged at debug level.", e);
} else {
LOG.debug("Unable to subscribe to HeartbeatsFeed. Will retry until successfully subscribed. ", e);
}
isRetry = true;
waitBeforeRetryHeartbeatsFeedOperation();
}
}
}
use of co.cask.cdap.notifications.feeds.NotificationFeedException in project cdap by caskdata.
the class MessagingNotificationService method subscribe.
@Override
public <N> Cancellable subscribe(NotificationFeedId feed, NotificationHandler<N> handler, Executor executor) throws NotificationFeedNotFoundException, NotificationFeedException {
Cancellable subscribeCancellable = super.subscribe(feed, handler, executor);
// If already has a thread fetching, just return the cancellable.
if (!needFetch.compareAndSet(false, true)) {
return subscribeCancellable;
}
// Start fetching
subscribeExecutor.execute(new Runnable() {
private final long startTime = System.currentTimeMillis();
private final RetryStrategy scheduleStrategy = RetryStrategies.exponentialDelay(100, 3000, TimeUnit.MILLISECONDS);
private byte[] messageId;
private int emptyFetchCount;
@Override
public void run() {
try {
MessageFetcher fetcher = messagingService.prepareFetch(notificationTopic);
if (messageId == null) {
fetcher.setStartTime(startTime);
} else {
fetcher.setStartMessage(messageId, false);
}
emptyFetchCount++;
try (CloseableIterator<RawMessage> iterator = fetcher.fetch()) {
while (iterator.hasNext()) {
emptyFetchCount = 0;
RawMessage rawMessage = iterator.next();
NotificationMessage message = GSON.fromJson(new String(rawMessage.getPayload(), StandardCharsets.UTF_8), NotificationMessage.class);
try {
LOG.trace("Decoded notification: {}", message);
notificationReceived(message.getFeedId(), message.getNotificationJson());
} catch (Throwable t) {
LOG.warn("Error while processing notification {} with handler {}", message, t);
}
messageId = rawMessage.getId();
}
}
} catch (Exception e) {
LOG.error("Failed to get notification", e);
}
// Back-off if it was empty fetch.
if (emptyFetchCount > 0) {
// Schedule the next fetch. Exponential strategy doesn't use the time component,
// so doesn't matter what we passed in
subscribeExecutor.schedule(this, scheduleStrategy.nextRetry(emptyFetchCount, startTime), TimeUnit.MILLISECONDS);
} else {
subscribeExecutor.execute(this);
}
}
});
return subscribeCancellable;
}
use of co.cask.cdap.notifications.feeds.NotificationFeedException in project cdap by caskdata.
the class RemoteNotificationFeedManager method deleteFeed.
@Override
public void deleteFeed(NotificationFeedId feed) throws NotificationFeedNotFoundException, NotificationFeedException {
String path = String.format("namespaces/%s/feeds/categories/%s/names/%s", feed.getNamespace(), feed.getCategory(), feed.getFeed());
HttpResponse response = execute(remoteClient.requestBuilder(HttpMethod.DELETE, path).build());
if (response.getResponseCode() == HttpURLConnection.HTTP_NOT_FOUND) {
throw new NotificationFeedNotFoundException(feed);
} else if (response.getResponseCode() != HttpURLConnection.HTTP_OK) {
throw new NotificationFeedException("Cannot delete notification feed. Reason: " + response);
}
}
Aggregations