2017-02-02 2 views
1

Я пытаюсь представить Кассандру блока для набора работает с союзными территориями org.gradle.parallel=true для весенне-загрузки приложения.Кассандра устройство для набора Java УЦ дает периодические сбои, если org.gradle.parallel = True

Выполнение всех тестов не является надежным, хотя изредка работает.

Я полагаю, что это связано с проблемой, описанной в . 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-unit/wiki и StephanPraetsch github example

В качестве обходного пути я попытался удалить аннотаций и вместо того, чтобы с помощью собственного 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.s[email protected]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 

ответ

1

Отвечая на мой собственный вопрос: я пожертвовала параллельный проект создания в Gradle, т.е. org.gradle.parallel=false в моих gradle.properties

В моих тестах есть:

@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, вместо того чтобы оставить его запущенным до тех пор, пока процесс не завершится.

Подход работает надежно, но не то, что я хотел, возможно, кто-то опубликует лучший способ!

0

Вы пробовали это? EmbeddedCassandraServerHelper.startEmbeddedCassandra(EmbeddedCassandraServerHelper.CASSANDRA_RNDPORT_YML_FILE);

Смежные вопросы