activemq学习笔记

本文介绍了如何下载安装Apache ActiveMQ并运行,通过查看进程和端口占用来确认其运行状态。接着,展示了如何创建JMS消息队列的生产者和消费者,包括队列和主题的使用,并解释了两者之间的区别。同时,提到了消息的持久化、事务和签收等特性,并给出了相关示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先来张对比图,凑合看

 

 

1.下载安装

http://activemq.apache.org/activemq-5159-release

 

 

解压,运行

进入bin目录  ./activemq start

 

查看进程  ps -ef |grep activemq|grep -v grep

查看端口占用

netstat -anp|grep 61616

 

 访问页面

http://192.168.67.209:8161/

 

 用户名和密码都是admin

2.开发生产者和消费者(队列)

#生产者

public static void ProducerTest() throws Exception{
    //1、创建工厂连接对象,需要制定ip和端口号
    ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.67.209:61616");
    //2、使用连接工厂创建一个连接对象
    Connection connection = connectionFactory.createConnection();
    //3、开启连接
    connection.start();
    //4、使用连接对象创建会话 第一是叫事物,第二个是签收
    Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    //5、使用会话对象创建目标对象,包含queue和topic(一对一和一对多),目的地是队列还是主题
    Queue queue = session.createQueue("test-queue");
    //6、使用会话对象创建生产者对象
    MessageProducer producer = session.createProducer(queue);
    //7、使用会话对象创建一个消息对象
    for (int i=0;i<3;i++){
    TextMessage textMessage = session.createTextMessage("hello!test-queue...."+i);
    //8、发送消息
    producer.send(textMessage);}
    //9、关闭资源
    producer.close();
    session.close();
    connection.close();
}

 

 #消费者(该方式会堵塞线程不推荐)
 public static void ConsumerTest() throws Exception {
     //1、创建工厂连接对象,需要制定ip和端口号
     ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.67.209:61616");
     //2、使用连接工厂创建一个连接对象
     Connection connection = connectionFactory.createConnection();
     //3、开启连接
     connection.start();
     //4、使用连接对象创建会话 第一是叫事物,第二个是签收
     Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
     //5、使用会话对象创建目标对象,包含queue和topic(一对一和一对多),目的地是队列还是主题
     Queue queue = session.createQueue("test-queue");
     //6、使用会话对象创建生产者对象
     MessageConsumer messageConsumer = session.createConsumer(queue);
 
 
     /*该方式会堵塞线程,不推荐使用
     while (true) {
         //可加时间参数,如不填会一直等待,指定时间内没有消息会向下执行
         TextMessage textMessage = (TextMessage) messageConsumer.receive(4000);
         if (null != textMessage) {
             System.out.println("消费者消费消息=====" + textMessage.getText());
         } else {
             break;
         }
     }
     //9、关闭资源
     messageConsumer.close();
     session.close();
     connection.close();*/
 
     //7、向consumer对象中设置一个messageListener 监听 对象,用来接收消息
     messageConsumer.setMessageListener(new MessageListener() {
         @Override
         public void onMessage(Message message) {
             if(message instanceof TextMessage){
                 TextMessage textMessage = (TextMessage)message;
                 try {
                     System.out.println("消费者消费消息====="+textMessage.getText());
                 } catch (JMSException e) {
                     e.printStackTrace();
                 }
             }
         }
     });
     //8、程序等待接收用户消息
     System.in.read();
     //9、关闭资源
     messageConsumer.close();
     session.close();
     connection.close();
 }

如果一个生产者对应多个消费者,默认会轮询消费

如果使用主题 将Queue queue = session.createQueue("test-queue"); 修改为Topic topic = session.createTopic("test-topic"); 即可

当使用主题是,生产者一对多每个消费者会接到全部的消息。

注:主题模式应先开启消费者,再开生产者,否,先生产的消息不会被消费。

如果使用Map存储

//  生产者部分
        for (int i = 0; i < 3; i++) {
            TextMessage textMessage = session.createTextMessage("hello!test-queue...." + i);
            //8、发送消息
            producer.send(textMessage);
            MapMessage mapMessage=session.createMapMessage();
            mapMessage.setString("k1","mapMessage...hello_k1");
            producer.send(mapMessage);

        }
//消费者部分
        messageConsumer.setMessageListener(new MessageListener() {
            @Override
            public void onMessage(Message message) {
                if(message instanceof TextMessage){
                    TextMessage textMessage = (TextMessage)message;
                    try {
                        System.out.println("消费者消费消息====="+textMessage.getText());
                    } catch (JMSException e) {
                        e.printStackTrace();
                    }
                }
                if(message instanceof MapMessage){
                    MapMessage mapMessage = (MapMessage)message;
                    try {
                        System.out.println("消费者消费消息====="+mapMessage.getString("k1"));
                    } catch (JMSException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
主题开启持久化
//生产者
public static void ProducerTest() throws Exception {
        //1、创建工厂连接对象,需要制定ip和端口号
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.67.209:61616");
        //2、使用连接工厂创建一个连接对象
        Connection connection = connectionFactory.createConnection();
        //4、使用连接对象创建会话 第一是叫事物,第二个是签收
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //5、使用会话对象创建目标对象,包含queue和topic(一对一和一对多),目的地是队列还是主题
        //Queue queue = session.createQueue("test-queue");    //队列
        Topic topic = session.createTopic("test-topic2"); //主题
        //6、使用会话对象创建生产者对象
        // MessageProducer producer = session.createProducer(queue);  //队列
        MessageProducer producer = session.createProducer(topic);   //主题
        producer.setDeliveryMode(DeliveryMode.PERSISTENT); //开启生产者持久化
        //3、开启连接  需要放在开启持久化后
        connection.start();
        //7、使用会话对象创建一个消息对象
        for (int i = 0; i < 3; i++) {
            TextMessage textMessage = session.createTextMessage("hello!test-queue...." + i);
            //8、发送消息
            producer.send(textMessage);
        }
        //9、关闭资源
        producer.close();
        session.close();
        connection.close();
    }
//消费者
public static void ConsumerTest() throws Exception {
        //1、创建工厂连接对象,需要制定ip和端口号
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.67.209:61616");
        //2、使用连接工厂创建一个连接对象
        Connection connection = connectionFactory.createConnection();
        connection.setClientID("anpx");


        //4、使用连接对象创建会话 第一是叫事物,第二个是签收
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //5、使用会话对象创建目标对象,包含queue和topic(一对一和一对多),目的地是队列还是主题
        //Queue queue = session.createQueue("test-queue");    //队列
        Topic topic = session.createTopic("test-topic2"); //主题
        //持久化的订阅者
        TopicSubscriber subscriber = session.createDurableSubscriber(topic, "remark..");
        //3、开启连接
        connection.start();
        Message message = subscriber.receive();
        while (null != message) {
            TextMessage textMessage = (TextMessage) message;
            System.out.println("消费者消费消息:" + textMessage.getText());
            message = subscriber.receive(5000);
        }
        //9、关闭资源
        session.close();
        connection.close();
    }

 

 

 ***事物*** (主要是在生产者)

生产者

  1.Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);  //修改flase 为true
  2.session.commit(); //开启事务后必须commit才会提交    
如果没有commit

消费者

 1.Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //和生产者一样 修改flase 为true

     2.

***签收*** (主要是在消费者) 

     无事物自动签收时,消费这无需做任何操作,无事物手动签收时需要添加一行代码

while (null != message) {
            TextMessage textMessage = (TextMessage) message;
            System.out.println("消费者消费消息:" + textMessage.getText());
            message = subscriber.receive(5000);
            message.acknowledge(); //签收
        }

  有事物时,事物 >> 签收,有事物时如果不commit 签收也不会消费。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值