package com.packtpub.hibernatesearch.startup;

import javax.jms.Connection;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.Queue;
import javax.jms.Session;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Klasa powinna być opakowana w wątek i utworzona przez MasterNode Initializer... by monitorować kolejkę JMS oraz 
 * wykonywać aktualizacje indeksów zainicjowanie przez węzły podrzędne. Gdy nadchodzi wiadomość, instancja 
 * QueueController (dziedzicząca po klasie Hibernate Search AbstractJMSHibernateSearchController) wykonuje operacje 
 * na Lucene.
 * 
 * W pełnym środowisku JEE, mógłbyś opakować klasę dziedziczącą po AbstractJMSHibernateSearchController w bean sterowany  
 * wiadomościami lub  podobny mechanizm wbudowany w wybrany przez ciebie framework.  Użyte tutaj Runnable jest 
 * dobrym substytutem.
 */
public class QueueMonitor implements Runnable {
	
	Logger logger = LoggerFactory.getLogger(QueueMonitor.class);

	QueueController controller;
	
	QueueMonitor(QueueController controller) {
		this.controller = controller;
	}
	
	public void run() {
		try {
			ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost");
			Connection connection = connectionFactory.createConnection();
			connection.start();
			Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
			Queue queue = session.createQueue("DEMO");
			MessageConsumer consumer = session.createConsumer(queue);
			while(true) {
				Message message = consumer.receive(60000);
				if(message != null) {
					logger.info("QueueMonitor przetwarza wiadomość: " + message.toString());
					controller.onMessage(message);
				}
			}
		} catch (JMSException e) {
			e.printStackTrace();
		}
	}

}
