package com.thinkbiganalytics.nifi.provenance.jms;
/*-
* #%L
* thinkbig-nifi-provenance-repo
* %%
* Copyright (C) 2017 ThinkBig Analytics
* %%
* Licensed 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.
* #L%
*/
import com.thinkbiganalytics.activemq.SendJmsMessage;
import com.thinkbiganalytics.nifi.activemq.Queues;
import com.thinkbiganalytics.nifi.provenance.AggregationEventProcessingStats;
import com.thinkbiganalytics.nifi.provenance.model.ProvenanceEventRecordDTOHolder;
import com.thinkbiganalytics.nifi.provenance.model.stats.AggregatedFeedProcessorStatisticsHolder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javax.annotation.PostConstruct;
/**
* Send ProvenanceEvent data to JMS queues
* 2 Queues are used. The Queue names are constants shared with Kylo Operations Manager found in the {@link Queues} class.
* Queues.PROVENANCE_EVENT_STATS_QUEUE is the Statistics Queue name for creating the Summary statistics
* Queues.FEED_MANAGER_QUEUE is the Batch Provenance Events Queue for creating the Jobs/Steps in Kylo
*/
public class ProvenanceEventActiveMqWriter {
private static final Logger logger = LoggerFactory.getLogger(ProvenanceEventActiveMqWriter.class);
@Autowired
private SendJmsMessage sendJmsMessage;
private Map<String, Set<JmsSendListener>> listeners = new HashMap<>();
public ProvenanceEventActiveMqWriter() {
}
public void subscribe(JmsSendListener listener) {
this.listeners.computeIfAbsent(listener.getDestination(), (d) -> new HashSet<JmsSendListener>()).add(listener);
}
@PostConstruct
public void postConstruct() {
}
/**
* Notify any listeners of a successful JMS send
*/
private void notifySuccess(String destination, Object payload) {
if (this.listeners.containsKey(destination)) {
this.listeners.get(destination).stream().forEach(listener -> listener.successfulJmsMessage(destination, payload));
}
}
/**
* Notify any listeners of a JMS error in sending
*/
private void notifyError(String destination, Object payload, String errorMessge) {
if (this.listeners.containsKey(destination)) {
this.listeners.get(destination).stream().forEach(listener -> listener.errorJmsMessage(destination, payload, errorMessge));
}
}
/**
* Send the Statistics to JMS using the JMS Queue {@link Queues.PROVENANCE_EVENT_STATS_QUEUE}
*
* @param stats that statistics to send to JMS
*/
public void writeStats(AggregatedFeedProcessorStatisticsHolder stats) {
try {
if (stats.getEventCount().get() > 0) {
logger.info("SENDING AGGREGATED STAT to JMS {} ", stats);
sendJmsMessage.sendSerializedObjectToQueue(Queues.PROVENANCE_EVENT_STATS_QUEUE, stats);
AggregationEventProcessingStats.addStreamingEvents(stats.getEventCount().intValue());
notifySuccess(Queues.PROVENANCE_EVENT_STATS_QUEUE, stats);
}
} catch (Exception e) {
logger.error("JMS Error has occurred sending stats. Temporary queue has been disabled in this current version.", e);
notifyError(Queues.PROVENANCE_EVENT_STATS_QUEUE, stats, e.getMessage());
}
}
/**
* Send the Batched Events to the JMS Queue {@link Queues.FEED_MANAGER_QUEUE}
*
* @param events the events to send to JMS
*/
public void writeBatchEvents(ProvenanceEventRecordDTOHolder events) {
try {
logger.info("SENDING Events to JMS {} ", events);
sendJmsMessage.sendSerializedObjectToQueue(Queues.FEED_MANAGER_QUEUE, events);
AggregationEventProcessingStats.addBatchEvents(events.getEvents().size());
notifySuccess(Queues.FEED_MANAGER_QUEUE, events);
} catch (Exception e) {
logger.error("Error writing sending JMS ", e);
notifyError(Queues.FEED_MANAGER_QUEUE, events, e.getMessage());
}
}
}