• 【原创】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);

    查看一下持久化效果:

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

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

  • 相关阅读:
    RegularExpression 2
    Python __str__() and __repr()__
    RegularExpression 1
    python new kill callback
    Generic Programming v1
    spring的@Transactional注解详细用法
    cmd批量打开网页和关闭网页的批处理代码
    windows批处理中实现延时的办法
    单元测试
    Protocol (网络数据交换规则)
  • 原文地址:https://www.cnblogs.com/zhangxsh/p/3507725.html
Copyright © 2020-2023  润新知