本例子参考: http://blog.csdn.net/majian_1987/article/details/8489738
实现功能:后台接受消息,将消息数量推送到前端。主要使用阻塞队列来存放消息,后面若要取消息的话,当阻塞队列中无消息时,线程会阻塞等待。
阻塞队列参考:http://blog.csdn.net/conquer0715/article/details/12367087
部分代码如下:
public class ShowMessage implements ServletContextListener{
private static final String CHANNEL = "chat";
//创建一个长度为10的阻塞队列
public static ArrayBlockingQueue<String> messages = new ArrayBlockingQueue<String>(10);
XMPPConnection conn = null;
public void contextInitialized(ServletContextEvent arg0) {
CometContext cc = CometContext.getInstance();
cc.registChannel(CHANNEL);//注册一个频道,用于和前台互发消息
Thread getMsg = new Thread(new Runnable() {
public void run() {
Receiver r = new Receiver();
conn = r.getConnection(); //获取与openfire服务器的连接,并登录
conn.getChatManager().createChat("aa@youlian", new MessageListener() {
public void processMessage(Chat arg0, Message arg1) {
String msg = arg1.getBody();
messages.add(msg);
System.out.println("信息数量:"+messages.size());
CometEngine ce = CometContext.getInstance().getEngine();
ce.sendToAll(CHANNEL, messages.size());
}
});
}
});
getMsg.setDaemon(true);
getMsg.start();
}
public void contextDestroyed(ServletContextEvent arg0) {
}
}
前台页面:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Comet4J Hello World</title>
<script type="text/javascript" src="comet4j.js"></script>
<script type="text/javascript" src="jquery-2.1.1.js"></script>
<script type="text/javascript">
function init(){
var kbDom = document.getElementById('nums');
JS.Engine.on({
chat : function(nums){//侦听一个channel
kbDom.innerHTML = nums;
}
});
JS.Engine.start('receive');
}
</script>
</head>
<body οnlοad="init()">
接受的消息为:<span id="nums">0</span>。<br/>
</body>
</html>