org.duracloud.common.sns.config.SnsSubscriptionManagerConfig.java Source code

Java tutorial

Introduction

Here is the source code for org.duracloud.common.sns.config.SnsSubscriptionManagerConfig.java

Source

/*
 * The contents of this file are subject to the license and copyright
 * detailed in the LICENSE and NOTICE files at the root of the source
 * tree and available online at
 *
 *     http://duracloud.org/license/
 */

package org.duracloud.common.sns.config;

import java.io.IOException;
import java.net.Inet4Address;
import java.net.UnknownHostException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.amazonaws.services.sns.AmazonSNSClientBuilder;
import com.amazonaws.services.sqs.AmazonSQSClientBuilder;
import com.amazonaws.services.sqs.model.Message;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.duracloud.account.db.model.GlobalProperties;
import org.duracloud.account.db.repo.GlobalPropertiesRepo;
import org.duracloud.common.cache.AccountComponentCache;
import org.duracloud.common.error.DuraCloudRuntimeException;
import org.duracloud.common.event.AccountChangeEvent;
import org.duracloud.common.sns.MessageListener;
import org.duracloud.common.sns.SnsSubscriptionManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author Daniel Bernstein
 */
@Configuration
public class SnsSubscriptionManagerConfig {
    private Logger log = LoggerFactory.getLogger(SnsSubscriptionManagerConfig.class);

    @Bean(destroyMethod = "disconnect", initMethod = "connect")
    public SnsSubscriptionManager snsSubscriptionManager(GlobalPropertiesRepo globalPropertiesRepo,
            final List<AccountComponentCache<?>> componentCaches, String appName) {
        try {

            GlobalProperties props = globalPropertiesRepo.findAll().get(0);
            String queueName = "node-queue-" + appName + "-"
                    + Inet4Address.getLocalHost().getHostName().replace(".", "_");
            SnsSubscriptionManager subscriptionManager = new SnsSubscriptionManager(
                    AmazonSQSClientBuilder.defaultClient(), AmazonSNSClientBuilder.defaultClient(),
                    props.getInstanceNotificationTopicArn(), queueName);

            subscriptionManager.addListener(new MessageListener() {
                @Override
                public void onMessage(Message message) {
                    log.info("message received: " + message);
                    log.debug("message body: " + message.getBody());
                    JsonFactory factory = new JsonFactory();
                    ObjectMapper mapper = new ObjectMapper(factory);
                    TypeReference<HashMap<String, String>> typeRef = new TypeReference<HashMap<String, String>>() {
                    };
                    String body = message.getBody();
                    try {
                        Map<String, String> map = mapper.readValue(body, typeRef);
                        AccountChangeEvent event = AccountChangeEvent.deserialize(map.get("Message"));
                        for (AccountComponentCache<?> cache : componentCaches) {
                            cache.onEvent(event);
                        }
                    } catch (IOException e) {
                        log.warn("unable to dispatch message: " + message + " : " + e.getMessage(), e);
                    }
                }
            });

            return subscriptionManager;
        } catch (UnknownHostException e) {
            throw new DuraCloudRuntimeException(e);
        }
    }

}