弹簧状态机UML保留在内存中

时间:2018-07-02 12:29:28

标签: state-machine spring-statemachine

我已经在Spring State机器上工作了一年多了,根据我的要求尝试不同的实现方式,当我使用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(resource);

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;

这些保留在我的内存中,导致其占用大量内存,并且未被垃圾收集器收集。当我们将其用于大型应用程序时,这会造成很多麻烦,并且每隔几分钟就会创建许多实例。

请提出解决方法。

编辑-我设法为这个问题创建了一个单例包装器,但是无论如何,它仍然存在。我的同事发现加载的资源没有卸载。所以每次我调用builder.build()时,

 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 个答案:

答案 0 :(得分:0)

我将每个gh572的修复程序推送到master和1.2.x。希望那些为您工作。至少我能够看到垃圾收集更好地工作。我计划在本周晚些时候发布版本。