ActiveMQ 消息持久化
activeMQ默认支持持久化方式:kahadb leavedb jdbc,默认kahadb ,其中kahadb leavedb 都是内存级的持久化方式,性能更好一些,如果并发量并不是很高的情况下,可以选择JDBC,优点不言而喻,查看简单。
配置如下(本次以ORACLE为例):
1. 将JDBC驱动包拷贝到apache-activemq-5.14.1\lib
2. 打开apache-activemq-5.14.1\conf\activemq.xml
注释掉kahadb,新增一个persistenceAdapter,配置一个数据源
<persistenceAdapter>
<jdbcPersistenceAdapter dataSource="#oracle-ds"/>
</persistenceAdapter>
<bean id="oracle-ds" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:localhost:1521:ORACLE"/>
<property name="username" value="scott"/>
<property name="password" value=""/>
<property name="maxIdle" value="200"/>
<property name="poolPreparedStatements" value="true"/>
</bean>
消息过滤:
package org.jms.demo.filter;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.MessageProducer;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.console.Main;
public class Send {
private static final String brokeURL = "tcp://localhost:61616";
private ConnectionFactory connectionFactory;
private Connection connection;
private Destination destination;
private MessageProducer producer;
private Session session;
public Send() throws JMSException {
connectionFactory = new ActiveMQConnectionFactory(brokeURL);
connection = connectionFactory.createConnection();
connection.start();
session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
destination = session.createQueue("FILTER_QUEUE");
producer = session.createProducer(destination);
}
public void send() throws JMSException {
MapMessage mapMessage3 = this.session.createMapMessage();
mapMessage3.setString("name", "王二");
mapMessage3.setInt("age", 27);
mapMessage3.setIntProperty("age", 27);
mapMessage3.setStringProperty("name", "王二");
MapMessage mapMessage2 = this.session.createMapMessage();
mapMessage2.setString("name", "赵四");
mapMessage2.setInt("age", 26);
mapMessage2.setIntProperty("age", 26);
mapMessage2.setStringProperty("name", "赵四");
MapMessage mapMessage1 = this.session.createMapMessage();
mapMessage1.setString("name", "王五");
mapMessage1.setInt("age", 25);
mapMessage1.setIntProperty("age", 25);
mapMessage1.setStringProperty("name", "王五");
MapMessage mapMessage4 = this.session.createMapMessage();
mapMessage4.setString("name", "王三");
mapMessage4.setInt("age", 25);
mapMessage4.setIntProperty("age", 25);
mapMessage4.setStringProperty("name", "王三");
producer.send(destination, mapMessage1, DeliveryMode.PERSISTENT, 8, 1000 * 60 * 10);
producer.send(destination, mapMessage2, DeliveryMode.PERSISTENT, 7, 1000 * 60 * 10);
producer.send(destination, mapMessage3, DeliveryMode.PERSISTENT, 6, 1000 * 60 * 10);
producer.send(destination, mapMessage4, DeliveryMode.PERSISTENT, 6, 1000 * 60 * 10);
}
public static void main(String[] args) throws JMSException {
Send send = new Send();
send.send();
}
}
package org.jms.demo.filter;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnectionFactory;
public class Revice {
private static final String brokeURL = "tcp://localhost:61616";
private ConnectionFactory connectionFactory;
private Connection connection;
private Destination destination;
private MessageConsumer consumer;
private Session session;
private static final String selector = "age > 25 and name like '王%'";
public Revice() throws JMSException {
connectionFactory = new ActiveMQConnectionFactory(brokeURL);
connection = connectionFactory.createConnection();
connection.start();
session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
destination = session.createQueue("FILTER_QUEUE");
consumer = session.createConsumer(destination, selector);
consumer.setMessageListener(new Listener());
}
class Listener implements MessageListener {
@Override
public void onMessage(Message message) {
if (message instanceof MapMessage) {
MapMessage map = (MapMessage) message;
System.out.println(map.toString());
try {
System.out.println(map.getString("name"));
System.out.println(map.getInt("age"));
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public static void main(String[] args) throws JMSException {
Revice revice = new Revice();
}
}