Java 处理一张单据,处理花费时间挺久,有单号,不用redis怎么可以快速判断其在处理中,不需要再处理

在Java中处理长时间的任务并且需要避免重复处理同一张单据的情况下,在不使用Redis或其他外部存储服务情况下。

方法一:使用数据库表 表记录记录状态

方法二:使用文件系统 创建和删除文件记录状态

方法三:使用本地缓存

import java.util.concurrent.ConcurrentHashMap;public class OrderStatusService {private final ConcurrentHashMap<String, Boolean> processingOrders = new ConcurrentHashMap<>();public boolean isOrderBeingProcessed(String orderNumber) {return processingOrders.getOrDefault(orderNumber, false);}public void markOrderAsProcessing(String orderNumber) {processingOrders.put(orderNumber, true);}public void markOrderAsCompleted(String orderNumber) {processingOrders.remove(orderNumber);}
}

@Sl4j
public class OrderProcessor {private final OrderStatusService orderStatusService;public OrderProcessor(OrderStatusService orderStatusService) {this.orderStatusService = orderStatusService;}public void processOrder(String orderNumber) {log.info("Order " + orderNumber + " startProcess.");if (!orderStatusService.isOrderBeingProcessed(orderNumber)) {try {orderStatusService.markOrderAsProcessing(orderNumber);// 处理单据的业务逻辑handleBusinessLogic(orderNumber);orderStatusService.markOrderAsCompleted(orderNumber);} catch (Exception e) {// 处理异常情况e.printStackTrace();}}else{log.error("Order " + orderNumber + " repeat.");}}private void handleBusinessLogic(String orderNumber) {// 模拟处理逻辑try {Thread.sleep(60000); // 模拟长时间处理} catch (InterruptedException e) {e.printStackTrace();}log.info("Order " + orderNumber + " processed.");}}

模拟测试:

public static void main(String[] args) throws Exception{OrderStatusService orderStatusService=new OrderStatusService();OrderProcessor orderProcessor=new OrderProcessor(orderStatusService);
//        orderProcessor.processOrder("1111");
//        orderProcessor.processOrder("2222");
//        orderProcessor.processOrder("1111");ExecutorService executor = Executors.newFixedThreadPool(5); // 创建一个固定大小的线程池executor.submit(new TaskRunner(1,"1111",orderProcessor));Thread.sleep(200);executor.submit(new TaskRunner(2,"2222",orderProcessor));Thread.sleep(200);executor.submit(new TaskRunner(3,"1111",orderProcessor));executor.shutdown(); // 关闭线程池}static class TaskRunner implements Runnable {private final int taskId;private final String orderNumber;private final OrderProcessor orderProcessor;public TaskRunner(int taskId,String orderNumber,OrderProcessor orderProcessor) {this.taskId = taskId;this.orderNumber = orderNumber;this.orderProcessor = orderProcessor;}@Overridepublic void run() {log.info("Task " + taskId + " is running on " + Thread.currentThread().getName());orderProcessor.processOrder(orderNumber);log.info("Task " + taskId + " completed.");}}

运行结果:

   

注意事项

如果使用数据库,需要考虑并发控制和事务管理。

如果使用文件锁,需要考虑文件系统的可靠性和性能。

如果使用本地缓存,需要考虑缓存的过期时间和集群环境下的同步问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/395559.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6种常用的AR跟踪方法

增强现实 (AR) 是一项令人着迷的技术&#xff0c;可将虚拟内容与现实世界无缝集成。实现这种无缝集成的关键组件之一是跟踪。各种类型的跟踪用于确定 AR 内容在环境中的准确位置和方向。本文介绍 AR 最常见的6种跟踪方法。 NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - Y…

Centos安装Mysql

添加MySQL官方的Yum仓库 sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm安装MySQL服务器 sudo yum install mysql-community-server在安装过程中遇到了如下错误&#xff1a; 使用如下命令去解决&#xff1a; yum --enablerepomysql80…

Windows下Rust OpenCV环境配置

首发于Enaium的个人博客 安装Chocolatey 首先我们需要安装Chocolatey&#xff0c;Chocolatey是一个Windows的包管理器。 我们点击右上角的Install进入到Installing Chocolatey&#xff0c;选择Individual 复制命令 Set-ExecutionPolicy Bypass -Scope Process -Force; [Sys…

【Java日志系列】日志概述

目录 前言 一、日志概述 二、日志文件 1. 调试日志 2. 系统日志 三、日志框架 1. 日志框架的作用 2. 日志框架的价值 3. 市面上流行的日志框架 4. 日志门面和日志实现的区别 总结 前言 在软件开发中&#xff0c;日志记录是一项至关重要的任务。无论是简单的命令行应…

CloudCompare—点云切片

文章目录 一、整体功能展示1、必要参数2、其他选项二、代码实现1、提取平面上的包络线2、将点投影到二维平面上3、提取二维凸包三、算法原理参考资料一、整体功能展示 整个点云切片的步骤如下动图所示: 激活点云后,选择切片功能(小立方盒),在点云视图中显示工具栏框,工具…

后期调色学习笔记

关于调色曲线的学习&#xff1a; 学习链接&#xff1a;一看就懂的曲线调色教程【手机摄影后期】_哔哩哔哩_bilibili 从左向右就是由暗部越来越到亮部 越靠近右侧的越是亮部

C++ | Leetcode C++题解之第324题摆动排序II

题目&#xff1a; 题解&#xff1a; class Solution { public:int partitionAroundPivot(int left, int right, int pivot, vector<int> &nums) {int pivotValue nums[pivot];int newPivot left;swap(nums[pivot], nums[right]);for (int i left; i < right; …

04 Haproxy搭建Web集群

4.1 案例分析 4.1.1 案例概述 Haproxy是目前比较流行的一种群集调度工具&#xff0c;同类群集调度工具有很多&#xff0c;如LVS和Nginx。相比较而言&#xff0c;LVS 性能最好&#xff0c;但是搭建相对复杂;Nginx 的upstream模块支持群集功能&#xff0c;但是对群集节点健康检…

html+css 实现hover 3D按钮特效

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽效果&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目…

C语言实现游戏2048(超详细!!!超易懂!!!)

2048是众所周知的一款经典游戏&#xff0c;在曾经没有智能电脑和手机的年代&#xff0c;也陪伴了我们许多年。那今天就让我们用C语言来回顾一下这款游戏吧~ 一、游戏2048的思路 2048游戏的玩法是在初始的时候&#xff0c;给玩家一个4*4格子的&#xff0c;其中内容全为空的棋盘…

elementPlus中el-table的每列两行溢出隐藏怎么设置

el-table的每列两行溢出隐藏怎么设置 elementPlus中的el-table如何设置多行溢出隐藏table中的table属性中有show-overflow-tooltip属性&#xff0c;但是只支持单行溢出隐藏如何改成两行呢&#xff1f;在审查元素中我们发现.el-tooltip这个类名是溢出隐藏的样式&#xff0c;原本…

【Linux---08】Shell脚本

文章目录 1. 前置说明1.1 创建shell脚本1.2 执行shell脚本1.3 调试shell脚本1.4 字符冲突 2. 变量2.1 创建&使用变量2.2 位置变量2.3 引号规则 3. 数组3.1 创建数组3.2 使用数组 4. 运算符4.1 比较&数值运算4.1.1 方式一&#xff1a;[ ]4.1.3 方式二&#xff1a;(()) &…

【MongoDB】1.MongoDB下载与安装

目录 一、下载 二、安装 三、安装MongoDB Compass 四、连接 一、下载 官网地址&#xff1a; https://www.mongodb.com/download-center/community 二、安装 详细的安装教程可参考&#xff1a; MongoDB安装&#xff08;超详细&#xff09;_安装mongodb-CSDN博客 注意事项1&…

赛盈分销亮相AI科技大会暨亚马逊新增长大会,与企业共话跨境品牌发展新机遇!

八月开端&#xff0c;由知无不言与xmars和钱老师课堂联合主办的2024年AI科技大会暨亚马逊新增长大会在深圳宝安顺利开展&#xff0c;为期2天的跨境峰会吸引了上千位优秀的卖家朋友前来感受一场盛夏大狂欢。在本次跨境峰会里&#xff0c;邀请了多位不同领域的先锋人物&#xff0…

Android 文件上传与下载

在实际开发涉及文件上传不会自己写上传代码&#xff0c;一般 会集成第三网络库来做图片上传&#xff0c;比如android-async-http&#xff0c;okhttp等&#xff0c;另外还有七牛也提供 了下载和上传的API。 1.项目用到的图片上传的关键方法&#xff1a; 这里用到一个第三方的库…

新华三H3CNE网络工程师认证—路由基础

我们的一个个网络其实是由不同的广播域构成的&#xff0c;而路由器的作用就是用来连接不同的广播域。那么不同广播域之间是如何通信的呢&#xff1f;比如有三个网段&#xff0c;1.0、2.0和3.0。网段1.0和网段2.0通信需要构造数据包&#xff0c;源是1.1&#xff0c;目标去往2.1。…

Java程序的执行过程:从编译到垃圾回收,一文读懂Java程序的生命周期

你是否曾经好奇过当你编写一段Java代码并运行它时&#xff0c;背后究竟发生了什么&#xff1f;Java程序的执行过程似乎神秘而复杂&#xff0c;但实际上&#xff0c;它遵循着一系列精心设计的步骤。本文将为你揭开Java程序执行的神秘面纱&#xff0c;带你深入了解从源代码到最终…

SpringBoot企业人事管理系统-附源码与配套论文

1.1引言 随着计算机技术的飞速发展&#xff0c;计算机在各种单位机构管理中应用的普及﹐管理信息系统的开发在强调管理、强调信息的现代社会中也显得越来越重要。因此,利用计算机高效率地完成人事管理的日常事务&#xff0c;是适应现代各种单位机构制度要求、推动各种单位机构…

SpringBoot统一功能处理——拦截器

目录 一、什么是拦截器&#xff1f; 二、拦截器使用 2.1 定义拦截器 2.2 注册配置拦截器 三、拦截器详解 3.1 拦截器的拦截路径配置 3.2 拦截器执行流程 一、什么是拦截器&#xff1f; 拦截器是Spring框架提供的核心功能之一, 主要用来拦截用户的请求, 在指定方法前后,…

【2024年精选】分享7款国内大学ai写论文推荐网站工具

在2024年&#xff0c;AI技术的飞速发展为学术研究和论文写作带来了革命性的变化。众多AI论文写作工具应运而生&#xff0c;帮助学生和研究人员提高写作效率&#xff0c;提升论文质量。其中&#xff0c;AIPaperPass作为一款备受瞩目的国内AI写论文推荐网站工具&#xff0c;以其独…