/*
* Copyright 2012 Netflix, Inc.
*
* 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.netflix.appinfo;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonRootName;
import com.thoughtworks.xstream.annotations.XStreamOmitField;
/**
* Represents the <em>lease</em> information with <em>Eureka</em>.
*
* <p>
* <em>Eureka</em> decides to remove the instance out of its view depending on
* the duration that is set in
* {@link EurekaInstanceConfig#getLeaseExpirationDurationInSeconds()} which is
* held in this lease. The lease also tracks the last time it was renewed.
* </p>
*
* @author Karthik Ranganathan, Greg Kim
*
*/
@JsonRootName("leaseInfo")
public class LeaseInfo {
public static final int DEFAULT_LEASE_RENEWAL_INTERVAL = 30;
public static final int DEFAULT_LEASE_DURATION = 90;
// Client settings
private int renewalIntervalInSecs = DEFAULT_LEASE_RENEWAL_INTERVAL;
private int durationInSecs = DEFAULT_LEASE_DURATION;
// Server populated
private long registrationTimestamp;
private long lastRenewalTimestamp;
private long evictionTimestamp;
private long serviceUpTimestamp;
public static final class Builder {
@XStreamOmitField
private LeaseInfo result;
private Builder() {
result = new LeaseInfo();
}
public static Builder newBuilder() {
return new Builder();
}
/**
* Sets the registration timestamp.
*
* @param ts
* time when the lease was first registered.
* @return the {@link LeaseInfo} builder.
*/
public Builder setRegistrationTimestamp(long ts) {
result.registrationTimestamp = ts;
return this;
}
/**
* Sets the last renewal timestamp of lease.
*
* @param ts
* time when the lease was last renewed.
* @return the {@link LeaseInfo} builder.
*/
public Builder setRenewalTimestamp(long ts) {
result.lastRenewalTimestamp = ts;
return this;
}
/**
* Sets the de-registration timestamp.
*
* @param ts
* time when the lease was removed.
* @return the {@link LeaseInfo} builder.
*/
public Builder setEvictionTimestamp(long ts) {
result.evictionTimestamp = ts;
return this;
}
/**
* Sets the service UP timestamp.
*
* @param ts
* time when the leased service marked as UP.
* @return the {@link LeaseInfo} builder.
*/
public Builder setServiceUpTimestamp(long ts) {
result.serviceUpTimestamp = ts;
return this;
}
/**
* Sets the client specified setting for eviction (e.g. how long to wait
* without renewal event).
*
* @param d
* time in seconds after which the lease would expire without
* renewa.
* @return the {@link LeaseInfo} builder.
*/
public Builder setDurationInSecs(int d) {
if (d <= 0) {
result.durationInSecs = DEFAULT_LEASE_DURATION;
} else {
result.durationInSecs = d;
}
return this;
}
/**
* Sets the client specified setting for renew interval.
*
* @param i
* the time interval with which the renewals will be renewed.
* @return the {@link LeaseInfo} builder.
*/
public Builder setRenewalIntervalInSecs(int i) {
if (i <= 0) {
result.renewalIntervalInSecs = DEFAULT_LEASE_RENEWAL_INTERVAL;
} else {
result.renewalIntervalInSecs = i;
}
return this;
}
/**
* Build the {@link InstanceInfo}.
*
* @return the {@link LeaseInfo} information built based on the supplied
* information.
*/
public LeaseInfo build() {
return result;
}
}
private LeaseInfo() {
}
/**
* TODO: note about renewalTimestamp legacy:
* The previous change to use Jackson ser/deser changed the field name for lastRenewalTimestamp to renewalTimestamp
* for serialization, which causes an incompatibility with the jacksonNG codec when the server returns data with
* field renewalTimestamp and jacksonNG expects lastRenewalTimestamp. Remove this legacy field from client code
* in a few releases (once servers are updated to a release that generates json with the correct
* lastRenewalTimestamp).
*/
@JsonCreator
public LeaseInfo(@JsonProperty("renewalIntervalInSecs") int renewalIntervalInSecs,
@JsonProperty("durationInSecs") int durationInSecs,
@JsonProperty("registrationTimestamp") long registrationTimestamp,
@JsonProperty("lastRenewalTimestamp") Long lastRenewalTimestamp,
@JsonProperty("renewalTimestamp") long lastRenewalTimestampLegacy, // for legacy
@JsonProperty("evictionTimestamp") long evictionTimestamp,
@JsonProperty("serviceUpTimestamp") long serviceUpTimestamp) {
this.renewalIntervalInSecs = renewalIntervalInSecs;
this.durationInSecs = durationInSecs;
this.registrationTimestamp = registrationTimestamp;
this.evictionTimestamp = evictionTimestamp;
this.serviceUpTimestamp = serviceUpTimestamp;
if (lastRenewalTimestamp == null) {
this.lastRenewalTimestamp = lastRenewalTimestampLegacy;
} else {
this.lastRenewalTimestamp = lastRenewalTimestamp;
}
}
/**
* Returns the registration timestamp.
*
* @return time in milliseconds since epoch.
*/
public long getRegistrationTimestamp() {
return registrationTimestamp;
}
/**
* Returns the last renewal timestamp of lease.
*
* @return time in milliseconds since epoch.
*/
@JsonProperty("lastRenewalTimestamp")
public long getRenewalTimestamp() {
return lastRenewalTimestamp;
}
/**
* Returns the de-registration timestamp.
*
* @return time in milliseconds since epoch.
*/
public long getEvictionTimestamp() {
return evictionTimestamp;
}
/**
* Returns the service UP timestamp.
*
* @return time in milliseconds since epoch.
*/
public long getServiceUpTimestamp() {
return serviceUpTimestamp;
}
/**
* Returns client specified setting for renew interval.
*
* @return time in milliseconds since epoch.
*/
public int getRenewalIntervalInSecs() {
return renewalIntervalInSecs;
}
/**
* Returns client specified setting for eviction (e.g. how long to wait w/o
* renewal event)
*
* @return time in milliseconds since epoch.
*/
public int getDurationInSecs() {
return durationInSecs;
}
}