ActiveMQ【三】消息存储和持久化

ActiveMQ 消息高可用体现

  1. 事务
  2. 持久化方式
  3. 签收
  4. 消息持久化机制
    在这里插入图片描述
    官网介绍
    http://activemq.apache.org/persistence

有哪些:
在这里插入图片描述
KahaDB消息介绍


官网介绍
http://activemq.apache.org/kahadb

activemq.xml 配置位置
在这里插入图片描述
意思是存储文件在 /data/kahadb/ 文件内容如下所示
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
JDBC 消息存储

下载mysql jdbc驱动并上传到activemq安装目录/bin/ 目录下:如下所示
在这里插入图片描述
修改activemq.xml配置文件
修改前:

        <persistenceAdapter>
            <kahaDB directory="${activemq.data}/kahadb"/>
        </persistenceAdapter>

官网介绍—
在这里插入图片描述
修改后:

        <persistenceAdapter>
 	<jdbcPersistenceAdapter dataSource="#mysql-ds" createTablesOnStartup="true" /> 
<!--            <kahaDB directory="${activemq.data}/kahadb"/>-->
        </persistenceAdapter>
createTablesOnStartup  为true自动创建表

在这里插入图片描述

新增数据源配置

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

示例:
在这里插入图片描述
启动成功之后查看mysql activemq数据库会出现四张表
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
使用Queue 进行持久化操作:发送三条消息
在这里插入图片描述
mysql activemq_msgs表如下显示:
在这里插入图片描述
Queue接受操作之后,我们再看数据库

在这里插入图片描述
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); 非持久化操作,数据将存储到内存中。

Topic 进行持久化操作,先监听消息,然后发送消息。查看mysql数据库
监听:

/**
     * topic 持久化接收
     *
     * @throws JMSException
     * @throws IOException
     */
    @Test
    public void topicDurableSubscriber() throws JMSException, IOException {
        Connection connection = activeMQConnectionFactory.createConnection();
        connection.setClientID("z4");
        Session session = connection.createSession(true, Session.CLIENT_ACKNOWLEDGE);
        Topic topic = session.createTopic(TOPIC_NAME);
        TopicSubscriber topicSubscriber = session.createDurableSubscriber(topic, "备注");
        connection.start();
        topicSubscriber.setMessageListener((t) -> {
            if (null != t && t instanceof TextMessage) {
                TextMessage t1 = (TextMessage) t;
                try {
                    System.out.println("监听模式Topic持久化:" + t1.getText());
//                    t1.acknowledge();
                    session.commit();
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        });
        System.in.read();//等待
    }

发送消息:

/**
     * topic 持久化发送
     * @throws JMSException
     * @throws IOException
     */
    @Test
    public void topicSendDurableSubscriber() throws JMSException, IOException {
        Connection connection = activeMQConnectionFactory.createConnection();
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        Topic topic = session.createTopic(TOPIC_NAME);
        MessageProducer producer = session.createProducer(topic);
        producer.setDeliveryMode(DeliveryMode.PERSISTENT);
        connection.start();
        //        发送消息
        for (int i = 1; i <= 6; i++) {
            TextMessage textMessage = session.createTextMessage();
            textMessage.setText("Topic持久化发送:" + i);
            textMessage.setJMSMessageID(UUID.randomUUID().toString());
            producer.send(textMessage);
        }
    }

数据库示例:
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值