簡體   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