guide/blueprints/java/java_app/ExampleWebApp.java (57 lines of code) (raw):
package com.acme.autobrick;
import org.apache.brooklyn.api.entity.EntitySpec;
import org.apache.brooklyn.api.policy.PolicySpec;
import org.apache.brooklyn.api.sensor.AttributeSensor;
import org.apache.brooklyn.api.sensor.EnricherSpec;
import org.apache.brooklyn.core.entity.AbstractApplication;
import org.apache.brooklyn.core.sensor.DependentConfiguration;
import org.apache.brooklyn.core.sensor.Sensors;
import org.apache.brooklyn.enricher.stock.Enrichers;
import org.apache.brooklyn.entity.database.mysql.MySqlNode;
import org.apache.brooklyn.entity.group.DynamicCluster;
import org.apache.brooklyn.entity.proxy.nginx.NginxController;
import org.apache.brooklyn.entity.webapp.tomcat.TomcatServer;
import org.apache.brooklyn.policy.autoscaling.AutoScalerPolicy;
import org.apache.brooklyn.policy.ha.ServiceFailureDetector;
import org.apache.brooklyn.policy.ha.ServiceReplacer;
import org.apache.brooklyn.policy.ha.ServiceRestarter;
import org.apache.brooklyn.util.time.Duration;
public class ExampleWebApp extends AbstractApplication {
@Override
public void init() {
AttributeSensor<Double> reqsPerSecPerNodeSensor = Sensors.newDoubleSensor(
"webapp.reqs.perSec.perNode",
"Reqs/sec averaged over all nodes");
MySqlNode db = addChild(EntitySpec.create(MySqlNode.class)
.configure(MySqlNode.CREATION_SCRIPT_URL, "https://bit.ly/brooklyn-visitors-creation-script"));
DynamicCluster cluster = addChild(EntitySpec.create(DynamicCluster.class)
.displayName("Cluster")
.configure(DynamicCluster.MEMBER_SPEC, EntitySpec.create(TomcatServer.class)
.configure(TomcatServer.ROOT_WAR,
"https://search.maven.org/remotecontent?filepath=org/apache/brooklyn/example/brooklyn-example-hello-world-sql-webapp/0.12.0/brooklyn-example-hello-world-sql-webapp-0.12.0.war" /* BROOKLYN_VERSION */ )
.configure(TomcatServer.JAVA_SYSPROPS.subKey("brooklyn.example.db.url"),
DependentConfiguration.formatString("jdbc:%s%s?user=%s&password=%s",
DependentConfiguration.attributeWhenReady(db, MySqlNode.DATASTORE_URL),
"visitors", "brooklyn", "br00k11n"))
.policy(PolicySpec.create(ServiceRestarter.class)
.configure(ServiceRestarter.FAIL_ON_RECURRING_FAILURES_IN_THIS_DURATION, Duration.minutes(5)))
.enricher(EnricherSpec.create(ServiceFailureDetector.class)
.configure(ServiceFailureDetector.ENTITY_FAILED_STABILIZATION_DELAY, Duration.seconds(30))))
.policy(PolicySpec.create(ServiceReplacer.class))
.policy(PolicySpec.create(AutoScalerPolicy.class)
.configure(AutoScalerPolicy.METRIC, reqsPerSecPerNodeSensor)
.configure(AutoScalerPolicy.METRIC_LOWER_BOUND, 1)
.configure(AutoScalerPolicy.METRIC_UPPER_BOUND, 3)
.configure(AutoScalerPolicy.RESIZE_UP_STABILIZATION_DELAY, Duration.seconds(2))
.configure(AutoScalerPolicy.RESIZE_DOWN_STABILIZATION_DELAY, Duration.minutes(1))
.configure(AutoScalerPolicy.MAX_POOL_SIZE, 3))
.enricher(Enrichers.builder().aggregating(TomcatServer.REQUESTS_PER_SECOND_IN_WINDOW)
.computingAverage()
.fromMembers()
.publishing(reqsPerSecPerNodeSensor)
.build()));
addChild(EntitySpec.create(NginxController.class)
.configure(NginxController.SERVER_POOL, cluster)
.configure(NginxController.STICKY, false));
}
}