码迷,mamicode.com
首页 > 其他好文 > 详细

JMS消息服务器——Message消息分析(2)

时间:2015-05-24 22:00:19      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:message   jms   服务器   标准   

3 消息类型

JAVA消息服务定义了6种JMS提供者必须支持的Message接口类型。尽管JMS定义了Message接口,但它并未定义它们的实现方式。这就允许提供者以它们自己的方式实现和传送消息,同时为JMS应用程序开发者维护了一个兼容的标准接口。这6个消息接口是Message和它的5个子接口:TextMessageStreamMessageMapMessageObjectMessageByteMessage

3.1 Message

最简单的消息类型是javax.jms.Message,它担当了其他消息类型基接口(base interface)的角色。可按一下方式创建Message类型,并将它用作一条不含有效负载的JMS消息:

     //使用者发布者创建并发送消息
       Message message = pubSession .createTextMessage();
       publisher.publish(message );
    //接受消息
       @Override
       public void onMessage(Message message) {

这种类型的消息仅仅包含了JMS消息头和消息属性,而且,它仅限用于事件通知,它仅用于事件通知。一个事件通知就是出现某些情况的一个广播、告警或者通知。如果业务场景需要一个不含有效负载的简单通知,轻量级消息类型就是实现它的最有效方式。
例如为了广播通知某个特定类中的一个异常,你可以发布一条不含有效负载的异常文本消息,如下所示:

    //发送异常
    ...
    try{
    ...
    }catch(Exception up){
        Message message = Sesstion.createMessage();
        message.setStringProperty("Exception",up.getMessage());
        publisher.publish(message);
        throw up;
    }
    //接受异常
    ...
    public void onMessage(Message message){
    ...
    System.out.println("Exception:"+message.getStringProperty());
    ...
    }
    ...

3.2 TextMessage

文本消息可以使用Session接口中定义的两个工厂方法之一来创建。其中一个工厂方法没有使用参数,就会产生出不含有效负载的TextMessage对象。另一个工厂方法则使用一个string类型的有效负载作为参数,生产出“准备就绪可传送”的TextMessage对象:

    TextMessage textMessage = Session.createTextMessage();
    textMessage.setText("Hello World!");
    topicPublisher.publish(textMessage);
    ...
    TextMessage textMessage = session.createTextMessage("Hello!");
    queueSender.send(textMessage);

3.3 ObjectMessage

对象消息可以使用Session接口中的两个工厂方法中的一个来创建。

    //订单一个可序列化对象
    Order order = new Order();
    ...
    ObjectMessage objectMessage = Session.createObjectMessage();
    objectMessage.setObject(order);
    queueSender.send(objectMessage);
    ...
    ObjectMessage objectMessage = Session.createObjectMessage(order);
    topicPublisher.publish(objectMessage);

在消费者接受objectMessage时,它可以使用getObject()方法提取出有效负载。如果传送的ObjectMessage不含有效负载,getObject()方法将返回一个null值。

    public void onMessage(Message message){
        try{
            ObjectMessage objectMessage =(ObjectMessage)message;
            Order order =(Order)objectMessage.getObject();
            ...
        }catch(JMSException jmse){
        ...
    }

注意:使用ObjectMessages时,消息生产者和消费者二者都必须是JMS兼容的。

3.4 BytesMessage

这种类型懈怠了一组原始类型字节流作为有效负载。
它可以使用应用程序的本机格式来交换数据,这种格式可能不兼容其他现有的Message类型。当JMS纯粹用于两个系统之间的消息传送时,也可以使用这种类型,而且该消息的有效负载对JMS客户端来说是透明的。
如果你使用java.io.DataInputStream和java.io.DataOutputStream,那么以这些I/O类为基础的ByteMessage接口方法,就会让你觉得熟悉。

    BytesMessage bytesMessage = Session.createBytesMessage();

    bytesMessage.writeChar(‘R‘);
    byteMessage.writeInt(10);
    byteMessage.writeUTF("Hello");

消息响应

    public void onMessage(Message message){
        try{
            BytesMessage byteMessage =(BytesMessage)message;
            char c = byteMessage.readChar();
            int i = byteMessage.readInt();
            String s = byteMessage.readUTF();
        }catch(JMSException jmse){
        ....
        }
    }

ByteMessage是可移植性最好的而一种消息类型,因此他在于非JMS消息类型传送客户端通信时非常有用。有些情况下,一个JMS客户端可以是一类路由器,它消费来自某个消息源的消息,并将他们传送给一个目的地。路由选择应用程序可能不需要知道它们传输的数据内容,并因此可以选择使用ByteMessage将有效负载作为二进制数据,从一个位置传送到其他位置。

3.5 MapMessage

这种类型携带了一组键/值对作为有效负载。有效负载类似与一个Java.util.Properties对象,除了有效负载值必须是Java原始数据类型和Strings型之外。
本质上,MapMessage的工作方式类似于JMS属性:任何键/值对都可以写入有效负载。其中名称必须是一个String对象,而值则可以是String类型或原始数据类型。

    MapMessage mapMessage =Session.createMapMessage();
    mapMessage.setInt("Age",88);
    mapMessage.setFloat("Weight",234);
    mapMessage.setString("Name","Smith");
    mapMessage.setObject("Height",new Double(150.32));
    ...

    int age = mapMessage.getInt("Age");
    float weight = mapMessage.getFloat("Weight");
    String name = mapMessage.getString("Name");    Double height = (Double)mapmessage.getObject("Height");

3.6 StreamMessage

StreamMesage携带了一个Java原始数据类型流作为有效负载。它提供了一套将格式化字节流映射为Java原始数据类型的简便方法。
StreamMessage保持了写入流时的顺序和原始数据类型,因此它适用于形式转换规则。

JMS消息服务器——Message消息分析(2)

标签:message   jms   服务器   标准   

原文地址:http://blog.csdn.net/caidaoqq/article/details/45955517

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!