package com.thinkbiganalytics.metadata.event.jms; /*- * #%L * thinkbig-metadata-rest-controller * %% * 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.metadata.api.MetadataAccess; import com.thinkbiganalytics.metadata.api.event.MetadataEventListener; import com.thinkbiganalytics.metadata.api.event.MetadataEventService; import com.thinkbiganalytics.metadata.api.event.feed.CleanupTriggerEvent; import com.thinkbiganalytics.metadata.api.event.feed.PreconditionTriggerEvent; import com.thinkbiganalytics.metadata.api.feed.Feed; import com.thinkbiganalytics.metadata.api.feed.FeedProvider; import com.thinkbiganalytics.metadata.rest.model.event.FeedCleanupTriggerEvent; import com.thinkbiganalytics.metadata.rest.model.event.FeedPreconditionTriggerEvent; import org.springframework.jms.core.JmsMessagingTemplate; import javax.annotation.Nonnull; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.inject.Inject; import javax.inject.Named; import javax.jms.Queue; /** * Listens for metadata events that should be transferred to a JMS topic. */ public class JmsChangeEventDispatcher { /** * Event listener for cleanup events */ private final MetadataEventListener<CleanupTriggerEvent> cleanupListener = new CleanupTriggerDispatcher(); /** * Event listener for precondition events */ private final MetadataEventListener<PreconditionTriggerEvent> preconditionListener = new PreconditionTriggerDispatcher(); /** * JMS topic for triggering feeds for cleanup */ @Inject @Named("cleanupTriggerQueue") private Queue cleanupTriggerQueue; /** * Metadata event bus */ @Inject private MetadataEventService eventService; /** * Feed object provider */ @Inject private FeedProvider feedProvider; /** * Spring JMS messaging template */ @Inject @Named("metadataMessagingTemplate") private JmsMessagingTemplate jmsMessagingTemplate; /** * Metadata transaction wrapper */ @Inject private MetadataAccess metadata; /** * JMS topic for triggering feeds based on preconditions */ @Inject @Named("preconditionTriggerQueue") private Queue preconditionTriggerQueue; /** * Adds listeners for transferring events. */ @PostConstruct public void addEventListener() { eventService.addListener(cleanupListener); eventService.addListener(preconditionListener); } /** * Removes listeners and stops transferring events. */ @PreDestroy public void removeEventListener() { eventService.removeListener(cleanupListener); eventService.removeListener(preconditionListener); } /** * Transfers cleanup events to JMS. */ private class CleanupTriggerDispatcher implements MetadataEventListener<CleanupTriggerEvent> { @Override public void notify(@Nonnull final CleanupTriggerEvent metadataEvent) { FeedCleanupTriggerEvent jmsEvent = new FeedCleanupTriggerEvent(metadataEvent.getData().toString()); metadata.read(() -> { Feed feed = feedProvider.getFeed(metadataEvent.getData()); jmsEvent.setFeedName(feed.getName()); jmsEvent.setCategoryName(feed.getCategory().getName()); return jmsEvent; }, MetadataAccess.SERVICE); jmsMessagingTemplate.convertAndSend(cleanupTriggerQueue, jmsEvent); } } /** * Transfers precondition events to JMS. */ private class PreconditionTriggerDispatcher implements MetadataEventListener<PreconditionTriggerEvent> { @Override public void notify(@Nonnull final PreconditionTriggerEvent event) { FeedPreconditionTriggerEvent triggerEv = new FeedPreconditionTriggerEvent(event.getData().toString()); metadata.read(() -> { Feed feed = feedProvider.getFeed(event.getData()); triggerEv.setFeedName(feed.getName()); triggerEv.setCategory(feed.getCategory().getName()); return triggerEv; }, MetadataAccess.SERVICE); jmsMessagingTemplate.convertAndSend(preconditionTriggerQueue, triggerEv); } } }