Search in sources :

Example 1 with Product

use of com.vladmihalcea.mongo.model.Product in project vladmihalcea.wordpress.com by vladmihalcea.

the class ProductRepositoryIT method testFindAndInsert.

@Test
public void testFindAndInsert() {
    Long randomId = new Random().nextLong();
    assertNull(productRepository.findOne(randomId));
    Product product = productRepository.findAndInsert(randomId);
    Assert.assertEquals(product.getId(), productRepository.findOne(randomId).getId());
}
Also used : Random(java.util.Random) Product(com.vladmihalcea.mongo.model.Product) Test(org.junit.Test)

Example 2 with Product

use of com.vladmihalcea.mongo.model.Product in project vladmihalcea.wordpress.com by vladmihalcea.

the class ProductRepositoryIT method testRetries.

@Test
public void testRetries() throws InterruptedException {
    Product product = new Product();
    product.setId(123L);
    product.setName("Tv");
    productRepository.save(product);
    Product savedProduct = productRepository.findOne(123L);
    assertEquals(savedProduct, product);
    final int threadsNumber = 10;
    final AtomicInteger atomicInteger = new AtomicInteger();
    final CountDownLatch startLatch = new CountDownLatch(threadsNumber + 1);
    final CountDownLatch endLatch = new CountDownLatch(threadsNumber + 1);
    for (; atomicInteger.get() < threadsNumber; atomicInteger.incrementAndGet()) {
        final long index = (long) atomicInteger.get() * threadsNumber;
        LOGGER.info("Scheduling thread index {}", index);
        Thread testThread = new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    startLatch.countDown();
                    startLatch.await();
                    productService.updateName(123L, UUID.randomUUID().toString());
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                } catch (Exception e) {
                    LOGGER.error("Exception thrown!", e);
                } finally {
                    endLatch.countDown();
                }
            }
        });
        testThread.start();
    }
    startLatch.countDown();
    LOGGER.info("Waiting for threads to be done");
    endLatch.countDown();
    endLatch.await();
    LOGGER.info("Threads are done");
}
Also used : AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Product(com.vladmihalcea.mongo.model.Product) CountDownLatch(java.util.concurrent.CountDownLatch) OptimisticLockingFailureException(org.springframework.dao.OptimisticLockingFailureException) Test(org.junit.Test)

Example 3 with Product

use of com.vladmihalcea.mongo.model.Product in project vladmihalcea.wordpress.com by vladmihalcea.

the class ProductServiceImpl method updateName.

@Override
@Retry(times = 10, on = org.springframework.dao.OptimisticLockingFailureException.class)
public Product updateName(Long id, String name) {
    Product product = productRepository.findOne(id);
    product.setName(name);
    LOGGER.info("Updating product {} name to {}", product, name);
    return productRepository.save(product);
}
Also used : Product(com.vladmihalcea.mongo.model.Product) Retry(com.vladmihalcea.concurrent.Retry)

Example 4 with Product

use of com.vladmihalcea.mongo.model.Product in project vladmihalcea.wordpress.com by vladmihalcea.

the class ProductRepositoryIT method testSave.

@Test
public void testSave() {
    Product product = new Product();
    product.setId(123L);
    product.setName("Tv");
    product.setQuantity(BigInteger.TEN);
    product.setDiscount(BigDecimal.valueOf(12.34));
    productRepository.save(product);
    Product savedProduct = productRepository.findOne(123L);
    assertEquals(savedProduct, product);
    assertEquals(savedProduct.hashCode(), product.hashCode());
    assertEquals(Long.valueOf(0), product.getVersion());
    assertEquals("Tv", product.getName());
    savedProduct.setName("Dvd");
    savedProduct = productRepository.save(savedProduct);
    assertEquals(Long.valueOf(1), savedProduct.getVersion());
    savedProduct.setVersion(0L);
    try {
        productRepository.save(savedProduct);
        fail("Expected OptimisticLockingFailureException");
    } catch (OptimisticLockingFailureException e) {
    }
    productRepository.delete(product);
}
Also used : OptimisticLockingFailureException(org.springframework.dao.OptimisticLockingFailureException) Product(com.vladmihalcea.mongo.model.Product) Test(org.junit.Test)

Example 5 with Product

use of com.vladmihalcea.mongo.model.Product in project vladmihalcea.wordpress.com by vladmihalcea.

the class ProductRepositoryIT method testMigration.

@Test
public void testMigration() {
    Product tv = productRepository.findOne(1L);
    assertEquals("TV", tv.getName());
    assertEquals(Long.valueOf(2), tv.getVersion());
    assertEquals(BigDecimal.valueOf(189.99), tv.getPrice());
}
Also used : Product(com.vladmihalcea.mongo.model.Product) Test(org.junit.Test)

Aggregations

Product (com.vladmihalcea.mongo.model.Product)5 Test (org.junit.Test)4 OptimisticLockingFailureException (org.springframework.dao.OptimisticLockingFailureException)2 Retry (com.vladmihalcea.concurrent.Retry)1 Random (java.util.Random)1 CountDownLatch (java.util.concurrent.CountDownLatch)1 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)1