import com.lenovo.lps.LpsRuntimeException;
public class JMSRuntimeException extends LpsRuntimeException{
private static final long serialVersionUID = 4562443620320605420L;
public JMSRuntimeException() {
super();
}
public JMSRuntimeException(String msg) {
super(msg);
}
public JMSRuntimeException(Throwable cause) {
super(cause);
}
public JMSRuntimeException(String msg, Throwable cause) {
super(msg, cause);
}
}
public interface JmsSender {
public void sendJmsMessage(Object obj);
}
import javax.jms.JMSException;
import org.springframework.jms.listener.SimpleMessageListenerContainer;
import com.lenovo.lps.log.Log;
public class LpsMessageListenerContainer extends SimpleMessageListenerContainer {
protected Log log = Log.getInstance(this.getClass());
@Override
protected void doInitialize() throws JMSException {
super.doInitialize();
log.info("Start Jms ReceiverContainer[" + this.getClass().getName()
+ "] succeed!");
}
}
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import com.lenovo.lps.log.Log;
import com.lenovo.lps.util.IocUtils;
/**
* 多线程的Jms消息发送器 该类的初始化工作由Spring设置好属性后完成
*
*
*
*/
public class MultiThreadJmsSender {
protected ExecutorService executor;
protected BlockingQueue<JmsSender> jmsSenderQueue;
protected int senderNum;
protected boolean inited;
protected String jmsSenderName;
/**任务队列的最大容量*/
protected int taskSize;
protected Log log = Log.getInstance(this.getClass());
public void send(Object msg) {
if (!inited) {
init();
}
executor.execute(new SendTask(msg));
}
protected Object beforeSend(Object obj) {
return obj;
}
/**
* 做初始化工作
*/
public void init() {
if (executor == null) {
if (taskSize > 0) {
executor = new ThreadPoolExecutor(senderNum, senderNum, 0L,
TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<Runnable>(taskSize),
new ThreadPoolExecutor.DiscardOldestPolicy());
}else{
executor = Executors.newFixedThreadPool(senderNum);
}
}
jmsSenderQueue = new LinkedBlockingQueue<JmsSender>();
for (int i = 0; i < senderNum; i++) {
jmsSenderQueue.offer((JmsSender) IocUtils.getBean(jmsSenderName));
}
inited = true;
}
public ExecutorService getExecutor() {
return executor;
}
public void setExecutor(ExecutorService executor) {
this.executor = executor;
}
public BlockingQueue<JmsSender> getJmsSenderQueue() {
return jmsSenderQueue;
}
public void setJmsSenderQueue(BlockingQueue<JmsSender> jmsSenderQueue) {
this.jmsSenderQueue = jmsSenderQueue;
}
public int getSenderNum() {
return senderNum;
}
public void setSenderNum(int senderNum) {
this.senderNum = senderNum;
}
public boolean isInited() {
return inited;
}
public void setInited(boolean inited) {
this.inited = inited;
}
public String getJmsSenderName() {
return jmsSenderName;
}
public void setJmsSenderName(String jmsSenderName) {
this.jmsSenderName = jmsSenderName;
}
public int getTaskSize() {
return taskSize;
}
public void setTaskSize(int taskSize) {
this.taskSize = taskSize;
}
protected class SendTask implements Runnable {
protected Object content;
protected SendTask() {
}
protected SendTask(Object content) {
this.content = content;
}
public Object getContent() {
return content;
}
public void setContent(Object content) {
this.content = content;
}
public void run() {
JmsSender sender = null;
try {
sender = jmsSenderQueue.take();
sender.sendJmsMessage(beforeSend(content));
} catch (InterruptedException e) {
Thread.currentThread().interrupt();//恢复中断
} catch (Exception e) {
log.error("Send message failed!", e);
} finally {
if (sender != null) {
jmsSenderQueue.offer(sender);
}
}
}
}
}