package com.yihu.hos.common;

import com.yihu.hos.common.activeMq.ActiveMqConstants;
import com.yihu.hos.common.activeMq.ActivemqConfiguration;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.springframework.stereotype.Component;

import javax.jms.*;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author HZY
 * @vsrsion 1.0
 * Created at 2016/8/22.
 */
@Component
public class ActiveMqUtil {

    static ConnectionFactory connectionFactory;
    static Connection connection = null;
    static Session session;
    static Map<String, MessageProducer> sendQueues = new ConcurrentHashMap<String, MessageProducer>();

    static Map<String, MessageConsumer> getQueues = new ConcurrentHashMap<String, MessageConsumer>();


    static {
        ActivemqConfiguration configuration = new ActivemqConfiguration();
        connectionFactory = new ActiveMQConnectionFactory(
                ActiveMqConstants.ACTIVE_MQ_USER,
                ActiveMqConstants.ACTIVE_MQ_PASS,
                ActiveMqConstants.ACTIVE_MQ_URI);
        try
        {
            connection = connectionFactory.createConnection();

            connection.start();

            session = connection.createSession(Boolean.FALSE.booleanValue(),
                    1);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

    static MessageProducer getMessageProducer(String name) {
        if (sendQueues.containsKey(name))
            return ((MessageProducer)sendQueues.get(name));
        try
        {
            Destination destination = session.createQueue(name);
            MessageProducer producer = session.createProducer(destination);
            sendQueues.put(name, producer);
            return producer;
        } catch (JMSException e) {
            e.printStackTrace();
        }

        return ((MessageProducer)sendQueues.get(name));
    }

    static MessageConsumer getMessageConsumer(String name) {
        if (getQueues.containsKey(name))
            return ((MessageConsumer)getQueues.get(name));
        try
        {
            Destination destination = session.createQueue(name);
            MessageConsumer consumer = session.createConsumer(destination);
            getQueues.put(name, consumer);
            return consumer;
        } catch (JMSException e) {
            e.printStackTrace();
        }

        return ((MessageConsumer)getQueues.get(name));
    }

    public static void sendMessage(String queue, String text) {
        try {
            TextMessage message = session.createTextMessage(text);
            getMessageProducer(queue).send(message);
            // log.info("sendMessage " + queue + "\t\t" + text);
        }
        catch (JMSException e) {
            e.printStackTrace();
        }
    }



    public static String getMessage(String queue)
    {
        try {
            TextMessage message = (TextMessage)getMessageConsumer(queue).receive(10000L);
            if (message != null)
                return message.getText();
        } catch (JMSException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void close() {
        try {
            session.close();
        } catch (JMSException e) {
            e.printStackTrace();
        }
        try {
            connection.close();
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }

}
