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发送对象)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决