优秀的编程知识分享平台

网站首页 > 技术文章 正文

写了一个功能让两个ai帮我写专利申请,看看对比

nanyue 2024-09-01 20:39:02 技术文章 6 ℃

给文心一言和通义千问提的问题都是一样的

背景:spring提供了TransactionSynchronizationManager类用于注册事务完成后回调任务,但它不支持回调任务里面再注册回调任务。但有时编程会有这种需求:例如添加设备,要等设备添加的事务提交后,再发起设备名称修改任务,在名称修改成功后,再发消息通知app设备添加成功。 我花了半天时间写了一个函数,用于解决这个问题。方法是不直接使用TransactionSynchronizationManager类注册回调任务,而是自己管理回调任务列表,同时使用TransactionSynchronizationManager类注册一个回调任务列表执行的逻辑。 这里面会碰上几个问题:1 怎么保证TransactionSynchronizationManager任务不会重复注册 2 怎么保证回调任务列表及时清理 3 在处理回调任务过程中,回调任务列表被修改,怎么处理。 上面这段是申请专利的背景,怎么写得通俗易懂,让不会java编程的专利审核员也能看懂它的原理和价值

这是文心一言的回复:


专利背景描述

在数据处理过程中,经常需要执行一系列相互关联的任务,并且这些任务需要在前一个任务成功完成后才能开始。例如,在添加一个新设备到系统中时,我们可能首先需要将设备信息存储到数据库中,然后修改设备的名称,并在名称修改成功后通知相关的应用程序。

现有的技术工具,如Spring框架中的TransactionSynchronizationManager类,虽然可以在事务完成后触发某些操作,但它不支持在这些操作内部再次注册新的操作。这就像我们不能在一个已经设定好的连锁反应中再加入新的环节。

为了解决这个问题,我们提出了一种新的方法。我们不是直接使用TransactionSynchronizationManager来注册每个单独的任务,而是创建一个任务列表来管理这些需要依次执行的操作。我们只在TransactionSynchronizationManager中注册一个任务,这个任务负责检查并执行整个任务列表。

在实现这个方法时,我们解决了几个关键问题:

  1. 避免重复注册:我们设计了一种机制,确保TransactionSynchronizationManager中的任务不会被重复添加,从而避免了不必要的重复操作。
  2. 及时清理任务列表:我们的方法能够确保一旦任务列表中的所有操作都执行完毕,这个列表就会被及时清理,以释放系统资源。
  3. 处理任务列表的动态变化:即使在处理任务列表的过程中有新的任务被添加进来,我们的方法也能妥善地处理这种动态变化,确保所有任务都能按照预期的顺序和逻辑执行。

这种方法的价值在于,它提供了一个灵活且可靠的框架,用于管理和执行一系列相互依赖的任务。无论是在添加设备、修改信息还是通知应用程序等场景中,这种方法都能确保任务的有序、高效执行,从而提升了数据处理的准确性和效率。


这是通义千问的回复:

通俗易懂的解释

在企业级软件开发中,尤其是涉及到数据库操作时,确保数据的完整性和一致性非常重要。Spring框架提供了一种机制,允许程序员在完成数据库事务(如添加设备或修改设备名称)后安排特定的任务(如发送通知)。这些任务被称为“回调任务”,它们会在事务成功提交后自动执行。

然而,Spring的标准机制存在局限性:它不允许在已注册的回调任务内部再次注册新的回调任务。这意味着,如果您想实现这样的场景——添加设备后,等待设备添加事务成功,接着修改设备名称,再在名称修改成功后通知手机App——标准机制无法直接支持。

为了解决这个问题,申请人设计了一种创新的方法。这种方法绕开了直接使用Spring内置的TransactionSynchronizationManager来注册单个回调任务,转而采用自建的“回调任务列表”。具体步骤如下:

  1. 任务管理容器:创建一个专门用来存储待执行回调任务的列表。这个列表就像是一个任务队列,能够容纳多个待处理的任务。
  2. 统一调度:虽然不能直接向Spring的TransactionSynchronizationManager注册多个嵌套的回调任务,但可以注册一个特殊的“总控”任务。这个总控任务的功能是:当事务成功提交时,由它负责遍历并执行回调任务列表中的所有任务。
  3. 避免重复注册与清理机制:为了确保总控任务只被注册一次,防止资源浪费和潜在冲突,申请人设计了相应的机制来保证TransactionSynchronizationManager任务的唯一性。此外,当所有回调任务执行完毕或者事务处理出现异常时,这个自建的任务列表会被及时清理,以释放资源和避免内存泄漏。
  4. 并发安全:在处理回调任务的过程中,可能存在其他代码同时修改回调任务列表的情况。为确保数据一致性,申请人实施了适当的同步策略,使得即使在任务列表被修改时,总控任务也能正确、完整地执行已登记的所有任务,不会遗漏或错误处理。

价值阐述

该方法的价值在于:

  • 灵活性提升:打破了原有Spring事务回调机制的限制,允许程序员按照实际业务需求灵活地安排多层次、嵌套式的事务后处理任务,无需担心因框架限制而导致的编程困难。
  • 代码组织优化:将复杂的事务后处理逻辑分解为一系列独立的回调任务,使得代码结构更清晰,易于理解和维护。
  • 可靠性增强:通过确保TransactionSynchronizationManager任务不重复注册、及时清理回调任务列表以及妥善处理并发修改,提高了系统的稳定性和数据一致性,降低了因事务处理不当引发的潜在错误。
  • 适应复杂业务场景:特别适用于那些涉及多阶段数据操作和异步通知的应用场景,如电子商务订单处理、物联网设备管理等,能够确保在每个关键环节完成后准确触发后续动作,提升用户体验和系统响应速度。

综上所述,申请人提出的这种方法创新性地解决了Spring事务回调机制的局限性,显著提升了企业级应用在处理复杂事务后操作时的灵活性、可维护性和可靠性,具有重要的实用价值和广泛的适用性。



感觉还是通义千问回答条理更清晰,并且也帮我扩展了应用场景(电商)。

使用ai可以减少很多文字工作,要是我自己来写这样一篇专利文档,要花几个小时以上,写得还不如ai好。


附:实现的代码



    private static void dealCallbackNoException(String callBackName, Runnable runnable) {
        try {
            runnable.run();
        } catch (Exception e) {
            log.warn("回调[{}]执行失败", callBackName, e);
        }
    }

    private static final ThreadLocal<List<Runnable>> threadLocalCallBack = new ThreadLocal<>();

    /**
     * 登记起来,待事务结束时提交 用以代替TransactionSynchronizationManager直接注册afterCommit任务
     * 因为前者不能实现在afterCommit里面再调用afterCommit
     * @note 回调中注册的回调,会排在所有一级回调任务后面执行,不是按注册时间顺序 TODO: 后面如果有时间可以考虑优化这个顺序
     * @param runnable
     */
    public static void registerAfterCommit(Runnable runnable) {
        if (!TransactionSynchronizationManager.isSynchronizationActive()) {
            log.debug("未启动事务,直接执行");
            runnable.run();
            log.debug("执行回调结束");
            return;
        }

        List<Runnable> runnableList = threadLocalCallBack.get();
        if (runnableList != null) {
            log.debug("再次添加回调任务");
            runnableList.add(runnable);
        } else {
            //首次注册回调消息
            log.debug("首次添加回调任务");
            runnableList = new ArrayList<>(CommonConstants.INIT_SIZE);
            runnableList.add(runnable);
            threadLocalCallBack.set(runnableList);
            //注册一个回调 在事务结束时清理回调信息
            TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
                @Override
                public void afterCommit() {
                    List<Runnable> runnableList = threadLocalCallBack.get();
                    if (runnableList == null) {
                        return;
                    }

                    int runnableListBeforeCallback = runnableList.size();
                    log.debug("事务已提交,开始需要执行{}个回调", runnableList.size());
                    //注意,由于回调里面可能再添加回调任务,所以这里不能直接用for语法糖
                    //for (Runnable afterCommitRunnable : runnableList) {
                    for (int i = 0; i < runnableList.size(); i++) {
                        log.debug("执行第{}个回调", i);
                        dealCallbackNoException("", runnableList.get(i));
                    }

                    log.debug("执行回调结束");
                    if (runnableList.size() != runnableListBeforeCallback) {
                        log.error("出现了回调中注册回调的情况");
                    }

                    threadLocalCallBack.remove();
                }
            });
        }
    }

Tags:

最近发表
标签列表