All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.alogic.rabbitmq.consumer.Topic Maven / Gradle / Ivy

package com.alogic.rabbitmq.consumer;

import java.io.IOException;

import org.apache.commons.lang3.exception.ExceptionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Element;

import com.alogic.rabbitmq.MQConsumer;
import com.alogic.rabbitmq.MQServer;
import com.anysoft.util.Properties;
import com.anysoft.util.PropertiesConstants;
import com.anysoft.util.XmlElementProperties;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.ShutdownSignalException;

public class Topic implements Consumer,MQConsumer,Runnable{

	/**
	 * a logger of slf4j
	 */
	protected static final Logger LOG = LoggerFactory.getLogger(Direct.class);
	
	/**
	 * exchange
	 */
	protected String exchange = "default";
	
	/**
	 * MQServer
	 */
	protected MQServer server;
	
	/**
	 * Connection
	 */
	protected Connection conn;
	
	/**
	 * Channel
	 */
	protected Channel channel;
	
	/**
	 * consumerTag,由服务器生成
	 */
	protected String consumerTag;
	
	/**
	 * 队列
	 */
	protected String queue;
	
	/**
	 * 绑定key
	 */
	protected String bindings;

	protected boolean durable = true;
	
	protected boolean exclusive = false;
	
	protected boolean autoDelete = false;
	
	/**
	 * 工作线程
	 */
	protected Thread thread;
	
	public Topic(){
	}

	@Override
	public void configure(Element e, Properties p) {
		Properties props = new XmlElementProperties(e,p);
		configure(props);
	}
	
	@Override
	public void configure(Properties p) {
		exchange = PropertiesConstants.getString(p,"exchange",exchange);
		bindings = PropertiesConstants.getString(p,"bindings","");
		durable = PropertiesConstants.getBoolean(p,"durable",durable);
		exclusive = PropertiesConstants.getBoolean(p,"exclusive",exclusive);
		autoDelete = PropertiesConstants.getBoolean(p,"autoDelete",autoDelete);				
	}

	@Override
	public void start(MQServer server) {
		this.server = server;
		ConnectionFactory connFactory = server.getConnectionFactory();
		try {
			conn = connFactory.newConnection();
	        channel = conn.createChannel();
	        channel.exchangeDeclare(exchange, "topic",durable,exclusive,autoDelete,null);
	        queue = channel.queueDeclare().getQueue();
	       
	        String [] binding = bindings.split(",");
	        if (binding.length > 0){
	        	for (String b:binding){
	        		 channel.queueBind(queue, exchange,b);
	        	}
	        }else{
	        	LOG.warn(String.format("Consumer %s has not binded any keys.",exchange));
	        }
	        
	        thread = new Thread(this);
	        thread.setDaemon(true);
	        thread.start();
	        LOG.info(String.format("Consumer %s start..", exchange));
		} catch (Exception e) {
			LOG.error("Failed to start mq consumer..");
			LOG.error(ExceptionUtils.getStackTrace(e));
		}
	}

	@Override
	public void stop(MQServer server) {
		try {
			if (channel != null){
				channel.basicCancel(consumerTag);
				channel.close();
			}
			if (conn != null){
				conn.close(1000);
			}
		}catch (Exception ex){
			
		}
	}
	
	@Override
	public void run() {
		try {
			consumerTag = channel.basicConsume(queue,true,this);
		} catch (IOException e) {
			LOG.error("Failed to start mq consumer..");
			LOG.error(ExceptionUtils.getStackTrace(e));
		}
	}
	
	@Override
	public void handleConsumeOk(String consumerTag) {
		LOG.info(String.format("Consumer %s registered.",consumerTag));
	}

	@Override
	public void handleCancelOk(String consumerTag) {
		LOG.info(String.format("Consumer %s canceled.",consumerTag));
	}

	@Override
	public void handleCancel(String consumerTag) throws IOException {
		LOG.info(String.format("Consumer %s canceled forcedly.",consumerTag));
	}

	@Override
	public void handleDelivery(String consumerTag,Envelope envelope,AMQP.BasicProperties properties,byte[] body) throws IOException {
		server.dispatch(queue, body);
	}

	@Override
	public void handleShutdownSignal(String consumerTag,
			ShutdownSignalException sig) {
		LOG.info(String.format("Consumer %s shutdown.",consumerTag));
	}

	@Override
	public void handleRecoverOk(String consumerTag) {
		LOG.info(String.format("Consumer %s recover.",consumerTag));
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy