- 博客(1120)
- 收藏
- 关注
原创 ERP 包含内容
如果需要针对某个行业(如电商、制造)或具体系统(如SAP、聚水潭)的深入分析,可以进一步探讨!:符合财务、税务、行业监管要求(如GDPR、GSP)。:是否支持与现有系统(CRM、WMS、支付系统)对接。:客户管理、销售订单(SO)、价格策略、发货管理。:总账、应收/应付账款、固定资产管理、税务管理。:供应商管理、采购订单(PO)、比价、合同管理。:BOM(物料清单)管理、生产计划、工单管理。:人事档案、考勤、薪资计算(Payroll)。:生产排程、设备管理、质量管理(QC)。
2025-08-19 10:25:05
700
原创 奇门 聚水潭 聚石塔 作用,关系
通过标准化接口(API)打通品牌商、经销商、物流服务商等各方的系统(如ERP、WMS、TMS等),实现供应链全链路协同。:为ISV(独立软件开发商,如ERP服务商)提供阿里云服务器资源,确保商家数据符合阿里生态规则(如订单隐私保护)。是三个不同的系统或平台,分别由不同公司推出,功能定位和适用场景也有所差异。:帮助商家在阿里生态(天猫、淘宝、零售通等)内实现库存共享、订单自动流转。ERP服务商(如聚水潭、旺店通)需接入天猫/淘宝时,必须部署在聚石塔上。:统一处理淘宝、京东、拼多多、抖音等平台的订单。
2025-08-19 10:23:31
362
原创 内部调用 - AopContext.currentProxy()
throw new ServiceException(StringUtils.format("该来源订单号已存在:{}", param.getSourceOrderCode()));System.out.println("AOP代理暴露已启用,当前代理: " + proxy.getClass().getName());log.debug("当前AOP代理对象: {}", currentProxy.getClass().getName());// 直接调用,分布式锁失效。// 直接调用,事务失效。
2025-08-11 10:01:26
796
原创 xxl-job轮询+单机串行会导致重复执行吗
答:你提出了一个非常关键的问题。让我详细分析一下这种情况:## 轮询+单机串行下的任务执行分析### 1. 任务重复执行的可能性**结论:不会重复执行相同的数据**### 2. 具体执行流程分析```时间线:T1: 任务A开始执行 -> refreshSyncTask获取任务[1,2,3,4,5]T2: 任务A处理中,状态更新为PROCESSINGT3: 调度时间到,任务B开始调度T4: 任务B执行refreshSyncTask重新查询数据库。
2025-08-08 16:43:04
869
原创 请列举xxl-job多实例部署导致任务被重复执行原因,及解决方案
appname: order-sync-executor // 错误地使用了相同的执行器名称。appname: order-sync-executor // 应用A的执行器名称。appname: order-sync-executor // 专门处理订单同步。执行器地址: http://order-executor/ // 服务名而非负载均衡地址。执行器地址: http://xxl-job-executors/ // 负载均衡地址。// 正确做法1: 调度中心直接配置各节点地址。
2025-08-08 16:24:50
821
原创 XXL-JOB多实例
多个XXL-JOB实例同时执行 多实例指部署多个xxl-job是吗,多个实例都会存在任务被重复执行的情况吗,如何避免。你提出了一个很好的问题。应用节点A: 192.168.1.10:8080 (运行cloud-order应用)应用节点B: 192.168.1.11:8080 (运行cloud-order应用)3. **正常情况下不会重复执行**:路由策略确保每次只有一个节点执行任务。1. **多实例部署**:指的是同一应用部署在多个服务器节点上。2. **路由策略**:决定了调度中心选择哪个节点执行任务。
2025-08-08 16:10:33
442
原创 XXL-JOB执行器 与 部署的应用服务器
调度中心 (http://192.168.1.100:8080/xxl-job-admin)├── 192.168.1.11:8080 (应用服务器B + XXL-JOB执行器)├── 192.168.1.10:8080 (应用服务器A + XXL-JOB执行器)└── 192.168.1.12:8080 (应用服务器C + XXL-JOB执行器)调度中心 (192.168.1.100:8080/xxl-job-admin)2. **逻辑上**:是集成了XXL-JOB客户端组件的应用进程。
2025-08-08 16:08:01
409
原创 用户微信公众号的openid 始终固定的吗
OpenID 在同一个公众号下是固定的,适合用于识别用户。如果需要跨公众号识别用户(如多个小程序、公众号互通),建议使用UnionID(需绑定开放平台)。如果有更复杂的需求(如用户账号体系打通),建议结合 UnionID 和业务数据库存储关联信息。
2025-08-08 08:58:53
259
原创 xxl-job配置相同,执行顺序
两个任务,同一个执行执行器,相同时间,路由策略第一个,阻塞策略,单机串行,先执行哪个,按任务ID排序吗,先创建的任务先执行。
2025-08-05 19:51:34
443
原创 类内部方法调用,自注入避免AOP失效
/ 问题:可能注入原始对象而非代理对象。5. **设计模式标准**:这是Spring框架推荐的处理同类调用AOP失效的标准解决方案。// 原始Bean: AbstractSyncTaskHandler (实际业务逻辑)2. **确保代理对象**:保证获得的是包含AOP增强的代理对象而非原始对象。// 如: SalesCreateSyncTaskHandler的代理对象。// AbstractSyncTaskHandler是抽象类。// 代理Bean: Proxy (包含AOP增强逻辑)
2025-08-05 18:54:24
936
原创 两个任务同一个调用时间 CRON:0 0 3 * * ?,具体如何调度的,及任务如何执行的
xxLjob两个任务 pullGuanjiaSalesJob,不同的执行参数,配置了同一个 @XxlJob("pullGuanjiaSalesJob")两个任务同一个调用时间 CRON:0 0 3 * *?,具体如何调度的,及任务如何执行的。(串行执行),调度中心会按任务ID顺序依次触发(前一个任务执行完成后,再触发下一个)。:相同 CRON 的任务会同时触发,但执行顺序受阻塞策略控制。会定期扫描任务表(默认每秒一次),检查到达触发时间的任务。执行器接收到任务后,会提交到内置的线程池(默认核心线程数为。
2025-08-05 18:38:12
898
原创 xxLjob两个任务 pullGuanjiaSalesJob,不同的执行参数,配置了同一个 @XxlJob(“pullGuanjiaSalesJob“),为什么可以这样配置,执行原理是什么
/ 参数解析(例如 param="type=daily")下面详细解释为什么可以这样配置,以及它的执行逻辑。中,多个任务(即使参数不同)可以配置为同一个。)接收到任务请求后,会根据参数执行不同的逻辑。,可以在调度中心灵活调整参数,而无需修改代码。不同,调度中心仍然会将其视为不同的任务。找到对应的执行器方法,并传递不同的参数。,可能会并发执行,需考虑加锁或幂等性处理。,是 XXL-JOB 的一个强大特性。方法内部根据参数执行不同的逻辑。,不需要为每个任务写单独的方法。:适合参数化任务,避免重复代码。
2025-08-05 18:34:08
894
原创 为什么不用rocketmq直接发送,用StreamBridge
是 Spring Cloud Stream 的抽象接口,底层可动态切换 Binder(RocketMQ/Kafka/RabbitMQ),// 需手动处理序列化。适用于大多数场景,尤其是需要维护多环境(如开发用 Kafka,生产用 RocketMQ)或未来可能切换消息中间件的项目。:RocketMQ 需提前配置 Producer Group 和 Topic,动态发送新 Topic 需代码或配置调整。会将代码与 RocketMQ 强绑定,切换消息中间件(如改用 Kafka)需修改大量代码。
2025-08-05 17:24:10
542
原创 StreamBridge 发送MQ消息
是 Spring Cloud Stream 提供的一个工具类,用于动态发送消息到绑定目标(如 Kafka、RabbitMQ 等消息中间件)。,你可以灵活集成 O2O 业务中的消息通知(如订单状态更新、优惠券发放等),而无需强依赖固定的绑定配置。的作用是向指定的消息通道(topic/exchange)发送消息。:要发送的消息体,可以是任意对象(Spring 会自动序列化,如 JSON)。-- 具体 binder(如 Kafka/RabbitMQ) -->// 重试或补偿逻辑。:目标消息通道的名称(如。
2025-08-05 17:23:35
536
原创 Doris json_contains 查询报错
根据错误信息,Doris数据库的JSON_CONTAINS函数签名不匹配。Doris要求第二个参数也是JSON格式,而不是字符串。需要对代码进行改造以兼容Doris的JSON函数语法。
2025-08-03 15:41:58
156
原创 Execute如果没有自定义异常处理器,异常可能仅打印而未被业务逻辑处理。不是会抛出异常吗,业务层try catch不行吗
/ Exception in thread "pool-1-thread-1" java.lang.RuntimeException: 任务内部异常。System.out.println("捕获到异常: " + e.getCause());// 实际业务异常在这里!log.error("线程 {} 抛出异常: {}", thread.getName(), e);System.err.println("业务捕获异常: " + e);System.out.println("业务捕获异常: " + e);
2025-07-22 17:30:45
955
原创 线程池excutor 和 submit区别 关于异常处理,请详细说明,会吞掉异常吗,需要捕获吗
/ 抛出 ExecutionException,原因是被包装的原始异常。:异常会向上传播,但如果没有自定义异常处理器,可能仅打印日志而未被业务代码捕获。:如果任务中抛出未捕获的异常,会直接终止当前线程,并通过线程池的。:如果没有自定义异常处理器,异常可能仅打印而未被业务逻辑处理。// 不调用 future.get(),异常被“吞掉”异常直接导致线程终止,但线程池会创建新线程替代。自定义处理逻辑,否则异常可能被忽略(仅打印)。:异常直接抛出,但需自定义处理器避免丢失。,异常不会主动抛出,看似被“吞掉”。
2025-07-22 17:28:15
520
原创 线程池excutor 和 submit区别
在 Java 线程池中,execute()和submit()是提交任务的两种主要方法,它们在使用方式、返回值、异常处理等方面有显著区别。RunnableCallableFutureget()execute()javaRunnable,无返回值。任务异常会抛出到线程池的未捕获异常处理器(默认打印堆栈)。// 对 Runnable 的封装// 支持 Callable// 指定返回结果RunnableCallable。
2025-07-22 17:27:30
955
原创 线程池默认拒绝策略,有什么影响,会影响后续任务执行吗
如果调用方未捕获异常,任务会直接丢弃,可能导致业务逻辑不完整(例如提交的订单处理任务被拒绝)。例如:任务被拒绝时,转存到 Kafka/RocketMQ 异步重试。生产环境建议根据业务场景选择合适的拒绝策略,并配套监控和降级方案。// 处理策略:记录日志、降级、存入重试队列等。或自定义策略(如将任务存入数据库/队列后续重试)。已在线程池队列中的任务会继续执行,拒绝策略仅作用于。),但可能表明资源不足(需调整参数或优化任务)。是否影响后续任务取决于调用方的异常处理逻辑。(直接移交,避免排队)。
2025-07-22 10:33:05
884
原创 Redis Copy-on-Write机制:
Copy-on-Write机制: 父子进程共享内存页 当父进程修改数据时,内核会复制被修改的页 这可能导致内存使用量暂时增加 通俗的话描述一下可以用一个生活中的例子来通俗解释。
2025-07-22 09:03:50
319
原创 Redis RDB 持久化实现原理,请求是否阻塞,如何处理阻塞请求
Redis RDB (Redis Database) 持久化是通过生成数据快照来实现的,将内存中的数据以二进制格式保存到磁盘上的一个紧凑文件中。
2025-07-22 09:02:53
841
原创 CAS使用自适应自旋 如何实现的
自适应自旋是一种优化CAS性能的技术,它根据历史成功率动态调整自旋次数,在减少CPU空转和提高并发性能之间找到平衡。
2025-07-22 08:49:02
656
原创 CAS缺点
/ 仍然能成功,但中间状态已变化。CAS是一种强大的并发工具,但需要根据具体场景权衡使用,理解其局限性才能发挥最大价值。CAS检查时会认为"没有变化",但实际上已经发生了修改。注意ABA问题,必要时使用带版本的CAS。在高竞争环境下,CAS可能会长时间自旋。退化为锁机制(如JVM的锁升级策略)// 测试CAS vs 同步锁的性能。:锁性能可能优于CAS(避免自旋)低优先级线程持有CAS需要的资源。
2025-07-22 08:48:05
703
原创 Redisson解锁脚本分析
检查锁持有权→ 如果不是当前线程持有 → 返回 nil(解锁失败)是当前线程持有→ 减少重入计数 →如果计数仍>0 → 更新过期时间 → 返回 0(部分解锁)如果计数=0 → 删除锁 → 发布解锁消息 → 返回 1(完全解锁)验证持有权通过计数减1 →删除my_lockkey发布解锁消息返回 1(完全解锁)
2025-07-22 08:36:25
900
原创 Redisson加锁脚本分析
锁不存在→ 初始化锁(设置持有者为当前线程,计数=1)→ 设置过期时间 → 获取成功锁已存在且由当前线程持有→ 增加重入计数 → 更新过期时间 → 获取成功锁被其他线程持有→ 返回锁的剩余生存时间 → 获取失败。
2025-07-22 08:33:55
604
原创 Redisson 加锁解锁原理 实现源码
原子性操作:使用 Lua 脚本保证加锁/解锁操作的原子性可重入支持:通过 Hash 结构记录锁的持有线程和重入次数自动续期:看门狗机制防止业务未完成时锁过期公平锁支持:通过 Redis 的队列实现公平获取锁锁等待机制:通过 Redis 的发布订阅实现锁释放通知。
2025-07-22 08:30:22
519
原创 ThreadLocal 既然是线程级别,为什么线程结束,还会导致内存泄漏
ThreadLocal 虽然是线程级别的变量存储,但仍然可能导致内存泄漏,原因在于 ThreadLocal 的实现机制和引用关系。
2025-07-21 11:08:36
507
原创 ES 更新或新增
只做更新吗,不存在会新增吗您的问题涉及到 Elasticsearch 的更新操作逻辑。在您提供的代码中,这个设置非常关键,它决定了当文档不存在时的行为。
2025-07-21 09:34:06
913
原创 String s1 = “hello“; // 方式1:字面量赋值String s2 = new String(“hello“); // 方式2:new关键字创建 s1 s2都是引用,不都
您的问题涉及一个常见的误解。实际上,String s1和String s2这两个引用本身的存储位置与它们指向的对象是否在字符串常量池中是两个不同的概念。
2025-07-20 12:55:29
438
原创 String s1 = “hello“; 存在字符串对象吗,引用和对象都是存在字符串常量池中吗
会:在堆中创建String对象(如果第一次出现)在字符串常量池中存储对该对象的引用将引用赋值给变量s1不存在"对象存储在字符串常量池中"的情况字符串常量池本质是HashTable,只存储引用实际对象始终在堆内存中这种设计使得:相同的字符串字面量可以共享同一个对象字符串常量可以被垃圾回收(Java 7+)
2025-07-20 12:48:30
400
原创 运行时常量池 和 字符串常量池 区别
特性运行时常量池字符串常量池存储内容类文件常量池表所有内容仅字符串引用实现结构类文件结构的运行时表示哈希表Java 7+位置元空间堆操作方式类加载时自动填充可通过intern()方法操作垃圾回收随类卸载清除受GC管理主要用途支持类加载、解析、动态链接等JVM操作优化字符串存储,减少重复创建理解这两个常量池的区别对于掌握以下内容很重要:类加载机制字符串内存优化内存泄漏分析性能调优。
2025-07-20 12:18:11
454
原创 jvm内存区域哪些是线程共享的
public static String classVar = "共享";// 静态变量存放在方法区。// 存放在堆中,所有线程可见。在HotSpot VM中也称为"永久代"(PermGen)或"元空间"(Metaspace)// 局部变量存放在栈帧的局部变量表中。String s = "常量池字符串";// 字符串常量存放在运行时常量池。// 线程安全,因为在线程栈中。存储栈帧(局部变量表、操作数栈、动态链接、方法出口等)│ ├── 方法区(Method Area)│ ├── 堆(Heap)
2025-07-20 12:17:04
916
原创 feignClient 调用详细流程
FeignClient 是 Spring Cloud 提供的一个声明式 REST 客户端,它简化了 HTTP API 的调用过程。下面是 FeignClient 调用的详细流程:在启动类上添加 注解,Spring 会扫描所有带有 注解的接口。java@SpringBootApplication@EnableFeignClientspublic class Application { public static void main(String[] args) { Sprin
2025-07-20 11:38:53
683
原创 Rabbitmq Direct Exchange(直连交换机)可以保证消费不被重复消费吗,可以多个消费者,但是需要保证同一个消息,不会被投递给多个消费者
是保证消息只被一个消费者消费的关键,而不是 Exchange 类型。正确绑定队列和消费者,配合业务幂等或锁机制,即可避免重复消费。redis.set(f"processed:{order_id}", "1", ex=3600) # 标记已处理。if redis.set(lock_key, "1", nx=True, ex=10): # 尝试加锁。routing_key="single_queue", # 直连队列(不经过 Exchange),它只影响消息进入哪个队列,不影响队列内消息的分发方式。
2025-07-17 18:28:33
705
原创 Rabbitmq Direct Exchange(直连交换机)多个消费者,配置相同的key ,队列,可以保证只有一个消费者消费吗
arguments={"x-single-active-consumer": True} # 启用单活跃消费者。if redis.set(lock_key, "1", nx=True, ex=60): # 加锁。在 RabbitMQ 中,如果多个消费者(Consumers)同时订阅。可以保证消费不被重复消费,因为通过轮询一个消息只会投递给一个消费者。如果该消费者断开,RabbitMQ 会自动切换到下一个消费者。收到消息1、消息3、消息5...收到消息2、消息4、消息6...将消息分发给不同的消费者,
2025-07-17 18:26:42
893
原创 Rabbitmq direct 模式与 finout区别
Producer → [Direct Exchange] → 匹配 routing_key → 目标队列。exchange="fanout_logs" # 无 routing_key。exchange="fanout_logs" # 无 routing_key。# 队列绑定到 fanout exchange(无需 routing_key)# 队列绑定到 direct exchange,指定 routing_key。例如:用户注册成功后,同时通知邮件服务、短信服务、数据分析服务。
2025-07-17 18:14:24
381
原创 Rabbitmq 多个消费者,怎么保证只有一个消费者消费
在 RabbitMQ 中,如果有多个消费者(Consumers)订阅同一个队列(Queue),默认情况下,消息会以。消费者从 RabbitMQ 获取消息后,先检查 Redis / DB 是否已存在该消息的锁。:消费者处理前先获取分布式锁,确保同一时间只有一个消费者能处理。如果该消费者断开,RabbitMQ 会自动切换到下一个消费者。模式,同一队列同一时间只有一个消费者能接收消息。:让相同特征的消息始终由同一个消费者处理。可扩展多个消费者,但相同分组消息仍串行。仍然只有一个消费者能处理消息,无法并行。
2025-07-17 18:13:25
759
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人