org.apache.airavata.gfac.impl.watcher.RedeliveryRequestWatcherImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.airavata.gfac.impl.watcher.RedeliveryRequestWatcherImpl.java

Source

/*
 *
 * 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.airavata.gfac.impl.watcher;

import org.apache.airavata.common.utils.ServerSettings;
import org.apache.airavata.gfac.core.context.ProcessContext;
import org.apache.airavata.gfac.core.watcher.RedeliveryRequestWatcher;
import org.apache.airavata.gfac.impl.Factory;
import org.apache.curator.framework.CuratorFramework;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.slf4j.Logger;

public class RedeliveryRequestWatcherImpl implements RedeliveryRequestWatcher {

    private static final Logger log = org.slf4j.LoggerFactory.getLogger(RedeliveryRequestWatcherImpl.class);
    private final String processId;
    private final String experimentId;

    public RedeliveryRequestWatcherImpl(String experimentId, String procesId) {
        this.experimentId = experimentId;
        this.processId = procesId;
    }

    @Override
    public void process(WatchedEvent watchedEvent) throws Exception {
        String path = watchedEvent.getPath();
        Watcher.Event.EventType eventType = watchedEvent.getType();
        log.info("Redelivery request came for zk path {} event type {} ", path, eventType.name());
        CuratorFramework curatorClient = Factory.getCuratorClient();
        switch (eventType) {
        case NodeDataChanged:
            byte[] bytes = curatorClient.getData().forPath(path);
            String serverName = new String(bytes);
            if (ServerSettings.getGFacServerName().trim().equals(serverName)) {
                curatorClient.getData().usingWatcher(this).forPath(path);
                log.info("processId: {},event type {}, change data with same server name : {}", processId,
                        eventType, serverName);
            } else {
                ProcessContext processContext = Factory.getGfacContext().getProcess(processId);
                if (processContext != null) {
                    processContext.setHandOver(true);
                    log.info("processId : {}, event type {}, handing over to new server instance : {}", processId,
                            eventType, serverName);
                } else {
                    log.info("Redelivery request came for processId {}, with event type {}, but couldn't find "
                            + "process context", processId, eventType.name());
                }
            }
            break;
        case NodeDeleted:
            //end of experiment execution, ignore this event
            log.info("Redelivery watcher trigger for process {} with event type {}", processId, eventType.name());
            break;
        case NodeCreated:
        case NodeChildrenChanged:
        case None:
            if (path != null) {
                curatorClient.getData().usingWatcher(this).forPath(path);
                log.info("Redelivery watcher trigger for process {} with event type {}", processId,
                        eventType.name());
            }
            break;
        // not yet implemented
        default:
            if (path != null) {
                curatorClient.getData().usingWatcher(this).forPath(path);
                log.info("Redelivery watcher trigger for process {} with event type {}", processId,
                        eventType.name());
            }
            break;
        }
    }
}