同步接收
receive()方法接收消息叫同步接收一個線程在工作,接收到消息后,執行結束只能接收一次消息,如果想不間斷地接收消息,寫一個while true循環。
使用監聽器接收消息,這種接收方式叫異步接收,兩個線程在工作,一個負責接收消息,一個負責處理消息。
為了實現不間斷的監聽接收消息,在開發代碼的時候,我們不應該關閉連接。
注意
在同一個consumer中,我們不能同時使用這2種接收方式;
比如在使用listener的情況下,當調用receive()方法將會獲得一個Exception;
● 監聽器監聽指定目的地的消息
● 如果有消息,那么監聽器回調onMessage方法,并將消息傳遞給該方法
● 在該方法中對消息進行處理
● 拷貝QueueReceiver類,新的類名字為QueueListenerReceiver
● 將對消息的處理放到監聽器的onMessage方法中
messageConsumer = session.createConsumer(destination,messageSelector);
messageConsumer.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
try {
//判斷消息類型是否為文本消息
if(message instanceof TextMessage){
String text = ((TextMessage) message).getText();
System.out.println(text);
}else if(message instanceof ObjectMessage){
User user = (User) ((ObjectMessage) message).getObject();
System.out.println("接收的對象:"+user.getId() +"::"+ user.getName()+"::"+user.getAge());
}else if(message instanceof MapMessage){
System.out.println(((MapMessage) message).getString("school")
+"辦學"+((MapMessage) message).getInt("age") +"年了");
}else if(message instanceof BytesMessage){
boolean flag = ((BytesMessage) message).readBoolean();
String s = ((BytesMessage) message).readUTF();
System.out.println(flag +":::"+s);
}else if(message instanceof StreamMessage){
Long lo = ((StreamMessage) message).readLong();
String s = ((StreamMessage) message).readString();
System.out.println(lo +":::"+s);
}
//手動確認消息,如果不確認,消息不會被成功消費
message.acknowledge();
}catch (Exception e){
e.printStackTrace();
}
}
});