在讲ActiveMQ中的数据类型之前,我们先了解一下JMS。
JMS(Java Messaging Service)是Java平台上有关面向消息中间件的技术规范,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发。
JMS本身只定义了一系列的接口规范,是一种与厂商无关的 API,用来访问消息收发系统。它类似于 JDBC(Java Database 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中数据类型。
生产者:
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());
}
}
启动后消息即被消费:
生产者:
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();
}
}
});
}
}
查看管理界面,消息被消费:
生产者:
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));
}
}
查看管理界面,消息被消费:
生产者:
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();
}
}
});
}
}
查看管理界面,消息消费成功:
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的五种消息数据类型。