ActiveMQ Topic消息持久化订阅

本文介绍了ActiveMQ中Topic消息的两种持久化方式:默认的文件持久化和数据库(MySQL)持久化。文件持久化涉及配置适配器,而数据库持久化除了配置适配器还需设置数据源。详细步骤包括相关文件的修改和代码示例。

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

一、持久化到文件(默认)

第一步:在${activemq.base}/conf/activemq.xml文件中配置持久化适配器

第二步:在java代码中发送消息时

第三步:消息订阅方创建消费对象时

代码示例:

public class TopicPersistentTest {
    //编写消息的发送方---消息的生产者
    @Test
    public void test1() throws Exception {
        //创建连接工厂对象
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
        //从工厂中获取连接对象
        Connection connection = connectionFactory.createConnection();
        //连接MQ服务
        connection.start();
        //获得回话(session)对象
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //通过session对象创建Topic
        Topic topic = session.createTopic("itheimaTopic");
        //通过session对象创建消息的发送者
        MessageProducer producer = session.createProducer(topic);
        //通过session创建消息对象
        TextMessage message = session.createTextMessage("ping111");
        //发送消息
        producer.send(message,DeliveryMode.PERSISTENT,1,1000*60*60*24);
        //关闭相关资源
        producer.close();
        session.close();
        connection.close();
    }

    //编写消息的接收方---消息的消费者
    @Test
    public void test2() throws Exception {
        //创建连接工厂对象
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
        //从工厂中获取连接对象
        Connection connection = connectionFactory.createConnection();
        //设置客户端id
        connection.setClientID("client-1");
        //连接MQ服务
        connection.start();
        //获得回话(session)对象
        final Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //通过session对象创建Topic
        Topic topic = session.createTopic("itheimaTopic");
        //通过session对象创建消息的消费者
        //MessageConsumer consumer = session.createConsumer(topic);
        //客户端持久化订阅
        TopicSubscriber consumer = session.createDurableSubscriber(topic, "client1");
        //指定消息监听器
        consumer.setMessageListener(new MessageListener() {
            //当我们监听的topic 中存在消息 这个方法自动执行
            public void onMessage(Message message) {
                TextMessage textMessage = (TextMessage) message;
                try {
                    System.out.println("消费者接收到了消息:" + textMessage.getText());
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        });
        //消息消费者 要时刻在线 连接对象 会话对象均不需要关闭
        //模拟web场景当执行结束后不能让线程结束
        while (true) {
            //死循环  不让消费者线程停掉
        }
    }
}

二、持久化到数据库(mysql)

第一步:将mysql数据库驱动复制到activeMQ的lib目录下

 

第二步:在${activemq.base}/conf/activemq.xml文件中配置持久化适配器

 <persistenceAdapter>
			<jdbcPersistenceAdapter  dataDirectory = "${activemq.base}/data" dataSource = "#derby-ds"/>
        </persistenceAdapter>

第三步:在${activemq.base}/conf/activemq.xml文件中配置数据源

<bean id="derby-ds" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method = "close">
	     <property name="driverClassName" value="com.mysql.jdbc.Driver" />
		 <property name="url" value="jdbc:mysql://localhost/activemq?relaxAutoCommit=true"/>
		 <property name="username" value="root"/>
		 <property name="password" value="123456"/>
		 <property name="poolPreparedStatements" value="true"/>
	</bean>

代码同上代码示例相同

执行结果刷新active数据库生成了三张表

其中activmq_msgs表中的数据就是我们持久化到数据库中的消息:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值