/**
*
*/
package jframe.ext.msg.pool;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import jframe.core.msg.Msg;
import jframe.core.msg.PluginMsg;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* <p>
* <li>消息创建</li>
* <li>和PoolDispatcher配对使用</li>
* <li>TODO 限制容量</li>
* </p>
*
* @author dzh
* @date Apr 4, 2014 2:16:56 PM
* @since 1.0
*/
public class MsgPool<V> {
private static final Logger LOG = LoggerFactory.getLogger(MsgPool.class);
private Queue<SoftReference<Msg<V>>> cacheQueue;
private final ReferenceQueue<Msg<V>> _rq = new ReferenceQueue<Msg<V>>();
private volatile boolean stop = false;
private final Thread clrRQ;
private MsgPool() {
cacheQueue = new ConcurrentLinkedQueue<SoftReference<Msg<V>>>();
clrRQ = new Thread("Clear RQ") {
public void run() {
while (!stop) {
try {
cacheQueue.remove(_rq.remove());
} catch (Exception e) {
LOG.warn(e.getMessage());
}
}
}
};
clrRQ.setDaemon(true);
clrRQ.start();
}
public Msg<V> getMsg() {
SoftReference<Msg<V>> msg = cacheQueue.poll();
if (msg == null || msg.get() == null) {
msg = new SoftReference<Msg<V>>(new PluginMsg<V>(), _rq);
try {
cacheQueue.add(msg);
} catch (Exception e) {
LOG.error(e.getMessage());
}
return msg.get();
}
return msg.get();
}
public void addMsg(Msg<V> msg) {
if (msg == null)
return;
msg.clear();
cacheQueue.add(new SoftReference<Msg<V>>(msg, _rq));
}
void close() {
stop = true;
clrRQ.interrupt();
cacheQueue.clear();
cacheQueue = null;
LOG.info("MsgPool is closed!");
}
}