ActiveMQ Topic消息持久化订阅

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

第一步:在${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表中的数据就是我们持久化到数据库中的消息:

展开阅读全文

没有更多推荐了,返回首页