1. 程式人生 > >ActiveMQ的佇列模式和主題模式

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個。但是前提條件是,這兩個消費者只能消費訂閱之後生產者釋出的訊息。