Package com.alibaba.otter.shared.arbitrate.impl.setl.zookeeper.monitor

Source Code of com.alibaba.otter.shared.arbitrate.impl.setl.zookeeper.monitor.TransformStageListener

/*
* Copyright (C) 2010-2101 Alibaba Group Holding Limited.
*
* 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.alibaba.otter.shared.arbitrate.impl.setl.zookeeper.monitor;

import java.util.List;

import org.I0Itec.zkclient.exception.ZkException;
import org.I0Itec.zkclient.exception.ZkNoNodeException;

import com.alibaba.otter.shared.arbitrate.impl.ArbitrateConstants;
import com.alibaba.otter.shared.arbitrate.impl.config.ArbitrateConfigUtils;
import com.alibaba.otter.shared.arbitrate.impl.setl.helper.StagePathUtils;
import com.alibaba.otter.shared.arbitrate.model.EtlEventData;
import com.alibaba.otter.shared.common.utils.JsonUtils;

/**
* 处理transofrm模块节点的监控
*
* <pre>
* 监控内容:
*  1. 某个process的stage节点发生变化后,判断extracted节点是否已经准备完成
* </pre>
*
* @author jianghang 2011-9-21 下午02:20:30
* @version 4.0.0
*/
public class TransformStageListener extends AbstractStageListener implements StageListener {

    private static final String currentNode = ArbitrateConstants.NODE_TRANSFORMED;
    private static final String prevNode    = ArbitrateConstants.NODE_EXTRACTED;

    public TransformStageListener(Long pipelineId){
        super(pipelineId);
    }

    public void processChanged(List<Long> processIds) {
        // do nothing
    }

    public void stageChannged(Long processId, List<String> stageNodes) {
        try {
            // 1. 根据pipelineId+processId构造对应的path
            String path = StagePathUtils.getProcess(getPipelineId(), processId);
            // 2.1 判断是否存在了error节点,end节点或者current节点
            if (stageNodes.contains(currentNode)) {
                if (replyProcessIds.remove(processId)) {
                    if (logger.isDebugEnabled()) {
                        logger.debug("## remove reply id [{}]", processId);
                    }
                }
                return;// 不需要监听了
            }

            if (replyProcessIds.contains(processId)) {
                return;// 避免重复处理
            }

            // 2.2 判断是否存在了prev节点
            if (stageNodes.contains(prevNode)) {
                // 2.2.1 获取上一个节点的next node节点信息
                byte[] data = zookeeper.readData(path + "/" + prevNode);
                EtlEventData eventData = JsonUtils.unmarshalFromByte(data, EtlEventData.class);
                if (eventData.getNextNid().equals(ArbitrateConfigUtils.getCurrentNid())) {
                    addReply(processId);// 添加到返回队列,唤醒wait阻塞
                }
            }
        } catch (ZkNoNodeException e) {
            // 出现节点不存在,说明出现了error情况
        } catch (ZkException e) {
            logger.error("TransformStageListener", e);
        }
    }

}
TOP

Related Classes of com.alibaba.otter.shared.arbitrate.impl.setl.zookeeper.monitor.TransformStageListener

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.