ActiveMQ中的数据类型

        在讲ActiveMQ中的数据类型之前,我们先了解一下JMS。

        JMS(JavaMessaging Service)是Java平台上有关面向消息中间件的技术规范,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发。

        JMS本身只定义了一系列的接口规范,是一种与厂商无关的 API,用来访问消息收发系统。它类似于 JDBC(JavaDatabase Connectivity):这里,JDBC 是可以用来访问许多不同关系数据库的 API,而 JMS 则提供同样与厂商无关的访问方法,以访问消息收发服务。许多厂商目前都支持 JMS,包括 IBM 的 MQSeries、BEA的 Weblogic JMS service和 Progress 的 SonicMQ,这只是几个例子。 JMS 使您能够通过消息收发服务(有时称为消息中介程序或路由器)从一个 JMS 客户机向另一个 JML 客户机发送消息。消息是 JMS 中的一种类型对象,由两部分组成:报头和消息主体。报头由路由信息以及有关该消息的元数据组成。消息主体则携带着应用程序的数据或有效负载。

        JMS 定义了五种不同的消息正文格式,以及调用的消息类型,允许你发送并接收以一些不同形式的数据,提供现有消息格式的一些级别的兼容性。

        TextMessage--一个字符串对象

        MapMessage--一套名称-值对

        BytesMessage--一个字节的数据流

        StreamMessage -- Java 原始值的数据流

        ObjectMessage--一个序列化的 Java 对象

        而ActiveMQ是一个符合JMS规范的消息中间件,因此,它的数据类型也就是JMS的5中数据类型。

        TextMessage:

        生产者:

public class TextMessageProducer {
    

    public static void main(String[] args) throws JMSException {
        // 创建ConnectionFactory的工厂的创建者
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory("tcp://192.168.232.135:61616");
        // 获取工厂
        Connection connection = activeMQConnectionFactory.createConnection();
        // 打开连接
        connection.start();
        // 创建Session对象
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        // 创建一个目的地,后面的这个参数表示的意思是:消息队列的名字
        Destination destination = new ActiveMQQueue("TextMessage-Test");
        // 创建一个消息的生产者
        MessageProducer producer = session.createProducer(destination);
        // 发送文本消息
        TextMessage message = session.createTextMessage("文本消息消息测试");
        // 发送这个消息到目的地去
        producer.send(message);
        System.out.println("生产消息成功......");
        producer.close();
        session.close();
        connection.close();
    }
}

        启动后查看管理界面:

        生产者:


public class TextMessageConsumer {
    
    public static void main(String[] args) throws JMSException {
        // 创建ConnectionFactory的工厂的创建者
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory("tcp://192.168.232.135:61616");
        // 获取工厂
        Connection connection = activeMQConnectionFactory.createConnection();
        // 打开连接
        connection.start();
        // 创建Session对象
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        // 创建一个目的地,后面的这个参数表示的意思是:消息队列的名字
        Destination destination = new ActiveMQQueue("TextMessage-Test");
        // 创建消费者
        MessageConsumer consumer = session.createConsumer(destination);
        // 使用同步的方式接收消息
        TextMessage textMessage = (TextMessage)consumer.receive();
        System.out.println(textMessage.getText());
    }
}

        启动后消息即被消费:

        MapMessage:

        生产者:


public class MapMessageProducer {
    public static void main(String[] args) throws JMSException {
        // 创建ConnectionFactory的工厂的创建者
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory("tcp://192.168.232.135:61616");
        // 获取工厂
        Connection connection = activeMQConnectionFactory.createConnection();
        // 打开连接
        connection.start();
        // 创建Session对象
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        // 创建一个目的地 后面的这个参数表示的意思是:消息队列的名字
        Destination destination = new ActiveMQQueue("MapMessage-Test");
        // 创建一个消息的生产者
        MessageProducer producer = session.createProducer(destination);
        // MapMessage的使用
        MapMessage mapMessage=session.createMapMessage();
        // 给mapMessage设置数据
        mapMessage.setString("key1","MapMessage测试");
        // 发送这个消息到目的地去
        producer.send(mapMessage);
        System.out.println("生产消息成功!");
        producer.close();
        session.close();
        connection.close();
    }
}

       管理界面查看:

        消费者:

public class MapMessageConsumer {
    public static void main(String[] args) throws JMSException {
        // 创建ConnectionFactory的工厂的创建者
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory("tcp://192.168.232.135:61616");
        // 获取工厂
        Connection connection = activeMQConnectionFactory.createConnection();
        // 打开连接
        connection.start();
        // 创建Session对象
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        // 创建一个目的地 后面的这个参数表示的意思是:消息队列的名字
        Destination destination = new ActiveMQQueue("MapMessage-Test");
        // 创建消费者了
        MessageConsumer consumer = session.createConsumer(destination);
        // 异步方式接收
        consumer.setMessageListener(new MessageListener() {
            @Override
            public void onMessage(Message message) {
                MapMessage mapMessage=(MapMessage) message;
                try {
                    System.out.println("接收到的消息是:"+mapMessage.getString("key1"));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

        查看管理界面,消息被消费:

 

        ByteMessage:

        生产者:

public class ByteMessageProducer {

    public static void main(String[] args) throws JMSException {
        // 创建ConnectionFactory的工厂的创建者
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory("tcp://192.168.232.135:61616");
        // 获取工厂
        Connection connection = activeMQConnectionFactory.createConnection();
        // 打开连接
        connection.start();
        // 创建Session对象
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        // 创建一个目的地 后面的这个参数表示的意思是:消息队列的名字
        Destination destination = new ActiveMQQueue("BytesMessage-Test");
        // 创建一个消息的生产者
        MessageProducer producer = session.createProducer(destination);
        // MapMessage的使用
        BytesMessage bytesMessage=session.createBytesMessage();
        // 给BytesMessage设置数据
        bytesMessage.writeBytes("BytesMessage测试".getBytes());
        // 发送这个消息到目的地去
        producer.send(bytesMessage);
        System.out.println("生产消息成功!");
        producer.close();
        session.close();
        connection.close();
    }
}

        打开管理界面查看:

        消费者:


public class ByteMessageConsumer {
    public static void main(String[] args) throws JMSException {
        // 创建ConnectionFactory的工厂的创建者
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory("tcp://192.168.232.135:61616");
        // 获取工厂
        Connection connection = activeMQConnectionFactory.createConnection();
        // 打开连接
        connection.start();
        // 创建Session对象
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        // 创建一个目的地 后面的这个参数表示的意思是:消息队列的名字
        Destination destination = new ActiveMQQueue("BytesMessage-Test");
        // 创建消费者
        MessageConsumer consumer = session.createConsumer(destination);
        //同步方式接收
        BytesMessage bytesMessage = (BytesMessage) consumer.receive();
        byte[] bytes = new byte[(int) bytesMessage.getBodyLength()];
        bytesMessage.readBytes(bytes);
        System.out.println(new String(bytes));
    }
}

        查看管理界面,消息被消费:

 

        StreamMessage:

        生产者:

public class StreamMessageProducer {
    public static void main(String[] args) throws JMSException {
        // 创建ConnectionFactory的工厂的创建者
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory("tcp://192.168.232.135:61616");
        // 获取工厂
        Connection connection = activeMQConnectionFactory.createConnection();
        // 打开连接
        connection.start();
        // 创建Session对象
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        // 创建一个目的地 后面的这个参数表示的意思是:消息队列的名字
        Destination destination = new ActiveMQQueue("StreamMessage-Test");
        // 创建一个消息的生产者
        MessageProducer producer = session.createProducer(destination);
        // MapMessage的使用
        StreamMessage streamMessage=session.createStreamMessage();
        // 给StreamMessage设置数据
        streamMessage.writeString("StreamMessage测试");
        // 发送这个消息到目的地去
        producer.send(streamMessage);
        System.out.println("生产消息成功!");
        producer.close();
        session.close();
        connection.close();
    }
}

       查看管理界面,消息生产成功:

        消费者:


public class StreamMessageConsumer {
    public static void main(String[] args) throws JMSException {
        // 创建ConnectionFactory的工厂的创建者
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory("tcp://192.168.232.135:61616");
        // 获取工厂
        Connection connection = activeMQConnectionFactory.createConnection();
        // 打开连接
        connection.start();
        // 创建Session对象
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        // 创建一个目的地 后面的这个参数表示的意思是:消息队列的名字
        Destination destination = new ActiveMQQueue("StreamMessage-Test");
        // 创建消费者了
        MessageConsumer consumer = session.createConsumer(destination);
        // 异步方式接收
        consumer.setMessageListener(new MessageListener() {
            @Override
            public void onMessage(Message message) {
                StreamMessage streamMessage=(StreamMessage) message;
                try {
                    System.out.println("接收到的消息是:"+streamMessage.readString());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

        查看管理界面,消息消费成功:

        ObjectMessage:

        Student对象:

//序列化操作
public class Student implements Serializable {

    private Integer id;
    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

        生产者:


public class ObjectMessageProducer {
    public static void main(String[] args) throws JMSException {
        Student student = new Student();
        student.setId(1);
        student.setName("ObjectMessage测试");
        // 创建ConnectionFactory的工厂的创建者
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory("tcp://192.168.232.135:61616");
        // 获取工厂
        Connection connection = activeMQConnectionFactory.createConnection();
        // 打开连接
        connection.start();
        // 创建Session对象
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        // 创建一个目的地 后面的这个参数表示的意思是:消息队列的名字
        Destination destination = new ActiveMQQueue("ObjectMessage-Test");
        // 创建一个消息的生产者
        MessageProducer producer = session.createProducer(destination);
        // MapMessage的使用
        ObjectMessage objectMessage=session.createObjectMessage();
        // 给ObjectMessage设置数据
        objectMessage.setObject(student);
        // 发送这个消息到目的地去
        producer.send(objectMessage);
        System.out.println("生产消息成功!");
        producer.close();
        session.close();
        connection.close();
    }
}

        打开管理界面,消息成功生产:

        消费者:

public class ObjectMessageConsumer {
    public static void main(String[] args) throws JMSException {
        // 创建ConnectionFactory的工厂的创建者
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory("tcp://192.168.232.135:61616");
        //注意此处,根据apache官网说明,为了避免收到恶意代码,引入了安全机制,必须要这样做,否则报异常
        activeMQConnectionFactory.setTrustAllPackages(true);
        // 获取工厂
        Connection connection = activeMQConnectionFactory.createConnection();
        // 打开连接
        connection.start();
        // 创建Session对象
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        // 创建一个目的地 后面的这个参数表示的意思是:消息队列的名字
        Destination destination = new ActiveMQQueue("ObjectMessage-Test");
        // 创建消费者了
        MessageConsumer consumer = session.createConsumer(destination);
        // 异步方式接收
        consumer.setMessageListener(new MessageListener() {
            @Override
            public void onMessage(Message message) {
                ObjectMessage objectMessage=(ObjectMessage) message;

                try {
                    System.out.println("接收到的消息是:" + objectMessage.getObject().toString());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

        打开管理界面,消息成功消费:

        注意在使用ObjectMessage进行操作的时候,因为引入了安全机制,需要将setTrustAllPackages属性设置为true,否则会出现异常。

        以上就是ActiveMQ的五种消息数据类型。

发布了165 篇原创文章 · 获赞 41 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qq_41061437/article/details/100639539