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

2022-10-26  本文已影响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);

@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

日志:切面

日志:切面 /**

    /**
     * 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);
        }
    }
}

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就是下标。

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

上一篇 下一篇

猜你喜欢

热点阅读