ActiveMQ入门 (三) JMS消息组成

ActiveMQ入门 (三) JMS消息组成

文章目录

  • ActiveMQ入门 (三) JMS消息组成
  • 一、JMS协议组成结构
  • 二、JMS Message消息组成
    • 1.JMS消息头
    • 2.JMS消息体
      • 1. TextMessage 字符串对象
      • 2. MapMessage 一套值对
      • 3. ObjectMessage 一个序列化的Java对象X
      • 4. BytesMessage 一个字节的数据流
      • 5.StreamMessage Java原始值的数据流
  • 三、JMS Property设置标签过滤

一、JMS协议组成结构

ActiveMQ入门 (三) JMS消息组成_第1张图片

二、JMS Message消息组成

1.JMS消息头

生产者到消费者之间信息的一种约定
ActiveMQ入门 (三) JMS消息组成_第2张图片

2.JMS消息体

ActiveMQ入门 (三) JMS消息组成_第3张图片

1. TextMessage 字符串对象

/**
* 发送TextMessage消息
*/
@Test
public void testMessage(){
	jmsTemplate.send(name, new MessageCreator() {
	@Override
	public Message createMessage(Session session) throws JMSException {
		TextMessage textMessage = session.createTextMessage("文本消息");
		return textMessage;
		}
	});
}
/**
* 接收TextMessage的方法
*/
@JmsListener(destination = "${activemq.name}")
public void receiveMessage(Message message){
	if(message instanceof TextMessage){
		TextMessage textMessage = (TextMessage)message;
		try {
			System.out.println("接收消息:"+textMessage.getText());
		} catch (JMSException e) {
			e.printStackTrace();
		}
	}
}

2. MapMessage 一套值对

/**
* 发送MapMessage消息
*/
@Test
public void mapMessage(){
	jmsTemplate.send(name, new MessageCreator() {
	@Override
	public Message createMessage(Session session) throws JMSException {
		MapMessage mapMessage = session.createMapMessage();
		mapMessage.setString("name","张三");
		mapMessage.setInt("age",20);
		return mapMessage;
		}
	});
}

@JmsListener(destination = "${activemq.name}")
public void receiveMessage(Message message){
	if(message instanceof MapMessage){
		MapMessage mapMessage = (MapMessage)message;
	try {
		System.out.println("名称:"+mapMessage.getString("name"));
		System.out.println("年龄:"+mapMessage.getString("age"));
	} catch (JMSException e) {
		e.printStackTrace();
	}
	}
}

3. ObjectMessage 一个序列化的Java对象X

//发送ObjectMessage消息
@Test
public void test2(){
	jmsTemplate.send(name, new MessageCreator() {
	@Override
	public Message createMessage(Session session) throws JMSException {
		User user = new User();
		user.setName("小苍");
		user.setAge(18);
		ObjectMessage objectMessage = session.createObjectMessage(user);
		return objectMessage;
		}
	});
}
@JmsListener(destination = "${activemq.name}")
public void receiveMessage(Message message){
	if(message instanceof ObjectMessage){
		ObjectMessage objectMessage = (ObjectMessage)message;
	try {
		User user = (User)objectMessage.getObject();
		System.out.println(user.getUsername());
		System.out.println(user.getPassword());
	} catch (JMSException e) {
		e.printStackTrace();
		}
	}
}

ActiveMQ5.12后 ,为了安全考虑,ActiveMQ默认不接受自定义的序列化对象,需要将自定义的加入到受信任的列表。

spring:
	activemq:
		broker-url: tcp://192.168.66.133:61616
		user: admin
		password: admin
		packages:
			trust-all: true # 添加所有包到信任列表

4. BytesMessage 一个字节的数据流

//发送BytesMessage消息
@Test
public void test3(){
	jmsTemplate.send(name, new MessageCreator() {
	@Override
	public Message createMessage(Session session) throws JMSException {
		BytesMessage bytesMessage = session.createBytesMessage();
		try {
			File file = new File("d:/spring.jpg");
			FileInputStream in = new FileInputStream(file);
			byte[] bytes = new byte[(int)file.length()];
			in.read(bytes);
			bytesMessage.writeBytes(bytes);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return bytesMessage;
	}
});
}

@JmsListener(destination="${activemq.name}")
	public void receiveMessage(Message message) throws Exception {
		BytesMessage bytesMessage = (BytesMessage)message;
		FileOutputStream out = new FileOutputStream("d:/abc.jpg");
		byte[] buf = new byte[(int)bytesMessage.getBodyLength()];
		bytesMessage.readBytes(buf);
		out.write(buf);
		out.close();
}

5.StreamMessage Java原始值的数据流

//发送StreamMessage消息
	@Test
	public void test4(){
		jmsTemplate.send(name, new MessageCreator() {
			@Override
			public Message createMessage(Session session) throws JMSException {
				StreamMessage streamMessage = session.createStreamMessage();
				streamMessage.writeString("你好,ActiveMQ");
				streamMessage.writeInt(20);
				return streamMessage;
			}
		});
	}

@JmsListener(destination="${activemq.name}")
	public void receiveMessage(Message message) throws Exception {
		StreamMessage streamMessage = (StreamMessage)message;
		String str = streamMessage.readString();
		int i = streamMessage.readInt();
		System.out.println(str);
		System.out.println(i);
	}

三、JMS Property设置标签过滤

我们可以给消息设置自定义属性,这些属性主要是提供给应用程序的。对于实现消息过滤功能,消息属性非常有用,JMS API定义了一些标准属性,JMS服务提供者可以选择性的提供部分标准属性。

message.setStringProperty("Property",Property); //自定义属性

你可能感兴趣的:(ActiveMQ,中间件)