Java tutorial
/** * Copyright 2013 BlackLocus * * 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 com.blacklocus.qs.worker.aws; import com.amazonaws.util.EC2MetadataUtils; import com.blacklocus.qs.worker.api.QSWorkerIdService; import com.blacklocus.qs.worker.simple.HostNameQSWorkerIdService; import org.apache.commons.lang3.StringUtils; import java.util.concurrent.atomic.AtomicReference; /** * Identifies this worker by its Amazon EC2 instance id {@link EC2MetadataUtils#getInstanceId()}. Caches the value * after first lookup forever. If the read fails, defers to a fallback QSWorkerIdService -- The fallback value is not * cached and consulted every invocation. * * @author Jason Dunkelberger (dirkraft) */ public class AmazonEC2WorkerIdService implements QSWorkerIdService { public static final String PROP_SKIP_EC2_META = "com.blacklocus.qs.aws.disableEC2Meta"; private final QSWorkerIdService fallback; private final AtomicReference<String> ec2id = new AtomicReference<String>(); /** * Defaults fallback to {@link HostNameQSWorkerIdService} */ public AmazonEC2WorkerIdService() { this(new HostNameQSWorkerIdService()); } /** * @param fallback in case the EC2 metadata lookup fails, most likely because this is not actually an EC2 instance. * Disable EC2 checking and go straight to the fallback by setting {@link #PROP_SKIP_EC2_META} to * <code>true</code>. */ public AmazonEC2WorkerIdService(QSWorkerIdService fallback) { this.fallback = fallback; } @Override public String getWorkerId() { String id = ec2id.get(); if (null == id) { if (!Boolean.valueOf(System.getProperty(PROP_SKIP_EC2_META, "false"))) { id = EC2MetadataUtils.getInstanceId(); ec2id.set(id); } } // Maybe ec2 meta was disabled, maybe it failed. Whatever: fall back. if (StringUtils.isBlank(id)) { id = fallback.getWorkerId(); } return id; } }