繁体   English   中英

Esper 引擎:运行 JUNIT 测试用例时再次创建同一张表

[英]Esper Engine : Same table created again when running JUNIT test cases

我正在使用 Esper 8.8。 以下代码用于初始化 SQL 并注册所有事件 -

    EPCompiler compiler = EPCompilerProvider.getCompiler();
    Configuration configuration = new Configuration();
    configuration.getCommon().addEventType(Employee.class);
    configuration.getCompiler().getByteCode().setAllowSubscriber(true);

    CompilerArguments arguments = new CompilerArguments(configuration);
    EPCompiled epCompiled = compiler.compile("@public create table EmployeeTable(empId string primary key, age integer);", arguments);


    EPRuntime runtime = EPRuntimeProvider.getDefaultRuntime(configuration);
    arguments.getPath().add(runtime.getRuntimePath());
    arguments.getPath().add(epCompiled);

    EPDeploymentService deploymentService = runtime.getDeploymentService();
    EPDeployment deployment = deploymentService.deploy(epCompiled);
    EPEventService eventService = runtime.getEventService();

当测试用例运行时,每个测试都会执行上面的代码,并报告如下错误。 上述代码存在于 Spring Bean 中,并在应用程序中初始化一次。 但是,测试用例在每次测试时都在初始化 bean,并且引擎不应该记住任何表创建 -

原因:com.espertech.esper.runtime.client.EPDeployPreconditionException:不满足前提条件:已在 com.espertech.esper.runtime.internal 为模块“(未命名)”创建名为“EmployeeTable”的表。 kernel.service.DeployerHelperUpdatePath.updatePath(DeployerHelperUpdatePath.java:67) at com.espertech.esper.runtime.internal.kernel.service.Deployer.deploySafe(Deployer.java:97) at com.espertech.esper.runtime.internal. kernel.service.Deployer.deploy(Deployer.java:60) at com.espertech.esper.runtime.internal.kernel.service.Deployer.deployFresh(Deployer.java:48) at Z4D236D9A2D102C5FE6 AD1C50DA4BEC50Z.espertech.esper.runtime.internal.kernel.service.EPDeploymentServiceImpl.deploy(EPDeploymentServiceImpl.java:119) at com.espertech.esper.runtime.internal.kernel.service.EPDeploymentServiceImpl.deploy(EPDeploymentServiceImpl.java:94) at com.rbccm.gdm.aps.algo.esper.EsperEngine.init(EsperEngine.java:91) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect .NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at Z93F725A07423FE1C889F448B33D21F 46Z.base/java.lang.reflect.Method.invoke(Method.java:566)

8.8.0版本有没有办法清除Esper Engine。 我在 Esper 版本 0.6.1 中找到了这些类,但是这些类在版本 8.8.0 中不再可用http://esper.espertech.com/release-6.0.1/esper-reference/html/api.html#api-engine-instances -

// Obtain an engine instance
EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider(config);

// Optionally, use initialize if the same engine instance has been used before to start clean
epService.initialize();

https://www.espertech.com/2018/10/23/esper-8-migrating-api-uses-from-older-versions/提供解决方案。 需要调用这个 -

runtime.initialize();

每次测试后都需要调用runtime.destroy()

从 EPRuntimeProvider 获取运行时

// Obtain a runtime
EPRuntime runtime = EPRuntimeProvider.getDefaultRuntime(config);

// Optionally, use initialize if the same runtime 
// has been used before to start clean
runtime.initialize();

// Destroy the runtime when no longer needed, 
// frees up resources, releases the runtime URI
runtime.destroy();

另一种方法是使用上下文。

create context SingleDayContext start @now end EndOfDayEvent;

并发送一个EndOfDayEvent清除测试之间的所有事件。

@AfterEach
void tearDown() {
    events.sendEvent(new EndOfDayEvent());

}

然后在测试运行结束时,销毁@AfterAll中的测试

@AfterAll
static void tearDownAll() {
    events.destroy();

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM