/* * JBoss, Home of Professional Open Source * Copyright 2015, Red Hat, Inc. and/or its affiliates, and individual * contributors by the @authors tag. See the copyright.txt in the * distribution for a full listing of individual contributors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jboss.as.quickstarts.threadracing; import org.jboss.as.quickstarts.threadracing.stage.concurrency.EEConcurrencyRaceStage; import org.jboss.as.quickstarts.threadracing.stage.batch.BatchRaceStage; import org.jboss.as.quickstarts.threadracing.stage.jaxrs.JAXRSRaceStage; import org.jboss.as.quickstarts.threadracing.stage.jms.JMSRaceStage; import org.jboss.as.quickstarts.threadracing.stage.json.JSONRaceStage; import javax.annotation.Resource; import javax.enterprise.concurrent.ManagedThreadFactory; import javax.inject.Inject; import java.util.UUID; /** * A racer, a CDI bean injected with an instance of each race stage, which are also CDI beans. * * The race stages are run sequentially in a managed thread, provided by the container's EE Concurrency 1.0 {@link javax.enterprise.concurrent.ManagedThreadFactory} default instance, also injected, but through @Resource. * * The race's {@link org.jboss.as.quickstarts.threadracing.Race.Registration} is used to control the racer's start and finish/abort. * * @author Eduardo Martins */ public class Racer { /** * JNDI injection of the default managed thread factory instance, introduced by EE Concurrency 1.0 (JSR 236), * which apps may use to create threads running tasks with the invocation context present on the thread creation. */ @Resource private ManagedThreadFactory managedThreadFactory; /** * cdi injection of the Batch 1.0 race stage */ @Inject private BatchRaceStage batchRaceStage; /** * cdi injection of the EE Concurrency 1.0 race stage */ @Inject private EEConcurrencyRaceStage eeConcurrencyRaceStage; /** * cdi injection of the JAX-RS 2.0 race stage */ @Inject private JAXRSRaceStage jaxrsRaceStageRen; /** * cdi injection of the JMS 2.0 race stage */ @Inject private JMSRaceStage jmsRaceStage; /** * cdi injection of the JSON 1.0 race stage */ @Inject private JSONRaceStage jsonRaceStageRen; /** * the racer's registration , which the racer uses to "interact" with a race */ private Race.Registration registration; /** * the racer's name */ private final String name; /** * Mandatory bean's no args constructor, which creates a random racer's name. */ public Racer() { this("Racer" + UUID.randomUUID()); } /** * Creates a racer with the specified name. * @param name */ public Racer(String name) { this.name = name; } /** * Retrieves the racer's name. * @return */ public String getName() { return name; } /** * Sets the race's registration, used by the racer to report race progress. * @param registration */ public void setRegistration(Race.Registration registration) { this.registration = registration; } /** * Starts the racer's engine a.k.a. as thread. The default {@link javax.enterprise.concurrent.ManagedThreadFactory} instance, provided by EE Concurrency 1.0, is used to create the racer's thread. */ public void startEngine() { final Runnable raceTask = new Runnable() { @Override public void run() { try { // the racer is ready registration.ready(); // race on, run baby run runRaceStages(); // game over registration.done(); } catch (Throwable t) { registration.aborted(t); } } }; managedThreadFactory.newThread(raceTask).start(); } /** * Execution of the race stages/tasks. * @throws Exception */ private void runRaceStages() throws Exception { batchRaceStage.run(registration); registration.broadcast("completed the Batch 1.0 stage."); eeConcurrencyRaceStage.run(registration); registration.broadcast("completed the EE Concurrency 1.0 stage."); jaxrsRaceStageRen.run(registration); registration.broadcast("completed the JAX-RS 2.0 stage."); jmsRaceStage.run(registration); registration.broadcast("completed the JMS 2.0 stage."); jsonRaceStageRen.run(registration); registration.broadcast("completed the JSON 1.0 stage."); } }