JMS消息头
在传送消息时,消息头的值由JMS提供者来设置,因此开发者使用以上
setJMSXXX()方法分配的值就被忽略了,只有以下几个值是可以由开发者设置的:
JMSCorrelationID,JMSReplyTo,JMSType
JMS消息体
· TextMessage–一个字符串对象
· MapMessage–一套名称-值对
· ObjectMessage–一个序列化的 Java 对象
· BytesMessage–一个字节的数据流
· StreamMessage – Java原始值的数据流
//1,文本消息
TextMessage textMessage = session.createTextMessage("test msg");
//2,map消息
MapMessage mapMessage = session.createMapMessage();
mapMessage.setString("name","zhangsan");
mapMessage.setInt("age",20);
@JmsListener(destination = "${activemq.name}")
public void receiveMsg (Message message){
if(message instanceof MapMessage){
//接收map消息
MapMessage mapMessage = (MapMessage) message;
try {
System.out.println("name :"+mapMessage.getString("name"));
System.out.println("age :"+mapMessage.getString("age"));
} catch (JMSException e) {
e.printStackTrace();
}
}
}
//3,object消息
/**
* 发送object message 消息
*/
@Test
public void objectMessage(){
jmsTemplate.send(name, new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
//object消息
User user = new User("xiaoming","123456");
ObjectMessage objectMessage = session.createObjectMessage(user);
return objectMessage;
}
});
}
/**
* 注意:对象必须实现序列化
*/
public class User implements Serializable {
private String username;
private String password;
public User() {
}
public User(String username, String password) {
this.username = username;
this.password = password;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
}
application.yml中:
packages:
trust-all: true # 让activeMQ信任全部自定义对象,实现对象的序列号或反序列化
@JmsListener(destination = "${activemq.name}")
public void receiveMsg (Message message){
if(message instanceof ObjectMessage){
//接收object消息
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();
}
}
}
//4,bytes消息
/**
* 发送bytes 消息
*/
@Test
public void bytesMessage(){
jmsTemplate.send(name, new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
//bytes消息
BytesMessage bytesMessage = session.createBytesMessage();
//读取文件
File file = new File("F:/E类人才认定资料/社保证明.jpg");
try {
//构建文件输入流
FileInputStream fileInputStream = new FileInputStream(file);
//把文件流写入到缓存数组中
byte[] buffer = new byte[(int)file.length()];
fileInputStream.read(buffer);
//把缓存数组写入到BytesMessage中
bytesMessage.writeBytes(buffer);
} catch (Exception e) {
e.printStackTrace();
}
return bytesMessage;
}
});
}
在JmsListener中接收消息
@JmsListener(destination = "${activemq.name}")
public void receiveMsg (Message message){
if(message instanceof BytesMessage){
//接收BytesMessage消息
BytesMessage bytesMessage = (BytesMessage) message;
try {
System.out.println((int)bytesMessage.getBodyLength());
//设计缓存数组
byte[] buffer = new byte[(int)bytesMessage.getBodyLength()];
//把字节消息的内容写入到缓存数组
bytesMessage.readBytes(buffer);
//构建文件输出流
FileOutputStream fileOutputStream = new FileOutputStream("F:/E类人才认定资料/社保证明1.jpg");
//把数据写入本地硬盘
fileOutputStream.write(buffer);
} catch (Exception e) {
e.printStackTrace();
}
}
}
//5,Stream消息
/**
* 发送stream message 消息
*/
@Test
public void streamMessage(){
jmsTemplate.send(name, new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
//stream消息
StreamMessage streamMessage = session.createStreamMessage();
streamMessage.writeString("hello");
streamMessage.writeInt(123);
return streamMessage;
}
});
//接收端
@JmsListener(destination = "${activemq.name}")
public void receiveMsg (Message message){
if(message instanceof StreamMessage){
//接收StreamMessage消息
StreamMessage streamMessage = (StreamMessage) message;
try {
System.out.println(streamMessage.readString());
System.out.println(streamMessage.readInt());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
消息持久化