package com.dgrid.service.impl; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.dgrid.gen.Constants; import com.dgrid.gen.HostState; import com.dgrid.gen.InvalidApiKey; import com.dgrid.gen.Joblet; import com.dgrid.gen.JobletResult; import com.dgrid.gen.SyncJobService; import com.dgrid.service.DGridSyncJobService; import com.facebook.thrift.TException; import com.facebook.thrift.protocol.TBinaryProtocol; import com.facebook.thrift.protocol.TProtocol; import com.facebook.thrift.transport.TSocket; import com.facebook.thrift.transport.TTransport; import com.facebook.thrift.transport.TTransportException; public class DGridSyncJobServiceImpl implements DGridSyncJobService { private Log log = LogFactory.getLog(getClass()); private String apiKey; public DGridSyncJobServiceImpl() { } public void setApiKey(String apiKey) { this.apiKey = apiKey; } /* * (non-Javadoc) * * @see com.dgrid.service.impl.DGridSyncJobService#gridExecute( * java.lang.String, com.dgrid.gen.Joblet) */ public JobletResult gridExecute(String hostname, Joblet joblet) throws InvalidApiKey, TException { log.trace("gridExecute()"); TConnection conn = null; try { conn = connect(hostname); JobletResult result = conn.service.execute(apiKey, joblet); return result; } finally { disconnect(conn); } } /* * (non-Javadoc) * * @see com.dgrid.service.impl.DGridSyncJobService#status(java.lang.String) */ public HostState status(String hostname) throws InvalidApiKey, TException { log.trace("status()"); TConnection conn = null; try { conn = connect(hostname); HostState state = conn.service.status(apiKey); return state; } finally { disconnect(conn); } } private TConnection connect(String hostname) throws TTransportException { log.trace("connect()"); if (log.isDebugEnabled()) { log.debug(String.format("Connecting to %1$s", hostname)); } TTransport transport = new TSocket(hostname, Constants.SYNC_DEFAULT_PORT); TProtocol protocol = new TBinaryProtocol(transport); SyncJobService.Iface syncJobService = new SyncJobService.Client( protocol); TConnection conn = new TConnection(transport, syncJobService); transport.open(); return conn; } private void disconnect(TConnection conn) { log.trace("disconnect()"); try { if (conn != null) conn.transport.close(); } catch (Exception e) { log.warn("Exception calling transport.close()", e); } } private static class TConnection { TTransport transport; SyncJobService.Iface service; TConnection(TTransport transport, SyncJobService.Iface service) { this.transport = transport; this.service = service; } } }