刚学 ActiveMQ, 最开始搭建环境的时候引入的jar 包,几个核心的jar jms.jar, httpcore.jar , httpclient.jar, activemq-all.jar 准备完毕,启动junit 发现有好些个class 找不到,比如 PoolingClientConnectionManager 等,老是报 classnotfound 的错误,打开源代码一看,原来是引入的版本过低,将其版本升级到 4.2.1 就解决问题了。
ActiveMQ 最关心的就是消息的发送与接收了,消息发送不是问题,主要是消息接收,或者说是让消息不停地接收。
接收消息有两种方式,
方式一:
while(flag){
TextMessage message = (TextMessage)consumer.receive(1000 * 100);
if(message != null){
log.info("receive message : "+ message.getText());
if("stop".equals( message.getText())){
flag = false;
}
}
}
log.info("receiver server stop...");
这样就可以不间断地接收消息,当向客户端发送一个 “stop” 的时候,客户端进程将会结束。
方法二:
使用 MessageListener,开始学习MessageListener 的时候,无非就是在网上找些例子抄抄,实现代码如下:
<span style="white-space:pre"> </span>consumer.setMessageListener(new MessageListener(){
@Override
public void onMessage(Message msg) {
// TODO Auto-generated method stub
TextMessage message = (TextMessage)msg;
try {
log.info("receive message : "+ message.getText());
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
这是网上出现最多的helloworld 级别的 MessageListener 使用方式,但我把代码抄完了之后一运行,发现什么都没有发生,在ActiveMQ 控制台上也没有看到消息被接收了。
原来,网上抄了这段代码并不是一段完整的代码,
首先理解下“监听”, 上面的这段程序虽然注册了监听,但监听也有一个生命周期,在main方法里面或者 @Test 里面调用了之后,程序会立马接收,监听的生命周期也将结束,不会再起作用。
那么怎么解决呢?那就要让这段程序不被结束,then how? see the code as below:
<span style="white-space:pre"> </span>boolean flag = true;
while(flag){
Thread.sleep(1000 * 100);
}
这样你的main 或者@Test 就会被一直“挂起”,MessageListener 也就可以正常使用了。