blob: e932d638fd1ac64e200bdafd911d5e9caaa71c67 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.servicecomb.serviceregistry.task;
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
import org.apache.commons.lang.StringUtils;
import org.apache.servicecomb.registry.api.registry.Microservice;
import org.apache.servicecomb.registry.api.registry.MicroserviceInstance;
import org.apache.servicecomb.serviceregistry.RegistryUtils;
import org.apache.servicecomb.serviceregistry.client.ServiceRegistryClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MicroserviceInstanceStatusSyncTask extends AbstractTask {
private static final Logger LOGGER = LoggerFactory.getLogger(MicroserviceInstanceStatusSyncTask.class);
public MicroserviceInstanceStatusSyncTask(EventBus eventBus, ServiceRegistryClient srClient,
Microservice microservice) {
super(eventBus, srClient, microservice);
}
@Subscribe
public void onMicroserviceRegisterTask(MicroserviceInstanceRegisterTask task) {
if (task.taskStatus == TaskStatus.FINISHED && isSameMicroservice(task.getMicroservice())) {
LOGGER.info("start synchronizing instance status");
this.taskStatus = TaskStatus.READY;
}
}
@Override
public void run() {
if (taskStatus == TaskStatus.READY) {
doRun();
}
}
@Override
protected void doRun() {
if (isInstanceNotRegistered()) {
return;
}
MicroserviceInstance serviceInstance = queryMicroserviceInstance();
if (serviceInstance == null) {
return;
}
if (RegistryUtils.getMicroserviceInstance().getStatus().equals(serviceInstance.getStatus())) {
return;
}
LOGGER.info("sync instance status from sc, current status is [{}], changed to [{}]",
RegistryUtils.getMicroserviceInstance().getStatus(),
serviceInstance.getStatus());
RegistryUtils.getMicroserviceInstance().setStatus(serviceInstance.getStatus());
}
private boolean isInstanceNotRegistered() {
if (StringUtils.isEmpty(microservice.getServiceId()) || StringUtils.isEmpty(RegistryUtils.getMicroserviceInstance().getInstanceId())) {
LOGGER.warn("instance status synchronization condition not met, serviceId = [{}], instanceId = [{}]",
microservice.getServiceId(), RegistryUtils.getMicroserviceInstance().getInstanceId());
return true;
}
return false;
}
private MicroserviceInstance queryMicroserviceInstance() {
MicroserviceInstance serviceInstance = srClient.findServiceInstance(
microservice.getServiceId(),
RegistryUtils.getMicroserviceInstance().getInstanceId());
if (serviceInstance == null) {
LOGGER.warn("failed to find this instance in sc, waiting for instance registration");
}
return serviceInstance;
}
}