ActiveMQ 发送和接收消息

一、添加 jar 包

<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-all</artifactId>
    <version>5.11.2</version>
</dependency>

二、消息传递的两种形式

  1、点对点:发送的消息只能被一个消费者接收,第一个消费者接收后,消息没了

  2、发布/订阅:消息可以被多个消费者接收 。发完消息,如果没有消费者接收,这消息会自动消失。也就是说,消费者服务必须是启动的状态。( topic 消息在 ActiveMQ 服务端默认不是持久化的,可以通过配置文件配置持久化 )

三、点对点发送消息

/**
 * 点到点形式发送消息
 * @throws Exception
 */
@Test
public void testQueueProducer() throws Exception{
    //1、创建一个连接工厂,需要指定服务的 ip 和端口
    String brokerURL = "tcp://192.168.25.129:61616";
    ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerURL);
    //2、使用工厂对象创建一个 Connection 对象
    Connection connection = connectionFactory.createConnection();
    //3、开启连接,调用 Connection 对象的 start 方法
    connection.start();
    //4、创建一个 Session 对象。
        //第一个参数:是否开启事务(一般不开启,如果开启事务,第二个参数没意义);
        //第二个参数:应答模式。自动应答或者手动应答,一般是自动应答
    Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    //5、使用 Session 对象创建一个 Destination 对象。两种形式 queue、topic。
    Queue queue = session.createQueue("test-queue");
    //6、使用 Session 对象创建一个 Producer 对象
    MessageProducer producer = session.createProducer(queue);
    //7、创建一个 Message 对象,可以使用 TextMessage。下面两种方式都可以
    /*TextMessage textMessage = new ActiveMQTextMessage(); 
    textMessage.setText("hello ActiveMQ");*/
    TextMessage textMessage = session.createTextMessage("hello ActiveMQ");
    //8、发布消息
    producer.send(textMessage);
    //9、关闭资源
    producer.close();
    session.close();
    connection.close();
}

四、点对点接收消息

/**
 * 点对点接收消息
 * @throws Exception
 */
@Test
public void testQueueConsumer() throws Exception{
    //1、创建一个 ConnectionFactory 对象连接 MQ 服务器
    String brokerURL = "tcp://192.168.25.129:61616";
    ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerURL);
    //2、创建一个连接对象
    Connection connection = connectionFactory.createConnection();
    //3、开启连接
    connection.start();
    //4、使用 Connection 对象 创建一个 Session 对象
    Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    //5、创建一个 Destination 对象。queue 对象
    Queue queue = session.createQueue("test-queue");
    //6、使用 Session 对象创建一个消费者
    MessageConsumer consumer = session.createConsumer(queue);
    //7、接收消息
    consumer.setMessageListener(new MessageListener() {
        
        @Override
        public void onMessage(Message message) {
            //8、打印结果
            TextMessage textMessage = (TextMessage) message;
            
            try {
                String text = textMessage.getText();
                System.out.println(text);
            } catch (JMSException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
    });
    
    //9、等待接收消息。( 接收到消息后才网下面执行。关闭资源 )
    System.in.read();
    //10、关闭资源
    consumer.close();
    session.close();
    connection.close();
    
}

 五、广播发送消息

/**
 * 广播发送消息
 * @throws Exception
 */
@Test
public void testTopicProducer() throws Exception{
    //1、创建一个连接工厂,需要指定服务的 ip 和端口
    String brokerURL = "tcp://192.168.25.129:61616";
    ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerURL);
    //2、使用工厂对象创建一个 Connection 对象
    Connection connection = connectionFactory.createConnection();
    //3、开启连接,调用 Connection 对象的 start 方法
    connection.start();
    //4、创建一个 Session 对象。
        //第一个参数:是否开启事务(一般不开启,如果开启事务,第二个参数没意义);
        //第二个参数:应答模式。自动应答或者手动应答,一般是自动应答
    Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    //5、使用 Session 对象创建一个 Destination 对象。两种形式 queue、topic。
    Topic topic = session.createTopic("test-topic");
    //6、使用 Session 对象创建一个 Producer 对象
    MessageProducer producer = session.createProducer(topic);
    //7、创建一个 Message 对象,可以使用 TextMessage。下面两种方式都可以
    /*TextMessage textMessage = new ActiveMQTextMessage(); 
    textMessage.setText("hello ActiveMQ");*/
    TextMessage textMessage = session.createTextMessage("hello ActiveMQ");
    //8、发布消息
    producer.send(textMessage);
    //9、关闭资源
    producer.close();
    session.close();
    connection.close();
}

六、广播接收消息

/**
 * 广播接收消息
 * @throws Exception
 */
@Test
public void testTopicConsumer() throws Exception{
    //1、创建一个 ConnectionFactory 对象连接 MQ 服务器
    String brokerURL = "tcp://192.168.25.129:61616";
    ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerURL);
    //2、创建一个连接对象
    Connection connection = connectionFactory.createConnection();
    //3、开启连接
    connection.start();
    //4、使用 Connection 对象 创建一个 Session 对象
    Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    //5、创建一个 Destination 对象。Topic 对象
    Topic topic = session.createTopic("test-topic");
    //6、使用 Session 对象创建一个消费者
    MessageConsumer consumer = session.createConsumer(topic);
    //7、接收消息
    consumer.setMessageListener(new MessageListener() {
        
        @Override
        public void onMessage(Message message) {
            //8、打印结果
            TextMessage textMessage = (TextMessage) message;
            
            try {
                String text = textMessage.getText();
                System.out.println(text);
            } catch (JMSException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
    });
    System.out.println("topic消费者");
    //9、等待接收消息。( 接收到消息后才网下面执行。关闭资源 )
    System.in.read();
    //10、关闭资源
    consumer.close();
    session.close();
    connection.close();  
}

 

posted @ 2018-03-29 12:16  方方方方方方  阅读(975)  评论(0编辑  收藏  举报