ActiveMQ消息结构

JMS 消息由以下几部分组成:消息头,属性和消息体

消息头

消息头包含消息的识别信息和路由信息,消息头包含一些标准的属性如下:

1:JMSDestination:消息发送的目的地:主要是指Queue和Topic,自动分配

2:JMSDeliveryMode:传送模式。有两种 :持久模式和非持久模式。一条持久性的消息应该被传送“一次仅仅一次”,这就意味者如果JMS提供者出现故障,该消息并不会丢失,它会在服务器恢复之后再次传递。一条非持久的消息最多会传送一次,这意味这服务器出现故障,该消息将永远丢失。自动分配

3:JMSExpiration:消息过期时间,等于 Destination 的send 方法中的timeToLive值加上发送时刻的GMT 时间值。如果timeToLive 值等于零,则JMSExpiration 被设为零,表示该消息永不过期。如果发送后,在消息过期时间之后消息还没有被发送到目的地,则该消息被清除。自动分配
4:JMSPriority:消息优先级,从 0-9 十个级别,0-4 是普通消息,5-9 是加急消息。JMS 不要求JMS Provider 严格按照这十个优先级发送消息,但必须保证加急消息要先于普通消息到达。默认是4级。自动分配
5:JMSMessageID:唯一识别每个消息的标识,由JMS Provider 产生。自动分配
6:JMSTimestamp:一个JMS Provider在调用send()方法时自动设置的。它是消息被发送和消费者实际接收的时间差。自动分配
7:JMSCorrelationID:用来连接到另外一个消息,典型的应用是在回复消息中连接到原消息。在大多数情况下,JMSCorrelationID用于将一条消息标记为对JMSMessageID标示的上一条消息的应答,不过,JMSCorrelationID可以是任何值,不仅仅是JMSMessageID。由开发者设置
8:JMSReplyTo:提供本消息回复消息的目的地址。由开发者设置
9:JMSType:消息类型的识别符。由开发者设置
10:JMSRedelivered:如果一个客户端收到一个设置了JMSRedelivered属性的消息,则表示可能客户端曾经在早些时候收到过该消息,但并没有签收(acknowledged)。如果该消息被重新传送,JMSRedelivered=true反之,JMSRedelivered =false。自动设置


消息体

消息体,JMS API定义了5种消息体格式,也叫消息类型,可以使用不同形式发送
接收数据,并可以兼容现有的消息格式。包括: TextMessageMapMessageBytesMessageStreamMessageObjectMessage
//纯字符串的数据
session.createTextMessage();
//序列化的对象
session.createObjectMessage();
//流,可以用来传递文件等
session.createStreamMessage();
//用来传递字节
session.createBytesMessage();
//这个方法创建出来的就是一个map,可以把它当作map来用,当你看了它的一些方法,你就懂了
session.createMapMessage();
//这个方法,拿到的是javax.jms.Message,是所有message的接口
session.createMessage();

JMS五种消息的发送/接收的例子
转载自: http://blog.csdn.net/caihaijiang/article/details/5903296
1、消息发送
//连接工厂     
ConnectionFactory connFactory = new ActiveMQConnectionFactory(     
        ActiveMQConnection.DEFAULT_USER,     
        ActiveMQConnection.DEFAULT_PASSWORD,     
        "tcp://localhost:61616");     
    
//连接到JMS提供者     
Connection conn = connFactory.createConnection();     
conn.start();     
    
//事务性会话,自动确认消息     
Session session = conn.createSession(true, Session.AUTO_ACKNOWLEDGE);     
    
//消息的目的地     
Destination destination = session.createQueue("queue.hello");     
    
//消息生产者     
MessageProducer producer = session.createProducer(destination);     
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); //不持久化     
    
    
//文本消息     
TextMessage textMessage = session.createTextMessage("文本消息");     
producer.send(textMessage);     
    
//键值对消息     
MapMessage mapMessage = session.createMapMessage();     
mapMessage.setLong("age", new Long(32));     
mapMessage.setDouble("sarray", new Double(5867.15));     
mapMessage.setString("username", "键值对消息");     
producer.send(mapMessage);     
    
//流消息     
StreamMessage streamMessage = session.createStreamMessage();     
streamMessage.writeString("streamMessage流消息");     
streamMessage.writeLong(55);     
producer.send(streamMessage);     
    
//字节消息     
String s = "BytesMessage字节消息";     
BytesMessage bytesMessage = session.createBytesMessage();     
bytesMessage.writeBytes(s.getBytes());     
producer.send(bytesMessage);     
    
//对象消息     
User user = new User("cjm", "对象消息"); //User对象必须实现Serializable接口     
ObjectMessage objectMessage = session.createObjectMessage();     
objectMessage.setObject(user);     
producer.send(objectMessage);     
    
    
session.commit(); //在事务性会话中,只有commit之后,消息才会真正到达目的地     
producer.close();     
session.close();     
conn.close();  
2、消息接收:通过消息监听器的方式接收消息
public class Receiver implements MessageListener{     
    private boolean stop = false;     
         
    public void execute() throws Exception {     
        //连接工厂     
        ConnectionFactory connFactory = new ActiveMQConnectionFactory(     
                ActiveMQConnection.DEFAULT_USER,     
                ActiveMQConnection.DEFAULT_PASSWORD,     
                "tcp://localhost:61616");     
             
        //连接到JMS提供者     
        Connection conn = connFactory.createConnection();     
        conn.start();     
             
        //事务性会话,自动确认消息     
        Session session = conn.createSession(true, Session.AUTO_ACKNOWLEDGE);     
             
        //消息的来源地     
        Destination destination = session.createQueue("queue.hello");     
             
        //消息消费者     
        MessageConsumer consumer = session.createConsumer(destination);     
        consumer.setMessageListener(this);     
             
        //等待接收消息     
        while(!stop){     
            Thread.sleep(5000);     
        }     
             
        session.commit();     
             
        consumer.close();     
        session.close();     
        conn.close();     
    }     
    
    public void onMessage(Message m) {     
        try{     
            if(m instanceof TextMessage){ //接收文本消息     
                TextMessage message = (TextMessage)m;     
                System.out.println(message.getText());     
            }else if(m instanceof MapMessage){ //接收键值对消息     
                MapMessage message = (MapMessage)m;     
                System.out.println(message.getLong("age"));     
                System.out.println(message.getDouble("sarray"));     
                System.out.println(message.getString("username"));     
            }else if(m instanceof StreamMessage){ //接收流消息     
                StreamMessage message = (StreamMessage)m;     
                System.out.println(message.readString());     
                System.out.println(message.readLong());     
            }else if(m instanceof BytesMessage){ //接收字节消息     
                byte[] b = new byte[1024];     
                int len = -1;     
                BytesMessage message = (BytesMessage)m;     
                while((len=message.readBytes(b))!=-1){     
                    System.out.println(new String(b, 0, len));     
                }     
            }else if(m instanceof ObjectMessage){ //接收对象消息     
                ObjectMessage message = (ObjectMessage)m;     
                User user = (User)message.getObject();     
                System.out.println(user.getUsername() + " _ " + user.getPassword());     
            }else{     
                System.out.println(m);     
            }     
                 
            stop = true;     
        }catch(JMSException e){     
            stop = true;     
            e.printStackTrace();     
        }     
    }     
}  


消息属性

消息属性,包含以下三种类型的属性:
1:应用程序设置和添加的属性,比如:
Message.setStringProperty("hello", "my name is wangsaichao!");
2:JMS定义的属性
使用“JMSX”作为属性名的前缀,
connection.getMetaData().getJMSXPropertyNames(), 方法返回所有连接支持的JMSX 属性的名字。
3:JMS供应商特定的属性
JMS定义的属性如下:
1:JMSXUserID:发送消息的用户标识,发送时提供商设置
2:JMSXAppID:发送消息的应用标识,发送时提供商设置
3:JMSXDeliveryCount:转发消息重试次数,第一次是1,第二次是2,… ,发送时提供商设置
4:JMSXGroupID:消息所在消息组的标识,由客户端设置
5:JMSXGroupSeq:组内消息的序号第一个消息是1,第二个是2,…,由客户端设置
6:JMSXProducerTXID :产生消息的事务的事务标识,发送时提供商设置
7:JMSXConsumerTXID :消费消息的事务的事务标识,接收时提供商设置
8:JMSXRcvTimestamp :JMS 转发消息到消费者的时间,接收时提供商设置
9:JMSXState:假定存在一个消息仓库,它存储了每个消息的单独拷贝,且这些消息从原始消息被发送时开始。每个拷贝的状态有:1(等待),2(准备),3(到期)或4(保留)。由于状态与生产者和消费者无关,所以它不是由它们来提供。它只和在仓库中查找消息相关,因此JMS没有提供这种API。由提供商设置
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值