美文网首页
猿创征文 第二季| #「笔耕不辍」--生命不息,写作不止#

猿创征文 第二季| #「笔耕不辍」--生命不息,写作不止#

作者: 学习微站 | 来源:发表于2022-10-26 13:38 被阅读0次

    idea机器扛不住的可以这么设置一下(启动慢

    mybatis-plus批量更新

    1.service方式
    UpdateWrapper updateWrapper = new UpdateWrapper<>();
    updateWrapper.lambda()
    .in(字段名, ids);
    val xxxteEntity = new xxxteEntity();
    xxxteEntity.set字段名(字段值);
    //xxxteEntity 修改后的实体
    int num= xxxMapper.update(xxxteEntity,updateWrapper); 2.mapper方式

    UpdateWrapper updateWrapper = new UpdateWrapper<>();
    updateWrapper.lambda()
    .in(xxxEntity::getId, ids); .set(xxxEntity::字段名,修改的值);

        boolean res= xxService.update(updateWrapper);
    
    • 1

    @SuppressWarnings(“PMD“) //CHECKSTYLE:OFF

    过滤发包校验

    feign调用

    feign调用
    @Component
    public class CollectionShopCompareFallbackFactory implements FallbackFactory<ICollectionShopCompareRemoteService> {
    
        @Override
        public ICollectionShopCompareRemoteService create(Throwable throwable) {
            return null;
        }
    }
    
    
    
    
    @FeignClient(contextId = "collectionShopCompareRemoteService", name = "saas-collect-server",
            url = "${feign.server.collect-url}", fallbackFactory = CollectionTemplateServiceFallbackFactory.class)
    public interface ICollectionShopCompareRemoteService {
        
    }
    
    
        collect-url: http://localhost:31514
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    日志:切面

    日志:切面 /**

    • @description: 系統操作日志切面,用户对系统操作进行记录
      **/
      @Slf4j
      //作用是把当前类标识为一个切面供容器读取
      @Aspect
      @Component public class SysOperatorLogAspect extends CommonController {

      @Resource
      private ISysOperatorLogRemoteService sysOperatorLogService;
      @Resource
      private EncodeDecodeService encodeDecodeService;
      @Resource private Environment environment;

        /**
         * Advice(通知、切面): 某个连接点所采用的处理逻辑,也就是向连接点注入的代码, AOP在特定的切入点上执行的增强处理。
         * @Before: 标识一个前置增强方法,相当于BeforeAdvice的功能.
         * @After: final增强,不管是抛出异常或者正常退出都会执行.
         * @AfterReturning: 后置增强,似于AfterReturningAdvice, 方法正常退出时执行.
         * @AfterThrowing: 异常抛出增强,相当于ThrowsAdvice.
         * @Around: 环绕增强,相当于MethodInterceptor.
         * JointPoint(连接点):程序运行中的某个阶段点,比如方法的调用、异常的抛出等。
         * Pointcut(切入点):   JoinPoint的集合,是程序中需要注入Advice的位置的集合,指明Advice要在什么样的条件下才能被触发,在程序中主要体现为书写切入点表达式。
         * Advisor(增强): 是PointCut和Advice的综合体,完整描述了一个advice将会在pointcut所定义的位置被触发。
         * @Aspect(切面): 通常是一个类的注解,里面可以定义切入点和通知
         * AOP Proxy:AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类。
         */
        @Pointcut(value = "@annotation(com.shuwei.sscm.saas.admin.annotate.SysLogAnnotate)")
        public void annotateCut() {
        }
    
        //标识一个前置增强方法,相当于BeforeAdvice的功能,相似功能的还有
        @Before(value = "annotateCut()")
        public void before(JoinPoint joinPoint) {
            MethodSignature signature = (MethodSignature) joinPoint.getSignature();
            Method method = signature.getMethod();
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            SysLog sysOperatorLog = new SysLog();
            String argsStr = Arrays.toString(joinPoint.getArgs());
            if (StringUtils.isNotBlank(argsStr) && argsStr.length() > 2000) {
                argsStr = argsStr.substring(0, 2000);
            }
            // 自定义注解
            /**
             * @Target({ElementType.TYPE, ElementType.METHOD})
             * @Retention(RetentionPolicy.RUNTIME)
             * @Inherited
             * @Documented
             * public @interface SysLogAnnotate {
             *
             *     String title() default "";
             *
             *     String action() default "";
             *
             *     ClientEnum client() default ClientEnum.PC;
             *
             * }
             */
            SysLogAnnotate sysLogAnnotate = method.getAnnotation(SysLogAnnotate.class);
            HttpServletRequest request = attributes.getRequest();
            sysOperatorLog.setTitle(sysLogAnnotate.title());
            sysOperatorLog.setAction(sysLogAnnotate.action());
            sysOperatorLog.setClient(sysLogAnnotate.client().getType());
            sysOperatorLog.setRequestParam(argsStr);
            sysOperatorLog.setRequestUri(request.getRequestURI());
            sysOperatorLog.setGmtCreate(DateUtils.getNow());
            String token = request.getHeader("Authorization");
            // 用户信息
            MchUser user = getCurrentUser();
            if (null != user && StringUtils.isNotEmpty(token)) {
                sysOperatorLog.setMerchantId(user.getBelongId());
                sysOperatorLog.setUserId(user.getId());
                sysOperatorLog.setUserName(user.getName());
                String telPhone = user.getTelphone();
                String env = environment.getProperty("spring.profiles.active");
                String profile = "dev,local";
                if (StringUtils.isNotBlank(telPhone) && env != null && !profile.contains(env)) {
                    telPhone = encodeDecodeService.encodeData(telPhone);
                }
                sysOperatorLog.setUserPhone(telPhone);
            }
            log.info("sysOperatorLog:{}", sysOperatorLog);
    
            try {
                sysOperatorLogService.saveSysLog(sysOperatorLog);
            } catch (Exception e) {
                log.error(e.getMessage(), e);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76

    rocketmq关键词定义

    Broker:消息中转角色,负责存储消息,转发消息。Broker是具体提供业务的服务器,单个Broker节点与所有的NameServer节点保持长连接及心跳,并会定时将Topic信息注册到NameServer,顺带一提底层的通信和连接都是基于Netty实现的。Broker负责消息存储,以Topic为纬度支持轻量级的队列,单机可以支撑上万队列规模,支持消息推拉模型。官网上有数据显示:具有上亿级消息堆积能力,同时可严格保证消息的有序性

    Topic:主题!它是消息的第一级类型。比如一个电商系统可以分为:交易消息、物流消息等,一条消息必须有一个 Topic 。Topic与生产者和消费者的关系非常松散,一个 Topic 可以有0个、1个、多个生产者向其发送消息,一个生产者也可以同时向不同的 Topic 发送消息。一个 Topic 也可以被 0个、1个、多个消费者订阅。
    Tag:标签!可以看作子主题,它是消息的第二级类型,用于为用户提供额外的灵活性。使用标签,同一业务模块不同目的的消息就可以用相同Topic而不同的Tag来标识。比如交易消息又可以分为:交易创建消息、交易完成消息等,一条消息可以没有Tag。标签有助于保持您的代码干净和连贯,并且还可以为RabbitMQ提供的查询系统提供帮助。
    MessageQueue:一个Topic下可以设置多个消息队列,发送消息时执行该消息的Topic,RocketMQ会轮询该Topic下的所有队列将消息发出去。消息的物理管理单位。一个Topic下可以有多个Queue,Queue的引入使得消息的存储可以分布式集群化,具有了水平扩展能力。
    NameServer:类似Kafka中的ZooKeeper,但NameServer集群之间是没有通信的,相对ZK来说更加轻量。它主要负责对于源数据的管理,包括了对于Topic和路由信息的管理。每个Broker在启动的时候会到NameServer注册,Producer在发送消息前会根据Topic去NameServer获取对应Broker的路由信息,Consumer也会定时获取 Topic 的路由信息。
    Producer:生产者,支持三种方式发送消息:同步、异步和单向单向发送 :消息发出去后,可以继续发送下一条消息或执行业务代码,不等待服务器回应,且没有回调函数。异步发送 :消息发出去后,可以继续发送下一条消息或执行业务代码,不等待服务器回应,有回调函数。同步发送 :消息发出去后,等待服务器响应成功或失败,才能继续后面的操作。
    Consumer:消费者,支持 PUSH 和 PULL 两种消费模式,支持集群消费和广播消费集群消费 :该模式下一个消费者集群共同消费一个主题的多个队列,一个队列只会被一个消费者消费,如果某个消费者挂掉,分组内其它消费者会接替挂掉的消费者继续消费。广播消费 :会发给消费者组中的每一个消费者进行消费。相当于RabbitMQ的发布订阅模式。
    Group:分组,一个组可以订阅多个Topic。分为ProducerGroup,ConsumerGroup,代表某一类的生产者和消费者,一般来说同一个服务可以作为Group,同一个Group一般来说发送和消费的消息都是一样的 Offset:在RocketMQ中,所有消息队列都是持久化,长度无限的数据结构,所谓长度无限是指队列中的每个存储单元都是定长,访问其中的存储单元使用Offset来访问,Offset为Java Long类型,64位,理论上在 100年内不会溢出,所以认为是长度无限。也可以认为Message Queue是一个长度无限的数组,Offset就是下标。

    本文使用 文章同步助手 同步

    相关文章

      网友评论

          本文标题:猿创征文 第二季| #「笔耕不辍」--生命不息,写作不止#

          本文链接:https://www.haomeiwen.com/subject/qwtttdtx.html