change to quartz job

This commit is contained in:
Mengyi Zhou 2015-06-16 14:11:46 +08:00
parent 61ac933e0a
commit e140635e37
6 changed files with 82 additions and 9 deletions

View file

@ -0,0 +1,47 @@
package com.ctrip.zeus.nginx;
import com.ctrip.zeus.client.LocalClient;
import com.ctrip.zeus.nginx.entity.TrafficStatus;
import com.ctrip.zeus.util.RollingTrafficStatus;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.web.context.support.SpringBeanAutowiringSupport;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Created by zhoumy on 2015/6/3.
*/
public class NginxStatusFetcher extends QuartzJobBean {
private RollingTrafficStatus rollingTrafficStatus;
private AtomicInteger tick = new AtomicInteger();
public List<TrafficStatus> getResult() {
return rollingTrafficStatus.getResult();
}
@Override
protected void executeInternal(org.quartz.JobExecutionContext jobExecutionContext) throws JobExecutionException {
if (tick.incrementAndGet() == 10) {
clearDirtyRecords(System.currentTimeMillis());
tick.set(0);
}
fetchTrafficStatus();
}
private void fetchTrafficStatus() {
String stubStatus = LocalClient.getInstance().getStubStatus();
String reqStatus = LocalClient.getInstance().getReqStatuses();
rollingTrafficStatus.add(stubStatus, reqStatus);
}
private void clearDirtyRecords(long stamp) {
rollingTrafficStatus.clearDirty(stamp);
}
private void setRollingTrafficStatus(RollingTrafficStatus rollingTrafficStatus) {
this.rollingTrafficStatus = rollingTrafficStatus;
}
}

View file

@ -123,9 +123,6 @@ public class SlbAdminServer extends AbstractServer {
@Override
protected void doStart() throws Exception {
server.start();
//Set traffic status collector daemon thread
TrafficStatusCollector.getInstance().start();
}
@Override

View file

@ -12,6 +12,7 @@ import com.ctrip.zeus.nginx.entity.TrafficStatus;
import com.ctrip.zeus.service.build.NginxConfService;
import com.ctrip.zeus.service.model.SlbRepository;
import com.ctrip.zeus.service.nginx.NginxService;
import com.ctrip.zeus.util.RollingTrafficStatus;
import com.ctrip.zeus.util.S;
import com.ctrip.zeus.util.TrafficStatusCollector;
import com.netflix.config.DynamicIntProperty;
@ -40,6 +41,8 @@ public class NginxServiceImpl implements NginxService {
private NginxConfService nginxConfService;
@Resource
private NginxServerDao nginxServerDao;
@Resource
private RollingTrafficStatus rollingTrafficStatus;
private Logger logger = LoggerFactory.getLogger(NginxServiceImpl.class);
@ -280,7 +283,7 @@ public class NginxServiceImpl implements NginxService {
@Override
public List<TrafficStatus> getLocalTrafficStatus() {
List<TrafficStatus> l = TrafficStatusCollector.getInstance().getResult();
List<TrafficStatus> l = rollingTrafficStatus.getResult();
for (TrafficStatus trafficStatus : l) {
trafficStatus.setServerIp(S.getIp());
}

View file

@ -3,17 +3,23 @@ package com.ctrip.zeus.util;
import com.ctrip.zeus.nginx.entity.ReqStatus;
import com.ctrip.zeus.nginx.entity.TrafficStatus;
import com.google.common.base.Preconditions;
import org.springframework.stereotype.Component;
import java.util.*;
/**
* Created by zhoumy on 2015/5/6.
*/
@Component("rollingTrafficStatus")
public class RollingTrafficStatus {
private final CircularArray buckets;
private final int numberOfBuckets;
private final int interval;
public RollingTrafficStatus() {
this(10, 60);
}
/**
* Collecting data and offering statistics of a given time over defined interval.
* For example, if you want to track 1-minute data per 10 minutes, it doesn't empty out every 10 minutes,

View file

@ -13,16 +13,11 @@ public class TrafficStatusCollector {
private final int syncInterval;
private final int size;
private final RollingTrafficStatus rollingTrafficStatus;
private final static TrafficStatusCollector instance = new TrafficStatusCollector();
public TrafficStatusCollector() {
this(60, 10);
}
public static TrafficStatusCollector getInstance() {
return instance;
}
public TrafficStatusCollector(int syncInterval, int size) {
this.syncInterval = syncInterval;
this.size = size;

View file

@ -18,5 +18,30 @@
<aop:aspectj-autoproxy proxy-target-class="true"/>
<bean id="dbLockFactory" class="com.ctrip.zeus.lock.DbLockFactory"/>
<import resource="dao-beans.xml"/>
<bean id="rollingTrafficStatus" class="com.ctrip.zeus.util.RollingTrafficStatus" />
<bean id="nginxStatusFetcherDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="com.ctrip.zeus.nginx.NginxStatusFetcher"/>
<property name="durability" value="true" />
</bean>
<!-- Run the job every 2 seconds with initial delay of 1 second -->
<bean id="nginxStatusFetcherTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<property name="jobDetail" ref="nginxStatusFetcherDetail"/>
<property name="startDelay" value="1000"/>
<property name="repeatInterval" value="1000"/>
</bean>
<!-- Scheduler factory bean to glue together jobDetails and triggers to Configure Quartz Scheduler -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="jobDetails">
<list>
<ref bean="nginxStatusFetcherDetail"/>
</list>
</property>
<property name="triggers">
<list>
<ref bean="nginxStatusFetcherTrigger"/>
</list>
</property>
</bean>
</beans>