package com.clouck.mq; import java.util.List; import org.apache.commons.lang3.Validate; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.clouck.application.Ec2Constants; import com.clouck.model.EventConfig; import com.clouck.model.Region; import com.clouck.model.ResourceType; import com.clouck.model.aws.ec2.Ec2Version; import com.clouck.model.aws.ec2.Ec2VersionMeta; import com.clouck.service.AwsService; import com.clouck.service.BaseService; import com.clouck.service.ConfService; import com.clouck.service.EventService; import com.google.common.base.Optional; @Component public class GenerateEventWorker { private static final Logger log = LoggerFactory.getLogger(GenerateEventWorker.class); @Autowired private ConfService confService; @Autowired private AwsService awsService; @Autowired private EventService eventService; @Autowired private BaseService baseService; public void receive(GenerateEventMessage message) { Validate.noNullElements(new Object[]{message.getAccountId(), message.getResourceType(), message.getRegion()}); String accountId = message.getAccountId(); ResourceType resourceType = message.getResourceType(); Region region = message.getRegion(); //prevent receiving too many "same" messages at the same time in case of worker failure. Optional<EventConfig> oEventConf = confService.findEventConf(accountId, resourceType, region); if (oEventConf.isPresent()) { DateTime now = DateTime.now(); EventConfig ec = oEventConf.get(); DateTime dateTime = new DateTime(ec.getLastProcessTime()); if (dateTime.plusSeconds(Ec2Constants.Event_Generating_Mininum_Waiting_Seconds).isAfter(now)) { return; } else { ec.setLastProcessTime(now.toDate()); confService.save(ec); } } else { confService.createNewEventConf(accountId, resourceType, region); } Optional<Ec2VersionMeta> oLatestEc2VersionMeta = awsService.findLatestEc2VersionMeta(accountId, resourceType, region); if (oLatestEc2VersionMeta.isPresent()) { DateTime dt = new DateTime(oLatestEc2VersionMeta.get().getTimeDetected()); List<Ec2Version> ec2Versions = awsService.findEc2VersionsFromIncludeOrderByTimeDetected(accountId, resourceType, region, dt); List<Ec2VersionMeta> eventMetas = eventService.generateEvents(ec2Versions); baseService.insertAll(eventMetas); } else { Optional<Ec2Version> oFirstEc2Version = awsService.findFirstEc2Version(accountId, region, resourceType); if (oFirstEc2Version.isPresent()) { Ec2VersionMeta eventMeta = eventService.generateEvents(oFirstEc2Version.get()); baseService.save(eventMeta); } } } }