/* * Copyright 2013 Netflix, Inc. * * 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.netflix.suro; import com.netflix.suro.message.Message; import com.netflix.suro.message.MessageSetReader; import com.netflix.suro.thrift.*; import org.apache.thrift.TException; import org.apache.thrift.server.THsHaServer; import org.apache.thrift.transport.TNonblockingServerSocket; import java.lang.reflect.Field; import java.net.ServerSocket; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicLong; public class SuroServer4Test implements SuroServer.Iface { private long uptime = System.currentTimeMillis(); private int port = 0; private THsHaServer server = null; private TNonblockingServerSocket transport = null; private SuroServer.Processor processor = null; private Map<String, AtomicLong> counters = new HashMap<String, AtomicLong>(); private List<TMessageSet> messageSetList = new LinkedList<TMessageSet>(); public SuroServer4Test() { counters.put("messageSetCount",new AtomicLong(0l)); counters.put("messageCount",new AtomicLong(0l)); } private boolean tryLater = false; public void setTryLater() { tryLater = true; } public void cancelTryLater() { tryLater = false; } private boolean holdConnection = false; public void setHoldConnection() { holdConnection = true; } public void cancelHoldConnection() { holdConnection = false; latch.countDown(); } public int getPort() { return port; } private CountDownLatch latch = new CountDownLatch(1); public Result process(TMessageSet messageSet) throws TException { Result result = new Result(); if (tryLater) { result.setResultCode(ResultCode.QUEUE_FULL); } else { if (!holdConnection) { handleMessages(messageSet, result); } else { try { latch.await(); handleMessages(messageSet, result); } catch (InterruptedException e) { e.printStackTrace(); } } } return result; } private void handleMessages(TMessageSet messageSet, Result result) { System.out.println(this + "=====================>>>>>>>>>>>>>>>>>>>> getting a new messageSet" + counters.get("messageSetCount").getAndIncrement()); // for (StackTraceElement e : Thread.currentThread().getStackTrace()) { // System.out.println(e); // } messageSetList.add(messageSet); int count = 0; for (Message m : new MessageSetReader(messageSet)) { counters.get("messageCount").incrementAndGet(); ++count; } System.out.println(this + "=====================>>>>>>>>>>>>>>>>>>>> getting a new messageSet: " + count); result.setMessage("my message"); result.setResultCode(ResultCode.OK); } public TMessageSet getMessageSet(int index) { return messageSetList.get(index); } public long getCounter(String key) throws TException { return counters.get(key).get(); } public String getName() throws TException { return "Test Server"; } public ServiceStatus getStatus() throws TException { return ServiceStatus.ALIVE; } public long getUptime() throws TException { return uptime; } public String getVersion() throws TException { return "Test Server - V0"; } public void start() throws Exception { transport = new TNonblockingServerSocket(port); processor = new SuroServer.Processor(this); THsHaServer.Args serverArgs = new THsHaServer.Args(transport); serverArgs.processor(processor); serverArgs.workerThreads(2); server = new THsHaServer(serverArgs); System.out.println("Server started on port:" + port); Thread t = new Thread() { @Override public void run() { server.serve(); } }; t.start(); Field serverSocketField = TNonblockingServerSocket.class.getDeclaredField("serverSocket_"); serverSocketField.setAccessible(true); ServerSocket serverSocket = (ServerSocket) serverSocketField.get(transport); port = serverSocket.getLocalPort(); } public long getMessageSetCount() { return counters.get("messageSetCount").get(); } public long getMessageCount() { return counters.get("messageCount").get(); } public long shutdown() { server.stop(); transport.close(); System.out.println("shutdown STC"); try {Thread.sleep(1000);} catch (Exception e) { e.printStackTrace(); } return 0; } }