精华内容
下载资源
问答
  • JPA(@Transient @JsonProperty)注解实现对象非持久化,同时可以被序列化的实践 目的:对象的属性有些被设计为数据库可持久化的字段属性,但是前后端数据传输过程有些字段是不需要被持久化的,所以仅仅被序列化即可...

    JPA(@Transient @JsonProperty)注解实现对象非持久化,同时可以被序列化的实践


    目的:对象的属性有些被设计为数据库可持久化的字段属性,但是前后端数据传输过程有些字段是不需要被持久化的,所以仅仅被序列化即可。
    这时只需要组合使用@Transient @JsonProperty
    
    • 场景:
      • 代码如下:BusinessDomain DataDomain 这两个对象是不需要持久化的,只是列表展示数据需要用到,这时可以考虑组合使用@Transient @JsonProperty,以便达到开发目的
    package com.xxx.xxx.domain;
    
    import com.fasterxml.jackson.annotation.JsonProperty;
    import lombok.Data;
    
    import javax.persistence.*;
    
    import java.io.Serializable;
    import java.time.ZonedDateTime;
    
    /**
     * A BusinessProcess.
     */
    @Entity
    @Table(name = "business_process")
    @Data
    public class BusinessProcess  implements Serializable{
    
        private static final long serialVersionUID = 1L;
    
        @Transient
        @JsonProperty
        private BusinessDomain businessDomain;
    
        @Transient
        @JsonProperty
        private DataDomain dataDomain;
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
    
        @Column(name = "creator")
        private String creator;
    
        @Column(name = "modifier")
        private String modifier;
    
        @Column(name = "business_domain_id")
        private Long businessDomainId;
    
        @Column(name = "data_domain_id")
        private Long dataDomainId;
    
        @Column(name = "english_name")
        private String englishName;
    
        @Column(name = "chinese_name")
        private String chineseName;
    
        @Column(name = "jhi_desc")
        private String desc;
    
        @Column(name = "update_time")
        private ZonedDateTime updateTime;
    
        @Column(name = "create_time")
        private ZonedDateTime createTime;
    
        @Override
        public boolean equals(Object o) {
            if (this == o) {
                return true;
            }
            if (!(o instanceof BusinessProcess)) {
                return false;
            }
            return id != null && id.equals(((BusinessProcess) o).id);
        }
    
        @Override
        public int hashCode() {
            return 31;
        }
    
        @Override
        public String toString() {
            return "BusinessProcess{" +
                "id=" + getId() +
                ", creator='" + getCreator() + "'" +
                ", modifier='" + getModifier() + "'" +
                ", businessDomainId=" + getBusinessDomainId() +
                ", dataDomainId=" + getDataDomainId() +
                ", englishName='" + getEnglishName() + "'" +
                ", chineseName='" + getChineseName() + "'" +
                ", desc='" + getDesc() + "'" +
                ", updateTime='" + getUpdateTime() + "'" +
                ", createTime='" + getCreateTime() + "'" +
                "}";
        }
    }
    
    
    • API接口
     /**
         * {@code GET  /business-processes/:id} : get the "id" businessProcess.
         *
         * @param id the id of the businessProcess to retrieve.
         * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the businessProcess, or with status {@code 404 (Not Found)}.
         */
        @GetMapping("/business-processes/{id}")
        public ResponseEntity<BusinessProcess> getBusinessProcess(@PathVariable Long id) {
            log.debug("REST request to get BusinessProcess : {}", id);
            Optional<BusinessProcess> businessProcess = businessProcessService.findOne(id);
            return ResponseUtil.wrapOrNotFound(businessProcess);
        }
    
    • 最终效果
    [
        {
            "businessDomain": null,
            "dataDomain": null,
            "id": 1,
            "creator": "mobile Fish",
            "modifier": "Home Loan Account Table Computer",
            "businessDomainId": 5808,
            "dataDomainId": 45924,
            "englishName": "seamless Metal deposit",
            "chineseName": "Producer",
            "desc": "Implementation Electronics Officer",
            "updateTime": "2020-02-23T15:07:17+08:00",
            "createTime": "2020-02-23T22:38:20+08:00"
        },
        {
            "businessDomain": {
                "id": 39986,
                "creator": "mobile Fish",
                "modifier": "Home Loan Account Table Computer",
                "englishName": "Trace",
                "chineseName": "Savings Account alarm",
                "domainDesc": "Tasty Metal Bacon",
                "partitionEnglishName": "red Chips Soap",
                "partitionChineseName": "Home Loan Account",
                "type": 706,
                "defaults": "Home Namibia",
                "partitionDesc": "Steel zero administration",
                "businessDateName": "Multi-channelled Licensed",
                "businessDateParameter": "grey Cambridgeshire",
                "updateTime": "2020-02-23T15:46:50+08:00",
                "createTime": "2020-02-23T18:47:46+08:00"
            },
            "dataDomain": {
                "id": 13949,
                "creator": "mobile Fish",
                "modifier": "Home Loan Account Table Computer",
                "englishName": "Trace",
                "chineseName": "Savings Account alarm",
                "englishAbbreviations": "Tasty Metal Bacon",
                "fieldDesc": "red Chips Soap",
                "updateTime": "2020-02-23T22:32:30+08:00",
                "createTime": "2020-02-23T15:09:50+08:00"
            },
            "id": 2,
            "creator": "Albania web-readiness",
            "modifier": "Namibia",
            "businessDomainId": 39986,
            "dataDomainId": 13949,
            "englishName": "zero administration",
            "chineseName": "Multi-channelled Licensed",
            "desc": "grey Cambridgeshire",
            "updateTime": "2020-02-23T15:43:22+08:00",
            "createTime": "2020-02-23T18:44:19+08:00"
        },
        {
            "businessDomain": null,
            "dataDomain": null,
            "id": 3,
            "creator": "HDD",
            "modifier": "Table Small Frozen Sausages Planner",
            "businessDomainId": 80839,
            "dataDomainId": 38541,
            "englishName": "Music",
            "chineseName": "Nakfa",
            "desc": "Bahamian Dollar Investment Account",
            "updateTime": "2020-02-23T09:56:39+08:00",
            "createTime": "2020-02-24T05:06:55+08:00"
        },
        {
            "businessDomain": null,
            "dataDomain": null,
            "id": 4,
            "creator": "Regional",
            "modifier": "Tuna",
            "businessDomainId": 75536,
            "dataDomainId": 31171,
            "englishName": "Costa Rica Mayotte",
            "chineseName": "Industrial",
            "desc": "connect Markets Chief",
            "updateTime": "2020-02-23T15:35:29+08:00",
            "createTime": "2020-02-23T12:29:11+08:00"
        },
        {
            "businessDomain": null,
            "dataDomain": null,
            "id": 5,
            "creator": "archive Georgia Aruba",
            "modifier": "software scale interactive",
            "businessDomainId": 82873,
            "dataDomainId": 58675,
            "englishName": "Specialist Home Loan Account",
            "chineseName": "Plastic",
            "desc": "Car Industrial deliverables",
            "updateTime": "2020-02-23T20:27:49+08:00",
            "createTime": "2020-02-24T01:10:18+08:00"
        },
        {
            "businessDomain": null,
            "dataDomain": null,
            "id": 6,
            "creator": "Books",
            "modifier": "magenta monitor 1080p",
            "businessDomainId": 60595,
            "dataDomainId": 7404,
            "englishName": "world-class Frozen IB",
            "chineseName": "Highway Ergonomic",
            "desc": "moratorium moratorium",
            "updateTime": "2020-02-23T12:25:49+08:00",
            "createTime": "2020-02-23T15:44:59+08:00"
        },
        {
            "businessDomain": null,
            "dataDomain": null,
            "id": 7,
            "creator": "tangible Mississippi",
            "modifier": "Frozen bus",
            "businessDomainId": 76078,
            "dataDomainId": 72172,
            "englishName": "Robust Networked",
            "chineseName": "Poland",
            "desc": "Small partnerships",
            "updateTime": "2020-02-24T01:05:58+08:00",
            "createTime": "2020-02-24T05:11:11+08:00"
        },
        {
            "businessDomain": null,
            "dataDomain": null,
            "id": 8,
            "creator": "withdrawal knowledge base Buckinghamshire",
            "modifier": "Concrete Investment Account Saint Lucia",
            "businessDomainId": 20306,
            "dataDomainId": 22879,
            "englishName": "Generic neutral Salad",
            "chineseName": "Auto Loan Account modular Refined",
            "desc": "digital maroon",
            "updateTime": "2020-02-23T08:31:10+08:00",
            "createTime": "2020-02-23T08:44:32+08:00"
        },
        {
            "businessDomain": null,
            "dataDomain": null,
            "id": 9,
            "creator": "projection Fresh",
            "modifier": "support Gorgeous",
            "businessDomainId": 22793,
            "dataDomainId": 64769,
            "englishName": "Jewelery cutting-edge",
            "chineseName": "Games",
            "desc": "Iraq Bedfordshire",
            "updateTime": "2020-02-23T13:19:21+08:00",
            "createTime": "2020-02-24T03:03:50+08:00"
        },
        {
            "businessDomain": null,
            "dataDomain": null,
            "id": 10,
            "creator": "24/7",
            "modifier": "Gloves sky blue Oklahoma",
            "businessDomainId": 40383,
            "dataDomainId": 36362,
            "englishName": "Engineer",
            "chineseName": "Exclusive Moroccan Dirham card",
            "desc": "zero tolerance",
            "updateTime": "2020-02-24T05:03:20+08:00",
            "createTime": "2020-02-23T23:32:17+08:00"
        }
    ]
    
    展开全文
  • hibernate中设置字段不持久化 注解

    万次阅读 2016-06-01 11:34:25
    hibernate中Modle中的有些属性不想创建表是在数据库中产生字段保存...班级老师 老师身份证号 我们的需求想把老师身份证号不保存到数据库里不想对身份证不持久化数据解决方法很简单就是在对应的字段上面加@Transien...

    hibernate中Modle中的有些属性不想创建表是在数据库中产生字段保存数据,当这种需求是我们可以设置@transient表示透明的当设置此属性是在创建数据库是可以对此属性忽略,在本例中模拟了一个班级表表名为MyClass 属性有数据库id 班级名称 班级老师 老师身份证号 我们的需求想把老师身份证号不保存到数据库里不想对身份证不持久化数据解决方法很简单就是在对应的字段上面加@Transient的注解就搞定。

    实例代码如下:

    第一步:创建Java工程编写三个项目包把hibernate用的jar包添加到path里然后创建Modle类代码如下

     

    package com.ygc.hibernate.modle;  
      
    import java.io.Serializable;  
      
    import javax.persistence.Basic;  
    import javax.persistence.Entity;  
    import javax.persistence.GeneratedValue;  
    import javax.persistence.GenerationType;  
    import javax.persistence.Id;  
    import javax.persistence.Table;  
    import javax.persistence.Transient;  
    @Entity  
    @Table(name="Class")  //设置数据库表名为class  
    public class MyClass implements Serializable {  
        private int id;  
        private String className;  
        private String teacher;  
        private String teacherNumber;  
          
        @Id  
        @GeneratedValue(strategy=GenerationType.AUTO)  //设置主键自动增长  
        public int getId() {  
            return id;  
        }  
        public void setId(int id) {  
            this.id = id;  
        }  
          
        @Basic  
        public String getClassName() {  
            return className;  
        }  
        public void setClassName(String className) {  
            this.className = className;  
        }  
        public String getTeacher() {  
            return teacher;  
        }  
        public void setTeacher(String teacher) {  
            this.teacher = teacher;  
        }  
        //这是此注解后该属性不会数据持久化也是本例要说明的注解  
        @Transient  
        public String getTeacherNumber() {  
            return teacherNumber;  
        }  
        public void setTeacherNumber(String teacherNumber) {  
            this.teacherNumber = teacherNumber;  
        }  
    }  

     

    第二步:编写测试类就是Main方法的。

     

    package com.ygc.hibernate.main;  
    import org.hibernate.Session;  
      
    import com.ygc.hibernate.modle.MyClass;  
    import com.ygc.hibernate.utils.HibernateUtils;  
    public class ClassTest {  
      
        /** 
         * @param args 
         */  
        public static void main(String[] args) {  
            MyClass clas1 = new MyClass();  
            clas1.setClassName("大学二年级");  
            clas1.setTeacher("田红菊");  
            clas1.setTeacherNumber("0100");  
              
            Session session = HibernateUtils.getFactory().openSession();  
            session.beginTransaction();  
            session.save(clas1);  
            session.getTransaction().commit();  
            session.close();  
            HibernateUtils.getFactory().close();  
        }  
    }  

     

    第三步:创建工具类就是把SessionFactory的方法单独写成工具类

     

    package com.ygc.hibernate.utils;  
      
    import org.hibernate.SessionFactory;  
    import org.hibernate.cfg.AnnotationConfiguration;  
    import org.hibernate.cfg.Configuration;  
      
    public class HibernateUtils {  
        private HibernateUtils(){}  
        private static HibernateUtils hibernateUtils;  
        private HibernateUtils getHibernateUtils(){  
            if(hibernateUtils==null){  
                hibernateUtils = new HibernateUtils();  
            }  
            return hibernateUtils;  
        }  
          
        public static SessionFactory getFactory(){  
            Configuration configuration = new AnnotationConfiguration().configure();  
            return configuration.buildSessionFactory();  
        }  
    } 

     

    第四步:修改hibernate.cfg.xml的配置文件

     

    <?xml version='1.0' encoding='utf-8'?>  
    <!DOCTYPE hibernate-configuration PUBLIC  
            "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
            "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">  
      
    <hibernate-configuration>  
      
        <session-factory>  
      
            <!-- Database connection settings -->  
            <property name="connection.driver_class">com.mysql.jdbc.Driver</property>  
            <property name="connection.url">jdbc:mysql://localhost/hibernate</property>  
            <property name="connection.username">root</property>  
            <property name="connection.password">root</property>  
      
            <!-- JDBC connection pool (use the built-in) -->  
            <!--<property name="connection.pool_size">1</property>-->  
      
            <!-- SQL dialect -->  
            <property name="dialect">org.hibernate.dialect.MySQLDialect</property>  
      
            <!-- Enable Hibernate's automatic session context management -->  
            <!--<property name="current_session_context_class">thread</property>-->  
      
            <!-- Disable the second-level cache  -->  
            <!--<property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>-->  
      
            <!-- Echo all executed SQL to stdout -->  
            <property name="show_sql">true</property>  
            <!--自动创建表-->  
           <property name="hbm2ddl.auto">create</property>  
      
            <!-- Drop and re-create the database schema on startup -->  
            <!--<property name="hbm2ddl.auto">update</property>-->  
      
            <!--<mapping resource="com/ygc/hibernate/modle/Students.hbm.xml"/>-->  
            <mapping class="com.ygc.hibernate.modle.Class"/>  
      
        </session-factory>  
      
    </hibernate-configuration>  

     

     

     

    第五步:添加log4j的配置文件就是用来打印日志的,记得添加log4j的jar包

     

    # Configure logging for testing: optionally with log file  
    # debug,info,warn,error,fatal  
    log4j.rootLogger=debug, stdout, logfile  
      
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
    log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n  
      
    log4j.appender.logfile=org.apache.log4j.FileAppender  
    log4j.appender.logfile.File=D:/logs/hibernate.log  
    log4j.appender.logfile.layout=org.apache.log4j.PatternLayout  
    log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n  
      
    log4j.logger.org.hibernate.tool.hbm2ddl=debug  

     

    最后一步运行查看结果

     

    C:\Documents and Settings\Administrator>mysql -uroot -proot  
    Welcome to the MySQL monitor.  Commands end with ; or \g.  
    Your MySQL connection id is 3  
    Server version: 5.5.15 MySQL Community Server (GPL)  
      
    Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.  
      
    Oracle is a registered trademark of Oracle Corporation and/or its  
    affiliates. Other names may be trademarks of their respective  
    owners.  
      
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 


     

    mysql> show databases;  
    +--------------------+  
    | Database           |  
    +--------------------+  
    | information_schema |  
    | hibernate          |  
    | hibernates         |  
    | mysql              |  
    | performance_schema |  
    | test               |  
    | xqwy               |  
    +--------------------+  
    7 rows in set (0.01 sec)  

     

     

    mysql> show tables;  
    +---------------------+  
    | Tables_in_hibernate |  
    +---------------------+  
    | class               |  
    | music               |  
    | product             |  
    | students            |  
    | teacher             |  
    | xuxudan             |  
    +---------------------+  
    6 rows in set (0.08 sec)  
      
    mysql> select * from class;  
    Empty set (0.00 sec)  

     

     

    mysql> select * from class;  
    +----+------------+---------+  
    | id | className  | teacher |  
    +----+------------+---------+  
    |  1 | 大学二年级 | 田红菊  |  
    +----+------------+---------+  
    1 row in set (0.00 sec)  

    通过以上结果发现老师的身份证号码没有被插入到数据库,说明我们添加的@transient有效了。

     

    展开全文
  • 2019独角兽企业重金招聘Python工程师标准>>> ...
    @Transient
    	public Double getDayLimitDoulbe() {
    		return this.dayLimitDouble;
    	}


    转载于:https://my.oschina.net/u/914897/blog/404915

    展开全文
  • RabbitMQ消息持久化总结

    千次阅读 2019-07-06 09:17:06
    如果遇到RabbitMQ服务停止或者挂掉,那么我们的消息将会出现丢失的情况,为了在RabbitMQ服务重启的情况下,不丢失消息,我们可以将Exchange(交换机)、Queue(队列)与Message(消息)都设置为可持久化的(durable...

    目录

    一、简介

    二、要点

    三、使用方法

    四、总结


    一、简介

    在RabbitMQ中,如果遇到RabbitMQ服务停止或者挂掉,那么我们的消息将会出现丢失的情况,为了在RabbitMQ服务重启的情况下,不丢失消息,我们可以将Exchange(交换机)、Queue(队列)与Message(消息)都设置为可持久化的(durable)。这样的话,能够保证绝大部分的消息不会被丢失,但是还有有一些小概率会发生消息丢失的情况。下面通过一个简单的示例总结在RabbitMQ中如何进行消息持久化。

    二、要点

    消息持久化主要是将交换机、队列以及消息设置为durable = true(可持久化的),要点主要有三个:

    • a. 声明交换机Exchange的时候设置 durable=true;
    //public TopicExchange(String name, boolean durable, boolean autoDelete)
    public TopicExchange exchange() {
            return new TopicExchange(EXCHANGE_NAME,true,false);
        }
    
    • b. 声明队列Queue的时候设置 durable=true;
    //public Queue(String name, boolean durable)
    @Bean
        public Queue queue() {
            //durable:是否将队列持久化 true表示需要持久化 false表示不需要持久化
            return new Queue(QUEUE_NAME, false);
        }
    • c. 发送消息的时候设置消息的 deliveryMode = 2;
    使用convertAndSend方式发送消息,消息默认就是持久化的.
    new MessageProperties() --> DEFAULT_DELIVERY_MODE = MessageDeliveryMode.PERSISTENT --> deliveryMode = 2;

    三、使用方法

    这里我们声明两种队列,一个是持久化的,一个是非持久化的,我们测试在RabbitMQ服务重启的情况下,未被消费的消息是否还存在,消费者重启之后能否重新消费之前的消息。在RabbitMQ中,通过管理员方式(必须是管理员方式,否则可能会报错)运行CMD命令行执行下面的命令:

    net stop RabbitMQ && net start RabbitMQ

    【a】RabbitMQ配置类: RabbitMQ配置信息,绑定交换器、队列、路由键设置

    package com.wsh.springboot.springbooy_rabbitmq_message_persistence.config;
    
    import org.springframework.amqp.core.Binding;
    import org.springframework.amqp.core.BindingBuilder;
    import org.springframework.amqp.core.Queue;
    import org.springframework.amqp.core.TopicExchange;
    import org.springframework.context.annotation.Bean;
    import org.springframework.stereotype.Component;
    
    /**
     * @Description: RabbitMQ配置信息,绑定交换器、队列、路由键设置
     * @author: weishihuai
     * @Date: 2019/6/30 15:38
     * <p>
     * 如果我们希望即使在RabbitMQ服务重启的情况下,也不会丢失消息,可以将交换机、队列、消息都进行持久化,这样可以保证绝大部分情况下消息不会丢失。
     * 但还是会有小概率发生消息丢失的情况(比如RabbitMQ服务器已经接收到生产者的消息,但还没来得及持久化该消息时RabbitMQ服务器就断电了),
     * 如果我们需要对这种小概率事件也要管理起来,那么我们要用到事务。(transaction/confirm机制)
     *
     * <p>
     * 说明:
     * 1. 队列持久化:需要在声明队列的时候设置durable=true,如果只对队列进行持久化,那么mq重启之后队列里面的消息不会保存
     * 如果需要队列里面的消息也保存下来,那么还需要对消息进行持久化;
     * <p>
     * 2. 消息持久化:设置消息的deliveryMode = 2,消费者重启之后还能够继续消费持久化之后的消息;
     * 使用convertAndSend方式发送消息,消息默认就是持久化的,下面是源码:
     * new MessageProperties() --> DEFAULT_DELIVERY_MODE = MessageDeliveryMode.PERSISTENT --> deliveryMode = 2;
     * <p>
     * 3.重启mq: CMD命令行下执行 net stop RabbitMQ && net start RabbitMQ
     */
    @Component
    public class RabbitMQConfig {
        private static final String DURABLE_QUEUE_NAME = "durable_queue_name";
        private static final String DURABLE_EXCHANGE_NAME = "durable_exchange_name";
        private static final String ROUTING_KEY = "user.#";
    
        private static final String QUEUE_NAME = "not_durable_queue_name";
        private static final String EXCHANGE_NAME = "not_durable_exchange_name";
    
        @Bean
        public Queue durableQueue() {
    //        public Queue(String name) {
    //            this(name, true, false, false);
    //        }
    //        public Queue(String name, boolean durable, boolean exclusive, boolean autoDelete)
            //不指定durable的话默认好像也是true
    
            //public Queue(String name, boolean durable)
            //durable:是否将队列持久化 true表示需要持久化 false表示不需要持久化
            return new Queue(DURABLE_QUEUE_NAME, true);
        }
    
        @Bean
        public TopicExchange durableExchange() {
    //        public AbstractExchange(String name) {
    //            this(name, true, false);
    //        }
    //        public AbstractExchange(String name, boolean durable, boolean autoDelete) {
    //            this(name, durable, autoDelete, (Map)null);
    //        }
            //声明交换机的时候默认也是持久化的
            return new TopicExchange(DURABLE_EXCHANGE_NAME);
        }
    
        @Bean
        public Binding durableBinding() {
            //如果exchange和queue都是持久化的,那么它们之间的binding也是持久化的。如果exchange和queue两者之间有一个持久化,一个非持久化,就不允许建立绑定
            return BindingBuilder.bind(durableQueue()).to(durableExchange()).with(ROUTING_KEY);
        }
    
    
        @Bean
        public Queue queue() {
            //public Queue(String name, boolean durable)
            //durable:是否将队列持久化 true表示需要持久化 false表示不需要持久化
            return new Queue(QUEUE_NAME, false);
        }
    
        @Bean
        public TopicExchange exchange() {
            return new TopicExchange(EXCHANGE_NAME,true,false);
        }
    
        @Bean
        public Binding binding() {
            return BindingBuilder.bind(queue()).to(exchange()).with(ROUTING_KEY);
        }
    
    }

    比较主要的点 都在代码中写了注释,这里就不用过多说明。

    【b】生产者:

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.amqp.rabbit.core.RabbitTemplate;
    import org.springframework.amqp.rabbit.support.CorrelationData;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    import java.util.UUID;
    
    /**
     * @Description: 生产者
     * @author: weishihuai
     * @Date: 2019/6/30 15:38
     */
    @Component
    public class Producer {
        private static final Logger logger = LoggerFactory.getLogger(Producer.class);
        private static final String DURABLE_EXCHANGE_NAME = "durable_exchange_name";
        private static final String ROUTING_KEY = "user.add";
    
        @Autowired
        private RabbitTemplate rabbitTemplate;
    
        public void sendMessage() {
            for (int i = 1; i <= 3; i++) {
                String message = "消息" + i;
                logger.info("【生产者】发送消息:" + message);
                rabbitTemplate.convertAndSend(DURABLE_EXCHANGE_NAME, ROUTING_KEY, message, new CorrelationData(UUID.randomUUID().toString()));
            }
        }
    
    }
    

    【c】消费者:

    import com.rabbitmq.client.Channel;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.amqp.core.Message;
    import org.springframework.amqp.rabbit.annotation.RabbitListener;
    import org.springframework.stereotype.Component;
    
    /**
     * @Description: 消费者
     * @author: weishihuai
     * @Date: 2019/6/30 15:38
     */
    @Component
    public class Consumer {
        private static final Logger logger = LoggerFactory.getLogger(Consumer.class);
    
        @RabbitListener(queues = "durable_queue_name")
        public void receiveMessage(String msg, Message message, Channel channel) {
            try {
                logger.info("【Consumer  receiveMessage】接收到消息为:[{}]", msg);
                channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
            } catch (Exception e) {
                logger.info("【Consumer  receiveMessage】接收消息后的处理发生异常", e);
            }
        }
    
    }
    

    【d】应用配置文件

    server:
      port: 9999
    spring:
      application:
        name: mq-message-persistence
      rabbitmq:
        host: 127.0.0.1
        virtual-host: /vhost
        username: wsh
        password: wsh
        port: 5672
        connection-timeout: 10000

    【e】测试用例

    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class SpringbooyRabbitmqMessagePersistenceApplicationTests {
    
        @Autowired
        private Producer producer;
    
        @Test
        public void contextLoads() {
            producer.sendMessage();
        }
    
    }
    

    【f】运行结果

    为了测试在MQ重启之后,消费者能够消费持久化之后的消息,这里可以先将消费者监听队列暂时注释掉,让生产者发送三条消息,但是没有消费者去消费,这样MQ重启之后,队列中还是存在三条消息。

    启动项目,通过管理控制台可以看到成功创建两个交换机以及两个队列。

    这时候,我们重启RabbitMQ服务,检查一下重启之后队列、消息是否还存在。

    通过控制台,可见只剩下一个持久化的队列durable_queue_name,并且队列里面的消息还存在,另外一个not_durable_queue_name已经丢失,说明在该队列上的消息也已经丢失。

    同理,交换机也类似。

    这时候放开之前注释的消费者代码块,重启项目,通过控制台可以看到消费者成功消费了之前持久化的三条消息,由此证明了在MQ重启之后,消费者可以继续消费之前的消息

    【g】关于默认持久化的说明

    • 我们使用new Queue()创建队列的时候,默认就是持久化的,即durable=true,下面是部分源码:

    • 创建交换机的时候,也是默认持久化交换机的,下面是构造器源码:

    • 使用convertAndSend方式发送消息,消息默认就是持久化的,下面是源码:
      public void convertAndSend(String exchange, String routingKey, Object object, CorrelationData correlationData) throws AmqpException {
            this.send(exchange, routingKey, this.convertMessageIfNecessary(object), correlationData);
        }
       
    
     protected Message convertMessageIfNecessary(Object object) {
            return object instanceof Message ? (Message)object : this.getRequiredMessageConverter().toMessage(object, new MessageProperties());
        }
    
    
     public MessageProperties() {
            this.deliveryMode = DEFAULT_DELIVERY_MODE;
            this.priority = DEFAULT_PRIORITY;
        }
    
    
    public static final MessageDeliveryMode DEFAULT_DELIVERY_MODE;
    
     static {
            DEFAULT_DELIVERY_MODE = MessageDeliveryMode.PERSISTENT;
            DEFAULT_PRIORITY = 0;
        }
    
    public static int toInt(MessageDeliveryMode mode) {
            switch(mode) {
            case NON_PERSISTENT:
                return 1;
            case PERSISTENT:
                return 2;
            default:
                return -1;
            }
        }

    四、总结

    以上就是关于在RabbitMQ中如何实现消息和队列的持久化,虽然不能说百分之百保证消息不会丢失,但是能够保证绝大部分不会丢失。在实际项目中,通常需要对消息进行持久化,因为不可能保证服务器永远不会出现down机情况。以上只是笔者学习的一些总结,希望能够对大家有所帮助,欢迎大家进行补充,一起学习。

    展开全文
  • JPA注解持久化

    千次阅读 2014-05-19 16:34:49
    JPA注解持久化类很方便,需要jar包:ejb3-persistence.jar。我用以下三个类来说明用法。  sh原创 转载请注明:http://67566894.iteye.com/blog/659829  Java代码  @SuppressWarnings("serial")  @...
  • rabbitmq代码,包含了消息队列的5中方式,topic 等模式,还有保持消息持久化的解决方法(交换机 队列 消息同时持久化),欢迎下载参与讨论,如果有什么疑问或者问题,请@我。
  • MyBatis实体字段的属性注解

    千次阅读 2019-09-26 11:42:18
    mybatis做持久化时,表的字段与数据实体属性理论是上一致的.而在一些特殊情况下,也需要在实体中加一些字段的属性, 添加之后,却提示表中没有该字段 , 我在之前使用的时候 ,一直用的是@transient这个注解 ,我查了...
  • Hibernate有两种方法来写映射文件,当运行Hibernate程序时,会先访问hibernate.cfg.xml配置文件读取配置文件中的信息连接数据库...通过注解持久化类 @Entity //告诉hibernate这是一个持久化类 @Table(name="表名
  • entityBean中使用非持久化变量

    千次阅读 2014-03-21 07:45:41
    entityBean中的属性一般都要持久化到数据库,但程序有时候从entityBean获取的数据不需要持久化到数据库,这时用 注解@Transient。 所处理的数据不需要在entityBean中声明属性,只需要get()方法,再将@Transient加...
  • redisd的非持久化配置

    2018-04-23 16:44:00
    如何关闭redis持久化?我的需求是只把redis当作缓存来用,...1.注释掉原来的持久化规则 #save 900 1#save 300 10#save 60 10000 2.设置为空 save "" 然后重启redis服务即可。 测试: 1.设置值 [root@loca...
  • 如果要发送非持久化的消息,请按照以下配置即可: 对于发送非持久化消息需要配置explicitQosEnabled该属性为true,否则spring内部发送消息时将采用默认配置进行发送消息, 而spring内部默认为持久化发送,...
  • 很轻量的一个数据库持久层工具,提供了详细的注释 insert select 分页 排序等
  • Quartz定时框架的持久化

    千次阅读 2018-09-17 21:13:06
    小强的上一篇quartz文章简单的说了一下quartz的怎样使用,一般在实际工作中那个根本是不够的,所以今天在这记录下Quartz定时框架的持久化, 一、quartz的存储于持久化介绍 Quartz框架有两种任务存储方式。一种...
  • 这篇博客就是主要解决每次项目启动都要重新在sentinel控制台添加配置文件的问题,也就是要实现sentinel持久化。我们把这个规则配置放到nacos上,然后项目再冲nacos上读取,这样,就实现了sentinel的配置规则持久化了...
  • 介绍的sentinel可以定义很多的规则,但这些规则都是存在内存中的,下次重启服务,规则就消失了,这肯定是不能在生产环境中使用的,所以我们需要对规则进行持久化。 还没开始,就已经结束。。。翻了很多资料,发现好像...
  • Redis常用配置及持久化redis.conf持久化方式1.RDB(redis默认持久化方式)2.AOF持久化3.RDB、AOF对比4.混合持久化 redis.conf 1)注释掉 #bind 127.0.0.1 2)Redis默认不是以守护进程的方式运行,可以通过该配置项...
  • Redis持久化之快照(RDB)

    千次阅读 2019-02-13 10:42:03
    本文主要介绍下redis持久化方式中的快照持久化 Redis教程10(事务) Redis教程09(发布和订阅) Redis持久化 所谓的持久化就是保持我们的数据不丢失,将数据通常保存在我们的硬盘中。在Redis中持久化的方式有...
  • 持久化对象-注解方式

    2018-04-12 14:16:44
    持久化(persistent)对象简单来说就是把领域模型对象存储到数据库中,这个过程称之为持久化。现今大行其道的ORM框架——Hibernate,JPA(Java Persisitence API)简化了使用JDBC书写SQL语句于数据库进行交互的方法...
  • Redis持久化及过期删除策略

    千次阅读 2019-05-30 13:59:32
    一、Redis 持久化之RDB和AOF 1.1 RDB 详解 RDB 是 Redis 默认的持久化方案。在指定的时间间隔内,执行指定次数的写操作,则会将内存中的数据写入到磁盘中。即在指定目录下生成一个dump.rdb文件。Redis 重启会通过...
  • Ehcache3.4 数据的持久化操作

    千次阅读 2018-01-31 19:04:34
    配置文件持久化 配置文件持久化 添加ehcachexml配置文件 添加测试代码 为什么要进行数据持久化操作   我们知道,Ehcache中的数据是以键值对的形式存储在内存中的,由于内存比硬盘读写速度快很多,...
  • 持久化DDD聚合

    千次阅读 2018-12-10 08:08:00
    来源:SpringForAll社区1. 概述在本教程中,我们将探索使用不同技术持久化DDD 聚合的可能性。2.聚合的简介聚合是一组始终需要保持一致的业务对象。因此,我们在...
  • 资源名称:Pro JPA2中文版:精通Java持久化API内容简介:本书上一版的目标之一是尽可能地简单明了,但是不短缺。我们尽力调整了它的大小,从而只描述我们感觉值得讲述的内容,但是依然确保适合在您的行李中携带本书...
  • 二、amq数据库持久化 1、在mysql中创建对应的数据库 例如:amq数据库 2、下载 mysql-connector-java-5.1.49.jar(下载地址https://dev.mysql.com/downloads/connector/j/5.1.html) 运行amq容器带文件夹 docker..
  • Java 数据持久化系列之JDBC

    千次阅读 多人点赞 2019-11-26 20:39:56
    前段时间小冰在工作中遇到了一系列关于数据持久化的问题,在排查问题时发现自己对 Java 后端的数据持久化框架的原理都不太了解,只有不断试错,因此走了很多弯路。于是下定决心,集中精力学习了持久化相关框架的原理...
  • Mybatis实现数据持久化的三种方式

    千次阅读 2019-01-01 17:09:51
    Mybatis实现数据持久化有三种方式,下面一一道来: 1.单纯的基于xml方式: 这种方式实现实现数据持久化有7个步骤: 1) 使用idea创建maven工程: 2) 在pom.xml文件中加入三个依赖:Mybatis自己的jar包,mysql数据库...
  • Redis关闭持久化

    2021-04-23 16:16:30
    具体操作方式 将 conf 文件中的 save 参数设置为 "" // 将 save 设置为 "",将之前的...持久化说明 开启服务 redis 服务 redis-server.exe redis.windows.conf 如上图,当我们开启了 redis 服务之后,按住 ctr
  • 了解了@SentinelResource 注解的使用,本文来了解 Sentinel 中已经配置好的流控、降级等规则的持久化问题。 Sentinel 监控数据持久化问题   在 Sentinel 中,我们会为多个服务进行 流控、限流、热点 等规则 的配置...
  • ActiveMQ JDBC持久化

    千次阅读 2019-03-14 16:45:26
    ActiveMQ可以将数据持久化到数据库中,用于容灾备份恢复,可以使用任意的数据库。 1、找到activemq.xml文件 2、在文件中添加数据库的bean &lt;bean id="activemq-mysql" class="org.apache....
  • RabbitMQ的持久化主要体现在三个方面,即交换机持久化,队列持久化及消息持久化 注意,因公司使用php-amqplib来实现RabbitMQ,故之后举例说明的代码均使用的php-amqplib,而php的amqp扩展 1、交换机持久化 ...
  • 持久化注解

    2012-05-26 15:33:00
    JEE5中持久化注解类型Javax Persistence Annotation Type JEE5中持久化注解类型Javax Persistence Annotation Type @Column:将属性标记为数据库内的一个列,可含有列名,不管它是否唯一且是否可为空 @...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 134,776
精华内容 53,910
关键字:

非持久化注解