Search in sources :

Example 1 with TestConfigurationHolder

use of io.spring.cloud.samples.brewery.common.TestConfigurationHolder in project brewery by spring-cloud-samples.

the class IngredientsController method distributeIngredients.

/**
 * [SLEUTH] Callable - separate thread pool
 */
@RequestMapping(method = RequestMethod.POST)
public Callable<Ingredients> distributeIngredients(@RequestBody Order order, @RequestHeader("PROCESS-ID") String processId, @RequestHeader(value = TestConfigurationHolder.TEST_COMMUNICATION_TYPE_HEADER_NAME, defaultValue = "REST_TEMPLATE", required = false) TestConfigurationHolder.TestCommunicationType testCommunicationType) {
    log.info("Setting tags and events on an already existing span");
    tracer.currentSpan().tag("beer", "stout");
    tracer.currentSpan().annotate("ingredientsAggregationStarted");
    log.info("Starting beer brewing process for process id [{}]", processId);
    Span span = tracer.nextSpan().name("inside_aggregating").start();
    try (Tracer.SpanInScope ws = tracer.withSpanInScope(span)) {
        TestConfigurationHolder testConfigurationHolder = TestConfigurationHolder.TEST_CONFIG.get();
        return () -> ingredientsAggregator.fetchIngredients(order, processId, testConfigurationHolder);
    } finally {
        span.finish();
    }
}
Also used : Tracer(brave.Tracer) Span(brave.Span) TestConfigurationHolder(io.spring.cloud.samples.brewery.common.TestConfigurationHolder) RequestMapping(org.springframework.web.bind.annotation.RequestMapping)

Example 2 with TestConfigurationHolder

use of io.spring.cloud.samples.brewery.common.TestConfigurationHolder in project brewery by spring-cloud-samples.

the class Bottler method bottle.

/**
 * [SLEUTH] TraceCommand
 */
@Override
public void bottle(Wort wort, String processId, String testCommunicationType) {
    log.info("I'm in the bottling service");
    log.info("Process ID from headers {}", processId);
    String groupKey = "bottling";
    String commandKey = "bottle";
    HystrixCommand.Setter setter = HystrixCommand.Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey(groupKey)).andCommandKey(HystrixCommandKey.Factory.asKey(commandKey));
    TestConfigurationHolder testConfigurationHolder = TestConfigurationHolder.TEST_CONFIG.get();
    new TraceCommand<Void>(tracer, traceKeys, setter) {

        @Override
        public Void doRun() throws Exception {
            TestConfigurationHolder.TEST_CONFIG.set(testConfigurationHolder);
            log.info("Sending info to bottling service about process id [{}]", processId);
            bottlerService.bottle(wort, processId);
            return null;
        }
    }.execute();
}
Also used : HystrixCommand(com.netflix.hystrix.HystrixCommand) TestConfigurationHolder(io.spring.cloud.samples.brewery.common.TestConfigurationHolder)

Example 3 with TestConfigurationHolder

use of io.spring.cloud.samples.brewery.common.TestConfigurationHolder in project brewery by spring-cloud-samples.

the class IngredientsAggregator method fetchIngredients.

// TODO: Consider simplifying the case by removing the DB (always matches threshold)
public Ingredients fetchIngredients(Order order, String processId, TestConfigurationHolder testConfigurationHolder) throws Exception {
    TestConfigurationHolder.TEST_CONFIG.set(testConfigurationHolder);
    log.info("Fetching ingredients for order [{}] , processId [{}]", order, processId);
    /**
     * [SLEUTH] ParallelStreams won't work out of the box
     * - example of a completable future with our TraceableExecutorService
     * - makes little business sense here but that's just an example
     */
    CompletableFuture completableFuture = CompletableFuture.supplyAsync(() -> {
        TestConfigurationHolder.TEST_CONFIG.set(testConfigurationHolder);
        ingredientsCollector.collectIngredients(order, processId).stream().filter(ingredient -> ingredient != null).forEach((Ingredient ingredient) -> {
            log.info("Adding an ingredient [{}] for order [{}] , processId [{}]", ingredient);
            ingredientWarehouse.addIngredient(ingredient);
        });
        return null;
    }, new TraceableExecutorService(this.beanFactory, Executors.newFixedThreadPool(5), "fetchIngredients"));
    // block to perform the request (as I said the example is stupid)
    completableFuture.get();
    eventGateway.emitEvent(Event.builder().eventType(EventType.INGREDIENTS_ORDERED).processId(processId).build());
    Ingredients ingredients = ingredientWarehouse.getCurrentState();
    return maturingUpdater.updateIfLimitReached(ingredients, processId);
}
Also used : Autowired(org.springframework.beans.factory.annotation.Autowired) TraceableExecutorService(org.springframework.cloud.sleuth.instrument.async.TraceableExecutorService) CompletableFuture(java.util.concurrent.CompletableFuture) TestConfigurationHolder(io.spring.cloud.samples.brewery.common.TestConfigurationHolder) Ingredients(io.spring.cloud.samples.brewery.common.model.Ingredients) Executors(java.util.concurrent.Executors) Event(io.spring.cloud.samples.brewery.common.events.Event) EventGateway(io.spring.cloud.samples.brewery.common.events.EventGateway) Slf4j(lombok.extern.slf4j.Slf4j) Component(org.springframework.stereotype.Component) Order(io.spring.cloud.samples.brewery.common.model.Order) BeanFactory(org.springframework.beans.factory.BeanFactory) EventType(io.spring.cloud.samples.brewery.common.events.EventType) Ingredient(io.spring.cloud.samples.brewery.common.model.Ingredient) CompletableFuture(java.util.concurrent.CompletableFuture) Ingredient(io.spring.cloud.samples.brewery.common.model.Ingredient) Ingredients(io.spring.cloud.samples.brewery.common.model.Ingredients) TraceableExecutorService(org.springframework.cloud.sleuth.instrument.async.TraceableExecutorService)

Example 4 with TestConfigurationHolder

use of io.spring.cloud.samples.brewery.common.TestConfigurationHolder in project brewery by spring-cloud-samples.

the class Maturer method distributeIngredients.

@Override
public void distributeIngredients(io.spring.cloud.samples.brewery.common.model.Ingredients ingredients, String processId, String testCommunicationType) {
    log.info("I'm in the maturing service. Will distribute ingredients");
    TestConfigurationHolder configurationHolder = TestConfigurationHolder.builder().testCommunicationType(TestConfigurationHolder.TestCommunicationType.valueOf(testCommunicationType)).build();
    bottlingServiceUpdater.updateBottlingServiceAboutBrewedBeer(ingredients, processId, configurationHolder);
}
Also used : TestConfigurationHolder(io.spring.cloud.samples.brewery.common.TestConfigurationHolder)

Aggregations

TestConfigurationHolder (io.spring.cloud.samples.brewery.common.TestConfigurationHolder)4 Span (brave.Span)1 Tracer (brave.Tracer)1 HystrixCommand (com.netflix.hystrix.HystrixCommand)1 Event (io.spring.cloud.samples.brewery.common.events.Event)1 EventGateway (io.spring.cloud.samples.brewery.common.events.EventGateway)1 EventType (io.spring.cloud.samples.brewery.common.events.EventType)1 Ingredient (io.spring.cloud.samples.brewery.common.model.Ingredient)1 Ingredients (io.spring.cloud.samples.brewery.common.model.Ingredients)1 Order (io.spring.cloud.samples.brewery.common.model.Order)1 CompletableFuture (java.util.concurrent.CompletableFuture)1 Executors (java.util.concurrent.Executors)1 Slf4j (lombok.extern.slf4j.Slf4j)1 BeanFactory (org.springframework.beans.factory.BeanFactory)1 Autowired (org.springframework.beans.factory.annotation.Autowired)1 TraceableExecutorService (org.springframework.cloud.sleuth.instrument.async.TraceableExecutorService)1 Component (org.springframework.stereotype.Component)1 RequestMapping (org.springframework.web.bind.annotation.RequestMapping)1