【原创】ActiveMQ集群JDBC持久化

在activemq.xml中配置持久化方式:

<bean id="oracle-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
  <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/> 
     <property name="url" value="jdbc:oracle:thin:@172.20.70.20:1521:ORCL"/>   
      <property name="username" value="active"/>    
      <property name="password" value="active"/>    
      <property name="poolPreparedStatements" value="true"/> 
       </bean>

注意不需要创建相关的表,activemq会自动创建三个表:

select * from ACTIVEMQ_MSGS;
select * from ACTIVEMQ_ACKS;
select * from ACTIVEMQ_LOCK

下面试一下发送一个持久化的消息:

package com.thunisoft.jms.mine.queue;

import java.util.HashMap;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.ObjectMessage;
import javax.jms.Session;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

/**
 * JMS生产者
 * 
 * @author zhangxsh
 * 
 */
public class Producer {

    /**
     * @param args
     */
    public static void main(String[] args) {
        ConnectionFactory connectionFactory;
        Connection connection = null;
        Session session;
        Destination destination;
        MessageProducer producer;
        connectionFactory = new ActiveMQConnectionFactory(
                ActiveMQConnection.DEFAULT_USER,
                ActiveMQConnection.DEFAULT_PASSWORD, "tcp://localhost:61616");
        try {
            // 通过连接工厂创建连接
            connection = connectionFactory.createConnection();
            // 启动连接
            connection.start();
            // 通过连接打开一个会话
            session = connection.createSession(Boolean.TRUE,
                    Session.AUTO_ACKNOWLEDGE);
            // 根据特定的队列名称创建一个目标地
            destination = session.createQueue("TestQueue");
            // 根据目标地创建一个生产者
            producer = session.createProducer(destination);
            producer.setDeliveryMode(DeliveryMode.PERSISTENT);
            // 不需要持久化的投递模式
        //    producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
            for (int i = 1; i <= 10; i++) {
                ObjectMessage message = session.createObjectMessage();
                HashMap m = new HashMap();
                m.put("key" + i, i);
                message.setObject(m);
                // 发送消息到目的地方
                System.out.println("发送消息:" + "ActiveMq 发送的消息" + i);
                producer.send(message);
            }
            session.commit();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != connection)
                    connection.close();
            } catch (Throwable ignore) {
            }
        }
    }
}

注意设置持久化方式:

producer.setDeliveryMode(DeliveryMode.PERSISTENT);

查看一下持久化效果:

当消费者连线接收消息后,会删除持久化的消息。

此处可以使用内存数据库进行持久化提高性能,当然对于没有必要持久化的消息最好不要持久化。

原文地址:https://www.cnblogs.com/zhangxsh/p/3507725.html