【原创】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);
查看一下持久化效果:
当消费者连线接收消息后,会删除持久化的消息。
此处可以使用内存数据库进行持久化提高性能,当然对于没有必要持久化的消息最好不要持久化。