package com.taobao.metamorphosis.client.extension.spring;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.DisposableBean;
import com.taobao.metamorphosis.Message;
import com.taobao.metamorphosis.client.consumer.MessageListener;
/**
* Default message listener.
*
* @author dennis<killme2008@gmail.com>
* @since 1.4.5
*
* @param <T>
*/
public abstract class DefaultMessageListener<T> implements MessageListener,
org.springframework.beans.factory.InitializingBean, DisposableBean {
private MessageBodyConverter<?> messageBodyConverter;
static final Log log = LogFactory.getLog(DefaultMessageListener.class);
private int processThreads = -1;
private ExecutorService executor;
protected void setExecutor(ExecutorService executor) {
this.executor = executor;
}
/**
* Returns the threads number for processing messages.
*
* @return
*/
public int getProcessThreads() {
return this.processThreads;
}
public MessageBodyConverter<?> getMessageBodyConverter() {
return this.messageBodyConverter;
}
public void setMessageBodyConverter(MessageBodyConverter<?> messageBodyConverter) {
this.messageBodyConverter = messageBodyConverter;
}
/**
* Set the threads number for processing messages.
*
* @param processThreads
*/
public void setProcessThreads(int processThreads) {
if (processThreads < 0) {
throw new IllegalArgumentException("Invalid processThreads value:" + processThreads);
}
this.processThreads = processThreads;
}
@Override
public void recieveMessages(Message message) throws InterruptedException {
if (this.messageBodyConverter != null) {
try {
T body = (T) this.messageBodyConverter.fromByteArray(message.getData());
this.onReceiveMessages(new MetaqMessage<T>(message, body));
}
catch (Exception e) {
log.error("Convert message body from byte array failed,msg id is " + message.getId() + " and topic is "
+ message.getTopic(), e);
message.setRollbackOnly();
}
}
else {
this.onReceiveMessages(new MetaqMessage<T>(message, null));
}
}
public abstract void onReceiveMessages(MetaqMessage<T> msg);
@Override
public void afterPropertiesSet() throws Exception {
if (this.processThreads > 0) {
this.executor = Executors.newFixedThreadPool(this.processThreads);
}
}
@Override
public void destroy() throws Exception {
if (this.executor != null) {
this.executor.shutdown();
this.executor = null;
}
}
@Override
public Executor getExecutor() {
return this.executor;
}
}