/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package com.emc.sa.zookeeper; import java.io.IOException; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import com.emc.storageos.coordinator.client.service.CoordinatorClient; import com.emc.storageos.coordinator.client.service.DistributedQueue; import com.emc.storageos.coordinator.client.service.DrPostFailoverHandler.QueueCleanupHandler; import com.emc.storageos.coordinator.client.service.impl.DistributedQueueConsumer; import com.emc.storageos.coordinator.client.service.impl.GenericSerializer; import org.apache.curator.framework.recipes.queue.QueueSerializer; public class GenericQueue<T> { private static final Logger LOG = Logger.getLogger(GenericQueue.class); private static int DEFAULT_WORK_THREADS = 10; private String name; private int workThreads = DEFAULT_WORK_THREADS; @Autowired private CoordinatorClient coordinatorClient; @Autowired private QueueCleanupHandler drQueueCleanupHandler; private DistributedQueue<T> queue; public void setWorkThreads(int workThreads) { this.workThreads = workThreads; } public void setName(String name) { this.name = name; } public void setCoordinatorClient(CoordinatorClient coordinatorClient) { this.coordinatorClient = coordinatorClient; } @PostConstruct public void start() { LOG.info("Starting queue: " + name); if (!coordinatorClient.isConnected()) { try { LOG.info("Starting coordinator for: " + name); coordinatorClient.start(); } catch (IOException e) { throw new RuntimeException("Error Starting Coordinator Client", e); } } drQueueCleanupHandler.run(); } @PreDestroy public void stop() { // Queue could be null if neither listenForRequests or putItem has been called if (queue != null) { queue.stop(0); } } public void listenForRequests(DistributedQueueConsumer<T> listener) throws Exception { LOG.info("Listening for requests on: " + name); queue = coordinatorClient.getQueue(name, listener, new Serializer<T>(), workThreads); } public void putItem(T item) throws Exception { if (queue == null) { LOG.info("Creating queue: " + name); queue = coordinatorClient.getQueue(name, null, new Serializer<T>(), workThreads); } LOG.info("Adding item to queue: " + name); queue.put(item); } private static class Serializer<T> implements QueueSerializer<T> { @Override public byte[] serialize(T item) { return GenericSerializer.serialize(item, null, true); } @Override @SuppressWarnings("unchecked") public T deserialize(byte[] bytes) { return (T) GenericSerializer.deserialize(bytes); } } }