rabbitmq发送消息的两种格式:发送json数据和直接发送对象以及对json与对象之间的相互转换

前奏:json格式字符串与Java对象的相互转换方法

第一种:com.fasterxml.jackson.databind.ObjectMapper 包

import com.fasterxml.jackson.databind.ObjectMapper;

ObjectMapper objectMapper = new ObjectMapper();
//json字符串转成Java对象
Myclass myclass = objectMapper.readValue(jsonStr , Myclass.class); 

//Java对象转成json字符串
String jsonStr = objectMapper.writeValueAsString(myclass);

第二种: com.alibaba.fastjson.JSONObject 包

import com.alibaba.fastjson.JSONObject;

// json转换成java对象
Myclass myclass = JSONObject.parseObject(jsonStr , Myclass.class);

//java对象转换成json
String jsonObject = JSONObject.toJSONString(myclass);

第三种:net.sf.json.JSONObject 包

import net.sf.json.JSONObject;

JSONObject jsonobject = JSONObject.fromObject(jsonStr);
//json字符串转成java对象
Myclass myclass = (MYclass)JSONObject.toBean(jsonobject,Myclass.class);

//java对象转换成json
JSONObject jsonStu = JSONObject.fromObject(testMQ);
String javaToJson=jsonStu.toString();

第四种:net.sf.json.JSONArray 包

import net.sf.json.JSONArray;

//把JSON字符串转换为JAVA对象数组
JSONArray json = JSONArray.fromObject(userStr);//userStr是json字符串

List<Myclass> myclasses = (List<Myclass>)JSONArray.toCollection(json,Myclass.class);

第一种:生产者发送json格式数据(将对象转成json然后发送,或者直接发送json数据),消费者接收json格式然后转换成对象进行消费。

第二种:生产者直接发送对象数据,消费者接收对象并进行消费。
需要注意的是,当生产者发送对象的话,需要将对象序列化,消费者将对象进行反序列化即可。

要发送的对象类

public class TestMQ implements Serializable {
    private String name;
    private Integer age;
    //setter/getter以及toString()方法
}

发送消息的接口

/**
 * 发送消息的接口,如果要发送消息就实现这个接口
 * @author Administrator
 */
public interface MQProducer {
    /**
     * 发送消息到指定队列
     * @param queueKey
     * @param 
     */
    public void sendDataToQueue(String exchange, String queueKey, Object object);
}
/**
 * 实现了发送消息的接口,实现里面的方法进行发送消息
 * @author Administrator
 */
@SuppressWarnings("ALL")
@Component
public class RabbitMQProducer implements MQProducer {

    @Resource(name="amqpTemplate")
    private AmqpTemplate amqpTemplate;

    @Override
    public void sendDataToQueue(String exchange, String queueKey, Object object) {
        System.out.println("sendDataToQueue --"+amqpTemplate);
        try {
            amqpTemplate.convertAndSend(exchange, queueKey, object);
            System.out.println("------------消息发送成功");
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}
@Resource
private MQProducer rabbitMQProducer;

/**
	 * 这里使用rabbitmq是通过配置文件的形式进行使用的
	 * 主要的内容是:在rabbitmq.xml中配置队列的相关信息例如connection、exchange等以及队列消息的监听器等相关配置
	 * 定义一个发送消息的接口,使用时实现这个接口,在实现类里重写AmqpTemplate amqpTemplate 的sendDataToQueue方法。
	 *
	 * @throws Exception
	 */
@Test
public void MQProducer() throws Exception{
    String exchangeName="clsExchange";
    String bindingKey="merchant.queue.jasonqueue";
    //需要发送的对象
    TestMQ testMQ=new TestMQ();
    testMQ.setAge(8101);
    testMQ.setName("javatojson");
    //将对象通过字节流和对象输出流写出去
    ByteArrayOutputStream bo = new ByteArrayOutputStream();
    ObjectOutputStream oo = new ObjectOutputStream(bo);
    oo.writeObject(testMQ);
    byte[] javaByte=bo.toByteArray();

    //生产者直接发送对象
    rabbitMQProducer.sendDataToQueue(exchangeName,bindingKey,javaByte);
}

通过监听消费这个消息

import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageListener;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class TestClsConsumer implements MessageListener  {
    @Override
    public void onMessage(Message message) {
        //字节码转化为对象
        byte[] bytes=message.getBody();
        ByteArrayInputStream bi = new ByteArrayInputStream(bytes);
        ObjectInputStream oi = null;
        try {
            oi = new ObjectInputStream(bi);
            TestMQ testMQ=(TestMQ) oi.readObject();
            System.out.println("消费者直接接收对象进行消费(进行处理一些业务):"+testMQ.getName());
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

参考博文:
(1) https://www.cnblogs.com/fpqi/p/9722235.html (json格式转换成对象相关方法)
(2) https://blog.csdn.net/ws379374000/article/details/77982163 (json数组和List集合转换)
(3) https://blog.csdn.net/east123321/article/details/78900791?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.compare&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.compare (rabbitmq发送对象)

原文地址:https://www.cnblogs.com/jasonboren/p/13322429.html