消息接收确认
JMS消息只有在确认之后, 才认为被成功的消费了。消息的成功消费通常包含三个阶段:客户接收消息、客户处理消息和消息确认。
在事务性会话中,当一个事务被提交的时候,确认自动发生。
在非事务性会话中,消息何时被确认取决于创建会话时的应答模式,该参数有三个可选值:Session.AUTO_ACKNOWLEDGE、Session.CLIENT_ACKNOWLEDGE、Session.DUPS_OK_ACKNOWLEDGE
AUTO_ACKNOWLEDGE:当客户成功的从receive()返回的时候,或者从MessageListener.onMessage()返回的时候,回话自动确认客户收到的消息。
CLIENT_ACKNOWLEDGE:客户端通过调用消息的acknowledge()进行确认才能得到消息。更需要注意的是,这种模式,确认是在会话层上进行,确认一个被消费的消息,将自动确认所有已被会话消费的消息。例如:如果一个消息消费者消费了10个消息,然后确认5个消息,那么所有10个消息都被确认。
conn.createTopicSession(false, Session.CLIENT_ACKNOWLEDGE);
public void onMessage(Message message) {
try{
//手动确认获取消息
message.acknowledge();
}catch (){
//如果在此期间出现异常,这个时候服务器端可能会保存这个消息,进行恢复后的重新发磅,因此可能导致消息的重复处理,所以这里可以进行一定的操作保证。。。 ,如undo ,回滚等操作
}
//进行消息 的处理
}
DUPS_OK_ACKNOWLEDGE:允许重复消息,如果provider失败、那么可能导致一些重复的消息。如果是重复的消息,那么JMS provider 必须把消息头的JMSRedeLivered字段设置为true
消息持久性,JMS支持以下两种消息提交模式:
PERSISTENT:指示provider 持久保持消息,以保证消息不会因为provider的失败而丢失
NON_PERSISTENT:不要求provider 持久保持消息
消息临时目的地
可以通过 session.createTemporaryQueue()、session.createTemporaryTopic()创建。他们的存在之限于创建他们的连接所保持的时间,只有创建该临时目的地的连接上的消息消费者才能从临时目的地中提取消息。
生产者创建之后, 消费者接收到消息后还可以向生产者发送消息
//生产者
Destination destination = session.createQueue("first queue 1");//创建消息队列
TemporaryQueue temporaryQueue = session.createTemporaryQueue();
messageProducer = session.createProducer(destination);//创建消息生产者
TextMessage message = session.createTextMessage("activeMQ 发送的消息"+i);
for(int i=0;i<SENDNUM;i++){
message = session.createTextMessage("activeMQ 发送的消息"+i);
message.setStringProperty("username", "zzg");
message.setJMSReplyTo(temporaryQueue);
messageProducer.send(message);
}
JSM的事务
session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
true,开启事务,false关闭事务。
session.commit();
session.rollback();