cassandra单元,用于一组Java UT,如果org.grade.parallel=true,则会出现间歇性故障



我正试图为一组使用org.gradle.parallel=true运行的UT引入cassandra单元,用于春季启动应用程序。

运行所有测试并不可靠,尽管偶尔也能正常工作。

我想这与上描述的问题有关https://github.com/jsevellec/cassandra-unit/issues/155即,当下一个UT开始时,第一个实例仍然存在,似乎没有办法强迫它"迅速"关闭。

我最初给出不可靠结果的方法是使用org.gradle.parallel=true,即

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@TestExecutionListeners(
listeners = CassandraUnitTestExecutionListener.class,
mergeMode = MERGE_WITH_DEFAULTS
)
@CassandraDataSet
@EmbeddedCassandra
public class MyCassandraUnitTest {
@Test
public void xxx_xxx() {
}
}

如cassandra单元/wiki和StephanPraetsch github示例中所述

作为一种解决方法,我尝试删除注释,转而使用本机API,即尝试为所有测试保持一个运行,而使用org.gradle.parallel=false,这似乎是可靠的,但会降低整个构建的速度。(仍在测试以确保其不重合)使用此方法

机组等级前:

EmbeddedCassandraServerHelper.startEmbeddedCassandra();

和后单元类别:

EmbeddedCassandraServerHelper.cleanEmbeddedCassandra();

如中所述-https://github.com/jsevellec/cassandra-unit/wiki/How-to-use-it-in-your-code.

我在第一种方法中遇到的错误是像这样的超时

00:27:31.826 [Test worker] ERROR org.cassandraunit.utils.EmbeddedCassandraServerHelper - Cassandra daemon did not start after 20000 ms. Consider increasing the timeout

或者端口冲突,如

2017-02-02 19:44:41.741 ERROR 40053 --- [pool-2-thread-1] o.a.cassandra.service.CassandraDaemon    : Fatal configuration error
org.apache.cassandra.exceptions.ConfigurationException: /127.0.0.1:7010 is in use by another process.  Change listen_address:storage_port in cassandra.yaml to values that do not conflict with other services
at org.apache.cassandra.net.MessagingService.getServerSockets(MessagingService.java:557)
at org.apache.cassandra.net.MessagingService.listen(MessagingService.java:501)
at org.apache.cassandra.net.MessagingService.listen(MessagingService.java:485)
at org.apache.cassandra.service.StorageService.prepareToJoin(StorageService.java:745)
at org.apache.cassandra.service.StorageService.initServer(StorageService.java:648)
at org.apache.cassandra.service.StorageService.initServer(StorageService.java:548)
at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:385)
at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:601)
at org.cassandraunit.utils.EmbeddedCassandraServerHelper$1.run(EmbeddedCassandraServerHelper.java:129)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
2017-02-02 19:44:41.745  INFO 40053 --- [       Thread-7] o.s.w.c.s.GenericWebApplicationContext   : Closing org.springframework.web.context.support.GenericWebApplicationContext@7ffd8dee: startup date [Thu Feb 02 19:44:17 GMT 2017]; root of context hierarchy
2017-02-02 19:44:41.972  WARN 40053 --- [iceShutdownHook] org.apache.cassandra.gms.Gossiper        : No local state or state is in silent shutdown, not announcing shutdown
2017-02-02 19:44:41.972  INFO 40053 --- [iceShutdownHook] o.apache.cassandra.net.MessagingService  : Waiting for messaging service to quiesce
2017-02-02 19:44:41.982  INFO 40053 --- [iceShutdownHook] org.apache.cassandra.hints.HintsService  : Paused hints dispatch
2017-02-02 19:44:42.072  INFO 40053 --- [iceShutdownHook] org.apache.cassandra.hints.HintsService  : Paused hints dispatch

回答我自己的问题:我牺牲了gradle中的并行项目构建,即我的gradle.properties中的org.gradle.parallel=false

在我的测试中有:

@BeforeClass
public static void before() throws InterruptedException, IOException, TTransportException {
EmbeddedCassandraServerHelper.startEmbeddedCassandra(20000);
}
@AfterClass
public static void after() throws InterruptedException, IOException, TTransportException {
EmbeddedCassandraServerHelper.cleanEmbeddedCassandra();
} 

cleanEmbeddedCassandra()只是清除了密钥空间,但让Cassandra服务器仍在运行。

我更希望清理停止EmbeddedCassandraServer,而不是让它一直运行到进程退出。

这种方法确实有效,但不是我想要的——也许有人会发布更好的方式!

你试过这个吗? EmbeddedCassandraServerHelper.startEmbeddedCassandra(EmbeddedCassandraServerHelper.CASSANDRA_RNDPORT_YML_FILE);

最新更新