
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