一、消息的过期
允许消息过期 。默认情况下,消息永不会过期。如果消息在特定周期内失去意义,那么可以设置过期时间。
有两种方法设置消息的过期时间,时间单位为毫秒:
1.使用消息生产者的setTimeToLive 方法为所有的消息设置过期时间。
2.使用消息生产者的send 方法为每一条消息设置过期时间。
消息过期时间,send 方法中的 timeToLive 值加上发送时刻的 GMT 时间值。如果 timeToLive 值等于零,则 JMSExpiration 被设为零, 表示该消息永不过期。
3、消息服务器接收到消息后,在指定的时间后,会从队列中移除指定的消息,超时被移除的消息不会发送给消费者。
4、使用消息生产者的setTimeToLive(long time ) 方法来给所有的消息设置过期时间:
// 消息生产者
MessageProducer producer = null;
producer = session.createProducer(queue);
// 消息是否为持久性的,如果不设置默认是持久化的。
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
//消息过期设置
producer.setTimeToLive(1000);
5、使用消息生产者的send()方法来设置消息的过期时间
//message发送的消息,deliveryMode是否持久化,priority优先级,timeToLive 消息过期时间
//producer.send(message, deliveryMode, priority, timeToLive);
producer.send(message, DeliveryMode.PERSISTENT, 4, 1000);
二、消息的选择器
不管是在消息发送端设置消息过期时间还是在接收端设置等待时间,都是对不满足的消息有过滤的作用,那消息选择器就是为过滤消息而生的下面来看看消息选择器:
ActiveMQ提供了一种机制,使用它,消息服务可根据消息选择器中的标准来执行消息过滤。生产者可在消息中放入应用程序特有的属性,而消费者可使用基于这些属性的选择标准来表明对消息是否感兴趣。这就简化了客户端的工作,并避免了向不需要这些消息的消费者传送消息的开销。然而,它也使得处理选择标准的消息服务增加了一些额外开销。 消息选择器是用于MessageConsumer的过滤器,可以用来过滤传入消息的属性和消息头部分(但不过滤消息体),并确定是否将实际消费该消息。消息选择器是一些字符串,它们基于某种语法,而这种语法是SQL-92的子集。可以将消息选择器作为MessageConsumer 创建的一部分。
1、消息生产者:
package com.jie.jms.series;
import com.jie.common.log.LogUtils;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* \* Created with IntelliJ IDEA.
* \* User: wugong.jie
* \* Date: 2018/3/23 12:37
* \* To change this template use File | Settings | File Templates.
* \* Description:
* \
*/
public class ProducerSeries {
// 单例模式
// 1、连接工厂
private ConnectionFactory connectionFactory;
// 2、连接对象
private Connection connection;
// 3、Session对象
private Session session;
// 4、生产者
private MessageProducer messageProducer;
public ProducerSeries() {
try {
this.connectionFactory = new ActiveMQConnectionFactory("admin",
"admin", "tcp://192.168.1.132:61616");
this.connection = connectionFactory.createConnection();
this.connection.start();
// 设置自动签收模式
this.session = this.connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
this.messageProducer = this.session.createProducer(null);
} catch (JMSException e) {
throw new RuntimeException(e);
}
}
public Session getSession() {
return this.session;
}
public void send1(/* String QueueName, Message message */) {
try {
Destination destination = this.session.createQueue("firstSeriesQueueSelect");
MapMessage msg1 = this.session.createMapMessage();
msg1.setString("name", "张三");
msg1.setInt("age", 20);
// 设置用于消息过滤器的条件
msg1.setStringProperty("name", "张三");
msg1.setIntProperty("age", 20);
msg1.setStringProperty("color", "bule");
MapMessage msg2 = this.session.createMapMessage();
msg2.setString("name", "李四");
msg2.setInt("age", 25);
// 设置用于消息过滤器的条件
msg2.setStringProperty("name", "李四");
msg2.setIntProperty("age", 25);
msg2.setStringProperty("color", "white");
MapMessage msg3 = this.session.createMapMessage();
msg3.setString("name", "赵六");
msg3.setInt("age", 30);
// 设置用于消息过滤器的条件
msg3.setStringProperty("name", "赵六");
msg3.setIntProperty("age", 30);
msg3.setStringProperty("color", "black");
// message发送的消息,deliveryMode是否持久化,priority优先级,timeToLive 消息过期时间
// 发送消息1
this.messageProducer.send(destination, msg1,
DeliveryMode.NON_PERSISTENT, 4, 1000 * 60 * 10);
// 发送消息2
this.messageProducer.send(destination, msg2,
DeliveryMode.NON_PERSISTENT, 4, 1000 * 60 * 10);
// 发送消息3
this.messageProducer.send(destination, msg3,
DeliveryMode.NON_PERSISTENT, 4, 1000 * 60 * 10);
} catch (JMSException e) {
throw new RuntimeException(e);
}
}
public void send2() {
try {
Destination destination = this.session.createQueue("secondSeriesQueue");
TextMessage message = this.session.createTextMessage("我是一个字符串");
message.setIntProperty("age", 25);
// 发送消息
this.messageProducer.send(destination, message,
DeliveryMode.NON_PERSISTENT, 4, 1000 * 60 * 10);
LogUtils.getAccessLog().info("普通文本发送消息:"+message.toString());
} catch (JMSException e) {
throw new RuntimeException(e);
}
}
public static void main(String[] args) {
ProducerSeries producer = new ProducerSeries();
producer.send1();
// producer.send2();
}
}
2、消息消费者:
package com.jie.jms.series;
import com.jie.common.log.LogUtils;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* \* Created with IntelliJ IDEA.
* \* User: wugong.jie
* \* Date: 2018/3/23 12:38
* \* To change this template use File | Settings | File Templates.
* \* Description:
* \
*/
public class ConmuserSeries {
// 单例模式
// 1、连接工厂
private ConnectionFactory connectionFactory;
// 2、连接对象
private Connection connection;
// 3、Session对象
private Session session;
// 4、生产者
private MessageConsumer messageConsumer;
// 5、目的地址
private Destination destination;
// 消息选择器
public final String SELECTOR_1 = "age > 25";
public final String SELECTOR_2 = " age > 20 and color='black'";
public ConmuserSeries() {
try {
this.connectionFactory = new ActiveMQConnectionFactory("admin",
"admin", "tcp://192.168.1.132:61616");
this.connection = connectionFactory.createConnection();
this.connection.start();
// 设置自动签收模式
this.session = this.connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
this.destination = this.session.createQueue("firstSeriesQueueSelect");
// 在构造消费者的时候,指定了 消息选择器
// 有选择性的消费消息
this.messageConsumer = this.session.createConsumer(destination,
SELECTOR_1);
} catch (JMSException e) {
throw new RuntimeException(e);
}
}
public Session getSession() {
return this.session;
}
// 用于监听消息队列的消息
class MyLister implements MessageListener {
@Override
public void onMessage(Message message) {
try {
if (message instanceof TextMessage) {
TextMessage ret = (TextMessage) message;
LogUtils.getAccessLog().info("普通文本消息:"+ret.getText());
}
if (message instanceof MapMessage) {
MapMessage ret = (MapMessage) message;
LogUtils.getAccessLog().info("Map文本消息:"+ret.toString());
LogUtils.getAccessLog().info("Map文本消息:"+ret.getString("name"));
LogUtils.getAccessLog().info("Map文本消息:"+ret.getInt("age"));
}
} catch (JMSException e) {
throw new RuntimeException(e);
}
}
}
// 用于异步监听消息
public void receiver() {
try {
this.messageConsumer.setMessageListener(new MyLister());
} catch (JMSException e) {
throw new RuntimeException(e);
}
}
public static void main(String[] args) {
ConmuserSeries conmuser = new ConmuserSeries();
conmuser.receiver();
}
}
"C:\Program Files\Java\jdk1.8.0_101\bin\java" "-javaagent:D:\softinstall\IntelliJ IDEA 2017.1\lib\idea_rt.jar=9276:D:\softinstall\IntelliJ IDEA 2017.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_101\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\rt.jar;D:\my_project\MyTest\target\test-classes;D:\my_project\MyTest\target\classes;D:\mavn-repository\junit\junit\4.12\junit-4.12.jar;D:\mavn-repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;D:\mavn-repository\org\springframework\spring-core\4.0.2.RELEASE\spring-core-4.0.2.RELEASE.jar;D:\mavn-repository\org\springframework\spring-web\4.0.2.RELEASE\spring-web-4.0.2.RELEASE.jar;D:\mavn-repository\org\springframework\spring-beans\4.0.2.RELEASE\spring-beans-4.0.2.RELEASE.jar;D:\mavn-repository\org\springframework\spring-context\4.0.2.RELEASE\spring-context-4.0.2.RELEASE.jar;D:\mavn-repository\org\springframework\spring-oxm\4.0.2.RELEASE\spring-oxm-4.0.2.RELEASE.jar;D:\mavn-repository\org\springframework\spring-tx\4.0.2.RELEASE\spring-tx-4.0.2.RELEASE.jar;D:\mavn-repository\org\springframework\spring-jdbc\4.0.2.RELEASE\spring-jdbc-4.0.2.RELEASE.jar;D:\mavn-repository\org\springframework\spring-webmvc\4.0.2.RELEASE\spring-webmvc-4.0.2.RELEASE.jar;D:\mavn-repository\org\springframework\spring-expression\4.0.2.RELEASE\spring-expression-4.0.2.RELEASE.jar;D:\mavn-repository\org\springframework\spring-aop\4.0.2.RELEASE\spring-aop-4.0.2.RELEASE.jar;D:\mavn-repository\aopalliance\aopalliance\1.0\aopalliance-1.0.jar;D:\mavn-repository\org\springframework\spring-context-support\4.0.2.RELEASE\spring-context-support-4.0.2.RELEASE.jar;D:\mavn-repository\org\springframework\spring-test\4.0.2.RELEASE\spring-test-4.0.2.RELEASE.jar;D:\mavn-repository\org\aspectj\aspectjweaver\1.8.4\aspectjweaver-1.8.4.jar;D:\mavn-repository\org\mybatis\mybatis\3.2.6\mybatis-3.2.6.jar;D:\mavn-repository\org\mybatis\mybatis-spring\1.2.2\mybatis-spring-1.2.2.jar;D:\mavn-repository\javax\javaee-api\7.0\javaee-api-7.0.jar;D:\mavn-repository\com\sun\mail\javax.mail\1.5.0\javax.mail-1.5.0.jar;D:\mavn-repository\javax\activation\activation\1.1\activation-1.1.jar;D:\mavn-repository\mysql\mysql-connector-java\5.1.30\mysql-connector-java-5.1.30.jar;D:\mavn-repository\commons-dbcp\commons-dbcp\1.2.2\commons-dbcp-1.2.2.jar;D:\mavn-repository\commons-pool\commons-pool\1.3\commons-pool-1.3.jar;D:\mavn-repository\jstl\jstl\1.2\jstl-1.2.jar;D:\mavn-repository\log4j\log4j\1.2.17\log4j-1.2.17.jar;D:\mavn-repository\com\alibaba\druid\1.0.12\druid-1.0.12.jar;C:\Program Files\Java\jdk1.8.0_101\lib\jconsole.jar;C:\Program Files\Java\jdk1.8.0_101\lib\tools.jar;D:\mavn-repository\com\fasterxml\jackson\core\jackson-core\2.8.5\jackson-core-2.8.5.jar;D:\mavn-repository\com\fasterxml\jackson\jaxrs\jackson-jaxrs-xml-provider\2.4.1\jackson-jaxrs-xml-provider-2.4.1.jar;D:\mavn-repository\com\fasterxml\jackson\jaxrs\jackson-jaxrs-base\2.4.1\jackson-jaxrs-base-2.4.1.jar;D:\mavn-repository\com\fasterxml\jackson\dataformat\jackson-dataformat-xml\2.4.1\jackson-dataformat-xml-2.4.1.jar;D:\mavn-repository\com\fasterxml\jackson\module\jackson-module-jaxb-annotations\2.4.1\jackson-module-jaxb-annotations-2.4.1.jar;D:\mavn-repository\org\codehaus\woodstox\stax2-api\3.1.1\stax2-api-3.1.1.jar;D:\mavn-repository\javax\xml\stream\stax-api\1.0-2\stax-api-1.0-2.jar;D:\mavn-repository\org\codehaus\woodstox\woodstox-core-asl\4.1.4\woodstox-core-asl-4.1.4.jar;D:\mavn-repository\org\codehaus\jackson\jackson-mapper-asl\1.9.4\jackson-mapper-asl-1.9.4.jar;D:\mavn-repository\org\codehaus\jackson\jackson-core-asl\1.9.4\jackson-core-asl-1.9.4.jar;D:\mavn-repository\com\fasterxml\jackson\core\jackson-databind\2.8.5\jackson-databind-2.8.5.jar;D:\mavn-repository\com\fasterxml\jackson\core\jackson-annotations\2.8.5\jackson-annotations-2.8.5.jar;D:\mavn-repository\com\alibaba\fastjson\1.2.3\fastjson-1.2.3.jar;D:\mavn-repository\commons-fileupload\commons-fileupload\1.3.1\commons-fileupload-1.3.1.jar;D:\mavn-repository\commons-io\commons-io\2.4\commons-io-2.4.jar;D:\mavn-repository\commons-codec\commons-codec\1.9\commons-codec-1.9.jar;D:\mavn-repository\com\github\pagehelper\pagehelper\4.0.0\pagehelper-4.0.0.jar;D:\mavn-repository\com\github\jsqlparser\jsqlparser\0.9.1\jsqlparser-0.9.1.jar;D:\mavn-repository\org\apache\shiro\shiro-core\1.2.3\shiro-core-1.2.3.jar;D:\mavn-repository\commons-beanutils\commons-beanutils\1.8.3\commons-beanutils-1.8.3.jar;D:\mavn-repository\com\mchange\c3p0\0.9.5.2\c3p0-0.9.5.2.jar;D:\mavn-repository\com\mchange\mchange-commons-java\0.2.11\mchange-commons-java-0.2.11.jar;D:\mavn-repository\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;D:\mavn-repository\org\apache\httpcomponents\httpclient\4.5.2\httpclient-4.5.2.jar;D:\mavn-repository\org\apache\httpcomponents\httpcore\4.4.4\httpcore-4.4.4.jar;D:\mavn-repository\org\apache\commons\commons-lang3\3.4\commons-lang3-3.4.jar;D:\mavn-repository\org\apache\activemq\activemq-core\5.7.0\activemq-core-5.7.0.jar;D:\mavn-repository\org\apache\geronimo\specs\geronimo-jms_1.1_spec\1.1.1\geronimo-jms_1.1_spec-1.1.1.jar;D:\mavn-repository\org\apache\activemq\kahadb\5.7.0\kahadb-5.7.0.jar;D:\mavn-repository\org\apache\activemq\protobuf\activemq-protobuf\1.1\activemq-protobuf-1.1.jar;D:\mavn-repository\org\fusesource\mqtt-client\mqtt-client\1.3\mqtt-client-1.3.jar;D:\mavn-repository\org\fusesource\hawtdispatch\hawtdispatch-transport\1.11\hawtdispatch-transport-1.11.jar;D:\mavn-repository\org\fusesource\hawtdispatch\hawtdispatch\1.11\hawtdispatch-1.11.jar;D:\mavn-repository\org\fusesource\hawtbuf\hawtbuf\1.9\hawtbuf-1.9.jar;D:\mavn-repository\org\apache\geronimo\specs\geronimo-j2ee-management_1.1_spec\1.0.1\geronimo-j2ee-management_1.1_spec-1.0.1.jar;D:\mavn-repository\commons-net\commons-net\3.1\commons-net-3.1.jar;D:\mavn-repository\org\jasypt\jasypt\1.9.0\jasypt-1.9.0.jar;D:\mavn-repository\org\apache\activemq\activemq-pool\5.9.0\activemq-pool-5.9.0.jar;D:\mavn-repository\org\apache\activemq\activemq-jms-pool\5.9.0\activemq-jms-pool-5.9.0.jar;D:\mavn-repository\org\apache\activemq\activemq-client\5.9.0\activemq-client-5.9.0.jar;D:\mavn-repository\org\apache\geronimo\specs\geronimo-jta_1.0.1B_spec\1.0.1\geronimo-jta_1.0.1B_spec-1.0.1.jar;D:\mavn-repository\org\springframework\spring-jms\4.0.2.RELEASE\spring-jms-4.0.2.RELEASE.jar;D:\mavn-repository\org\apache\xbean\xbean-spring\4.5\xbean-spring-4.5.jar;D:\mavn-repository\org\slf4j\slf4j-api\1.7.7\slf4j-api-1.7.7.jar;D:\mavn-repository\org\slf4j\jcl-over-slf4j\1.7.7\jcl-over-slf4j-1.7.7.jar;D:\mavn-repository\org\slf4j\slf4j-log4j12\1.7.7\slf4j-log4j12-1.7.7.jar;D:\mavn-repository\com\google\guava\guava\18.0\guava-18.0.jar" com.jie.jms.series.ConmuserSeries
[sys-access] - Map文本消息:ActiveMQMapMessage {commandId = 7, responseRequired = false, messageId = ID:EDZ-20170613JDQ-9195-1521780221193-1:1:1:1:3, originalDestination = null, originalTransactionId = null, producerId = ID:EDZ-20170613JDQ-9195-1521780221193-1:1:1:1, destination = queue://firstSeriesQueueSelect, transactionId = null, expiration = 1521780821583, timestamp = 1521780221583, arrival = 0, brokerInTime = 1521780220686, brokerOutTime = 1521780293334, correlationId = null, replyTo = null, persistent = false, type = null, priority = 4, groupID = null, groupSequence = 0, targetConsumerId = null, compressed = false, userID = null, content = org.apache.activemq.util.ByteSequence@fa6bc89, marshalledProperties = org.apache.activemq.util.ByteSequence@78fe437c, dataStructure = null, redeliveryCounter = 0, size = 0, properties = {name=赵六, color=black, age=30}, readOnlyProperties = true, readOnlyBody = true, droppable = false} ActiveMQMapMessage{ theTable = {} }
[sys-access] - Map文本消息:赵六
[sys-access] - Map文本消息:30
三、消息的优先级
通常,可以确保将单个会话向目标发送的所有消息按其发送顺序传送至消费者。然而,如果为这些消息分配了不同的优先级,消息传送系统将首先尝试传送优先级较高的消息。
有两种方法设置消息的优先级:
1.使用 setPriority 方法,这样所有的消息都采用此传送模式;
2.使用 send 方法为每一条消息设置传送模式;
消息优先级从 0-9 十个级别,0-4 是普通消息,5-9 是加急消息。如果不指定优先级,则默认为 4。JMS 不要求严格按照这十个优先级发送消息,但必须保证加急消息要先于普通消息到达。