zoukankan      html  css  js  c++  java
  • 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发送对象)

  • 相关阅读:
    Dilworth定理,链还是反链?
    pku 3259Wormholes
    hdu 2612 Find a way
    hdu 2614
    hdu 2544 最短路
    hdu 2553 N皇后问题
    hdu2717 Catch That Cow
    hdu 1874 畅通工程续
    jquery学习必备代码和技巧
    HTML5 WebApp part4:使用 Web Workers 来加速您的移动 Web 应用程序(上)
  • 原文地址:https://www.cnblogs.com/jasonboren/p/13322429.html
Copyright © 2011-2022 走看看