package com.taobao.zeus.broadcast.notify; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.Watcher.Event.KeeperState; import org.apache.zookeeper.ZooDefs.Ids; import org.apache.zookeeper.ZooKeeper; import com.taobao.zeus.model.JobHistory; import com.taobao.zeus.util.Environment; public class ZKResultNotify extends AbstractJobResultNotify{ private static String host; @Override public void send(String historyId,String data) throws Exception { if(host==null || "".equals(host.trim())){ return; } JobHistory history=jobHistoryManager.findJobHistory(historyId); String jobId=history.getJobId(); String path="/zeus/jobs/"+jobId; send(host,path,data); } public void setHost(String host){ this.host=host; } public void send(String host,String path,String data) throws Exception{ init(); ZooKeeper zk=null; try { CountDownLatch latch=new CountDownLatch(1); zk=new ZooKeeper(host, 5*1000, new BlankWatcher(latch)); if(!latch.await(10,TimeUnit.SECONDS)){ throw new Exception("Connecting to zk host["+host+"] timeout!"); } ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); if (data != null) { if (data.equalsIgnoreCase("false") || data.equalsIgnoreCase("true")) { dos.writeBoolean(Boolean.valueOf(data)); } else { dos.writeBytes(data); } } dos.flush(); dos.flush(); if (zk.exists(path, false) != null) { zk.setData(path, baos.toByteArray(), -1); } else { zk.create(path, baos.toByteArray(), Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT); } } finally{ if(zk!=null){ zk.close(); } } } public static class BlankWatcher implements Watcher{ private CountDownLatch latch; public BlankWatcher(CountDownLatch latch){ this.latch=latch; } @Override public void process(WatchedEvent event) { if(event.getState()==KeeperState.SyncConnected){ latch.countDown(); } } } private static AtomicBoolean initd=new AtomicBoolean(false); private static void init() throws Exception{ if(initd.compareAndSet(false, true)){ if(host==null || "".equals(host.trim())){ return ; } ZooKeeper zk=null; try { CountDownLatch latch=new CountDownLatch(1); zk=new ZooKeeper(host, 5*1000, new BlankWatcher(latch)); latch.await(); if (zk.exists("/zeus", false) == null){ zk.create("/zeus", null, Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT); } if(zk.exists("/zeus/jobs", false)==null){ zk.create("/zeus/jobs", null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); } } finally{ if(zk!=null){ zk.close(); } } } } }