当前位置: 首页 > 知识库问答 >
问题:

Spring状态机UML留在内存中

乜裕
2023-03-14

我已经使用Spring状态机一年多了,现在根据我的需求尝试了不同的实现方法,当我使用UML时,我遇到了一个严重的问题。

我使用纸莎草来绘制UML,我有许多UML存储在某个位置。我需要使用的是动态选择的。这已经做得很成功了。现在我遇到了一个严重的问题。下面是我如何调用UML的代码。

Resource resource = new FileSystemResource(stmDir+"/"+model+".uml");

        UmlStateMachineModelFactory umlBuilder = new UmlStateMachineModelFactory(resource);
        umlBuilder.setStateMachineComponentResolver(resolveActionConfig(model));
        StateMachineModelFactory<String, String> modelFactory = umlBuilder;

        Builder<String, String> builder = StateMachineBuilder.builder();
        builder.configureModel().withModel().factory(modelFactory);
        builder.configureConfiguration().withConfiguration().beanFactory(new StaticListableBeanFactory());

        stateMachine = builder.build();

您可以看到,我使用了新的UmlStateMachineModelFactory(资源);

UmlStateMachineModelFactory类有以下代码

@Override
public StateMachineModel<String, String> build() {
    Model model = null;
    try {
        model = UmlUtils.getModel(getResourceUri(resolveResource()).getPath());
    } catch (IOException e) {
        throw new IllegalArgumentException("Cannot build build model from resource " + resource + " or location " + location, e);
    }
    UmlModelParser parser = new UmlModelParser(model, this);
    DataHolder dataHolder = parser.parseModel();
    // we don't set configurationData here, so assume null
    return new DefaultStateMachineModel<String, String>(null, dataHolder.getStatesData(), dataHolder.getTransitionsData());
}

每次我创建一个UmlStateMachineModelFactory,它又创建一个UMLModelParser。

import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.uml2.uml.Activity;
import org.eclipse.uml2.uml.Constraint;
import org.eclipse.uml2.uml.Event;
import org.eclipse.uml2.uml.Model;
import org.eclipse.uml2.uml.OpaqueBehavior;
import org.eclipse.uml2.uml.OpaqueExpression;
import org.eclipse.uml2.uml.PackageableElement;
import org.eclipse.uml2.uml.Pseudostate;
import org.eclipse.uml2.uml.PseudostateKind;
import org.eclipse.uml2.uml.Region;
import org.eclipse.uml2.uml.Signal;
import org.eclipse.uml2.uml.SignalEvent;
import org.eclipse.uml2.uml.State;
import org.eclipse.uml2.uml.StateMachine;
import org.eclipse.uml2.uml.TimeEvent;
import org.eclipse.uml2.uml.Transition;
import org.eclipse.uml2.uml.Trigger;
import org.eclipse.uml2.uml.UMLPackage;
import org.eclipse.uml2.uml.Vertex;
 ResourceSet resourceSet = new ResourceSetImpl();
    resourceSet.getPackageRegistry().put(UMLPackage.eNS_URI, UMLPackage.eINSTANCE);
    resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put(UMLResource.FILE_EXTENSION, UMLResource.Factory.INSTANCE);
    resourceSet.createResource(modelUri);
    Resource resource = resourceSet.getResource(modelUri, true);

这叫。我想知道这是不是导致了堆的堆积。请帮忙

共有1个答案

羊舌成周
2023-03-14

我把gh572的一些修复推到了master和1.2.x。希望这些对你有用。至少我能够看到垃圾收集更好地工作。我计划在本周晚些时候发布。

 类似资料:
  • Short:有没有可能在纸莎草中创建层次结构(嵌套的)statemachine UML图,然后用它来构建工作的statemachine实例? 在我的主计算机中创建状态并将另一个子计算机链接到它(属性->submachine) 在单个状态机中创建所有内容,用子状态创建状态 在这两种情况下,创建的Spring statemachine都不能识别子机状态。 当我用以下代码列出应用程序中的所有状态时:

  • 我试图收集信息,以便为UML状态机编写正确的转换选择算法。 UML上层结构规范(15.3.12 StateMachine)规定 只有在相互正交的区域中发生的转换才能同时触发。 “相互正交”是否意味着这些区域处于相同的嵌套级别? 对于给定级别的每个状态,将评估所有原始转换,以确定它们是否已启用。 在我看来,它们必须在同一个嵌套层上。正当因为如果在某个嵌套级别上找到一个转换,搜索就会结束。。。 第二个

  • 我们有以下高级DSL处理拓扑: 简而言之,我们在上面做的是: null 其思想是创建窗口化事件计数,并将这些窗口化键用于联接和聚合操作(在KTable的情况下,这类操作没有窗口) 问题是:join和aggregate操作的状态存储没有保留机制,并导致磁盘(RocksDB)中的空间爆炸。 更具体地说:(跳跃)窗口会在键上产生笛卡尔积,并且没有删除旧窗口的机制。 请注意,支持table1和table2

  • 在我的应用程序中,fragment活动包含两个片段,片段A和片段B,fragment B是一个包含3个片段的视图分页器。 在我的活动中,为了防止在配置更改时重新创建片段: 片段B的代码: 显然,在每次轮换时都要这样做: 这会导致整个寻呼机被重新创建,对吗?结果是 将在每次循环时被调用,碎片将从头创建并失去状态: 在中,但其结果是,在循环时,页面中的片段被移除。 有什么想法如何正确地保留在寻呼机内的

  • 我正在用Kafka和Kafka溪流作为Spring-Cloud-Stream流的一部分。在我的Kafka Streams应用程序中流动的数据在特定的时间窗口内被聚合和物化: 按照设计,正在具体化的信息也由changelog主题支持。 用解决方案更新Kafka Streams 2.0.1版不包含Materialized.WithRetention方法。对于这个特定的版本,我可以使用以下代码设置状态存

  • 主要内容:占用块和空闲块,系统的内存管理,可利用空间表,分配存储空间的方式,空间分配与回收过程产生的问题通过前面的学习,介绍很多具体的 数据结构的存储以及遍历的方式,过程中只是很表面地介绍了数据的存储,而没有涉及到更底层的有关的存储空间的分配与回收,从本节开始将做更深入地介绍。 在使用早期的计算机上编写程序时,有关数据存储在什么位置等这样的问题都是需要程序员自己来给数据分配内存。而现在的高级语言,大大的减少了程序员的工作,不需要直接和存储空间打交道,程序在编译时由编译程序去合理地分配空间。 本章