ActiveMQ的佇列模式和主題模式
佇列模式
例項程式碼
/** * 生產者 */ public class AppProducer { private static final String url="tcp://192.168.63.137:61616"; private static final String queueName="queue-test"; public static void main(String[] args) throws JMSException { //1.建立ConnectionFactory ConnectionFactory factory=new ActiveMQConnectionFactory(url); //2.建立Connection Connection connection=factory.createConnection(); //3.啟動連線 connection.start(); //4.建立會話 Session session=connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //5.建立一個目標 Destination destination=session.createQueue(queueName); //6.建立一個生產者 MessageProducer producer=session.createProducer(destination); for(int i=0;i<100;i++){ //7.建立訊息 TextMessage textMessage=session.createTextMessage("fut"+i); //8.釋出訊息 producer.send(textMessage); System.out.println("傳送訊息 "+textMessage.getText()); } //9.關閉連線 session.close(); } } /** * 消費者 */ public class AppConsumer { private static final String url="tcp://192.168.63.137:61616"; private static final String queueName="queue-test"; public static void main(String[] args) throws JMSException { //1.建立ConnectionFactory ConnectionFactory factory=new ActiveMQConnectionFactory(url); //2.建立Connection Connection connection=factory.createConnection(); //3.啟動連線 connection.start(); //4.建立會話 Session session=connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //5.建立一個目標 Destination destination=session.createQueue(queueName); //6.建立一個消費者 MessageConsumer consumer=session.createConsumer(destination); //7.建立一個監聽器 consumer.setMessageListener(new MessageListener() { @Override public void onMessage(Message message) { TextMessage textMessage=(TextMessage)message; try { System.out.println("接收訊息"+textMessage.getText()); } catch (JMSException e) { e.printStackTrace(); } } }); //8.關閉連線 // session.close(); } }
執行測試
1》執行AppProducer類,結果:
傳送訊息 fut0
傳送訊息 fut1
傳送訊息 fut2
傳送訊息 fut3
傳送訊息 fut4
傳送訊息 fut5
…
傳送訊息 fut95
傳送訊息 fut96
傳送訊息 fut97
傳送訊息 fut98
傳送訊息 fut99
2》執行一次AppConsumer類,結果同上
3》執行兩次AppConsumer類,2個AppConsumer類都屬於監聽狀態,再執行AppProducer類
AppConsumer1結果:
傳送訊息 fut1
傳送訊息 fut3
傳送訊息 fut5
…
傳送訊息 fut97
傳送訊息 fut99
AppConsumer2結果:
傳送訊息 fut2
傳送訊息 fut4
傳送訊息 fut6
…
傳送訊息 fut96
傳送訊息 fut98
結果分析
佇列模式一個訊息只能被一個消費者消費,所以2個消費者同時消費100個訊息時,每個消費者平均消費50個。
主題模式
例項程式碼
/** * 生產者 */ public class AppProducer { private static final String url="tcp://192.168.63.137:61616"; private static final String topicName="topic-test"; public static void main(String[] args) throws JMSException { //1.建立ConnectionFactory ConnectionFactory factory=new ActiveMQConnectionFactory(url); //2.建立Connection Connection connection=factory.createConnection(); //3.啟動連線 connection.start(); //4.建立會話 Session session=connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //5.建立一個目標 Destination destination=session.createTopic(topicName); //6.建立一個生產者 MessageProducer producer=session.createProducer(destination); for(int i=0;i<100;i++){ //7.建立訊息 TextMessage textMessage=session.createTextMessage("fut"+i); //8.釋出訊息 producer.send(textMessage); System.out.println("傳送訊息 "+textMessage.getText()); } //9.關閉連線 session.close(); } } /** * 消費者 */ public class AppConsumer { private static final String url="tcp://192.168.63.137:61616"; private static final String topicName="topic-test"; public static void main(String[] args) throws JMSException { //1.建立ConnectionFactory ConnectionFactory factory=new ActiveMQConnectionFactory(url); //2.建立Connection Connection connection=factory.createConnection(); //3.啟動連線 connection.start(); //4.建立會話 Session session=connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //5.建立一個目標 Destination destination=session.createTopic(topicName); //6.建立一個消費者 MessageConsumer consumer=session.createConsumer(destination); //7.建立一個監聽器 consumer.setMessageListener(new MessageListener() { @Override public void onMessage(Message message) { TextMessage textMessage=(TextMessage)message; try { System.out.println("接收訊息"+textMessage.getText()); } catch (JMSException e) { e.printStackTrace(); } } }); //8.關閉連線 // session.close(); } }
執行測試
1》執行AppProducer類,結果:
傳送訊息 fut0
傳送訊息 fut1
傳送訊息 fut2
傳送訊息 fut3
傳送訊息 fut4
傳送訊息 fut5
…
傳送訊息 fut95
傳送訊息 fut96
傳送訊息 fut97
傳送訊息 fut98
傳送訊息 fut99
3》執行兩次AppConsumer類,2個AppConsumer類都屬於監聽狀態,再執行AppProducer類
AppConsumer1結果:
傳送訊息 fut1
傳送訊息 fut2
傳送訊息 fut3
…
傳送訊息 fut98
傳送訊息 fut99
AppConsumer2結果:
傳送訊息 fut1
傳送訊息 fut2
傳送訊息 fut3
…
傳送訊息 fut98
傳送訊息 fut99
結果分析
主題模式和佇列模式程式碼基本相似,主題模式下,多個消費者可以同時消費所有訊息,所以2個消費者同時消費100個訊息時,每個消費者都可以消費100個。但是前提條件是,這兩個消費者只能消費訂閱之後生產者釋出的訊息。