<HTML>
<BODY BGCOLOR="white">
<PRE>
<FONT color="green">001</FONT>    /*<a name="line.1"></a>
<FONT color="green">002</FONT>     * Licensed to the Apache Software Foundation (ASF) under one or more<a name="line.2"></a>
<FONT color="green">003</FONT>     * contributor license agreements. See the NOTICE file distributed with<a name="line.3"></a>
<FONT color="green">004</FONT>     * this work for additional information regarding copyright ownership.<a name="line.4"></a>
<FONT color="green">005</FONT>     * The ASF licenses this file to You under the Apache license, Version 2.0<a name="line.5"></a>
<FONT color="green">006</FONT>     * (the "License"); you may not use this file except in compliance with<a name="line.6"></a>
<FONT color="green">007</FONT>     * the License. You may obtain a copy of the License at<a name="line.7"></a>
<FONT color="green">008</FONT>     *<a name="line.8"></a>
<FONT color="green">009</FONT>     *      http://www.apache.org/licenses/LICENSE-2.0<a name="line.9"></a>
<FONT color="green">010</FONT>     *<a name="line.10"></a>
<FONT color="green">011</FONT>     * Unless required by applicable law or agreed to in writing, software<a name="line.11"></a>
<FONT color="green">012</FONT>     * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.12"></a>
<FONT color="green">013</FONT>     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.13"></a>
<FONT color="green">014</FONT>     * See the license for the specific language governing permissions and<a name="line.14"></a>
<FONT color="green">015</FONT>     * limitations under the license.<a name="line.15"></a>
<FONT color="green">016</FONT>     */<a name="line.16"></a>
<FONT color="green">017</FONT>    package org.apache.logging.log4j.flume.appender;<a name="line.17"></a>
<FONT color="green">018</FONT>    <a name="line.18"></a>
<FONT color="green">019</FONT>    import org.apache.avro.AvroRemoteException;<a name="line.19"></a>
<FONT color="green">020</FONT>    import org.apache.avro.ipc.NettyTransceiver;<a name="line.20"></a>
<FONT color="green">021</FONT>    import org.apache.avro.ipc.Transceiver;<a name="line.21"></a>
<FONT color="green">022</FONT>    import org.apache.avro.ipc.specific.SpecificRequestor;<a name="line.22"></a>
<FONT color="green">023</FONT>    import org.apache.flume.source.avro.AvroFlumeEvent;<a name="line.23"></a>
<FONT color="green">024</FONT>    import org.apache.flume.source.avro.AvroSourceProtocol;<a name="line.24"></a>
<FONT color="green">025</FONT>    import org.apache.flume.source.avro.Status;<a name="line.25"></a>
<FONT color="green">026</FONT>    import org.apache.logging.log4j.core.appender.AbstractManager;<a name="line.26"></a>
<FONT color="green">027</FONT>    import org.apache.logging.log4j.core.appender.AppenderRuntimeException;<a name="line.27"></a>
<FONT color="green">028</FONT>    import org.apache.logging.log4j.core.appender.ManagerFactory;<a name="line.28"></a>
<FONT color="green">029</FONT>    <a name="line.29"></a>
<FONT color="green">030</FONT>    import java.io.IOException;<a name="line.30"></a>
<FONT color="green">031</FONT>    import java.net.InetSocketAddress;<a name="line.31"></a>
<FONT color="green">032</FONT>    import java.nio.ByteBuffer;<a name="line.32"></a>
<FONT color="green">033</FONT>    import java.util.ArrayList;<a name="line.33"></a>
<FONT color="green">034</FONT>    import java.util.HashMap;<a name="line.34"></a>
<FONT color="green">035</FONT>    import java.util.List;<a name="line.35"></a>
<FONT color="green">036</FONT>    import java.util.Map;<a name="line.36"></a>
<FONT color="green">037</FONT>    <a name="line.37"></a>
<FONT color="green">038</FONT>    /**<a name="line.38"></a>
<FONT color="green">039</FONT>     * Manager for FlumeAvroAppenders.<a name="line.39"></a>
<FONT color="green">040</FONT>     */<a name="line.40"></a>
<FONT color="green">041</FONT>    public class FlumeAvroManager extends AbstractManager {<a name="line.41"></a>
<FONT color="green">042</FONT>    <a name="line.42"></a>
<FONT color="green">043</FONT>        /**<a name="line.43"></a>
<FONT color="green">044</FONT>          The default reconnection delay (500 milliseconds or .5 seconds).<a name="line.44"></a>
<FONT color="green">045</FONT>         */<a name="line.45"></a>
<FONT color="green">046</FONT>        public static final int DEFAULT_RECONNECTION_DELAY   = 500;<a name="line.46"></a>
<FONT color="green">047</FONT>    <a name="line.47"></a>
<FONT color="green">048</FONT>        private static final int DEFAULT_RECONNECTS = 3;<a name="line.48"></a>
<FONT color="green">049</FONT>    <a name="line.49"></a>
<FONT color="green">050</FONT>        private static ManagerFactory factory = new AvroManagerFactory();<a name="line.50"></a>
<FONT color="green">051</FONT>    <a name="line.51"></a>
<FONT color="green">052</FONT>        private AvroSourceProtocol client;<a name="line.52"></a>
<FONT color="green">053</FONT>    <a name="line.53"></a>
<FONT color="green">054</FONT>        private final Agent[] agents;<a name="line.54"></a>
<FONT color="green">055</FONT>    <a name="line.55"></a>
<FONT color="green">056</FONT>        private final int batchSize;<a name="line.56"></a>
<FONT color="green">057</FONT>    <a name="line.57"></a>
<FONT color="green">058</FONT>        private final EventList events = new EventList();<a name="line.58"></a>
<FONT color="green">059</FONT>    <a name="line.59"></a>
<FONT color="green">060</FONT>        private int current = 0;<a name="line.60"></a>
<FONT color="green">061</FONT>    <a name="line.61"></a>
<FONT color="green">062</FONT>        private Transceiver transceiver;<a name="line.62"></a>
<FONT color="green">063</FONT>    <a name="line.63"></a>
<FONT color="green">064</FONT>        /**<a name="line.64"></a>
<FONT color="green">065</FONT>         * Constructor<a name="line.65"></a>
<FONT color="green">066</FONT>         * @param name The unique name of this manager.<a name="line.66"></a>
<FONT color="green">067</FONT>         * @param agents An array of Agents.<a name="line.67"></a>
<FONT color="green">068</FONT>         * @param batchSize The number of evetns to include in a batch.<a name="line.68"></a>
<FONT color="green">069</FONT>         */<a name="line.69"></a>
<FONT color="green">070</FONT>        protected FlumeAvroManager(String name, Agent[] agents, int batchSize) {<a name="line.70"></a>
<FONT color="green">071</FONT>            super(name);<a name="line.71"></a>
<FONT color="green">072</FONT>            this.agents = agents;<a name="line.72"></a>
<FONT color="green">073</FONT>            this.batchSize = batchSize;<a name="line.73"></a>
<FONT color="green">074</FONT>            this.client = connect(agents);<a name="line.74"></a>
<FONT color="green">075</FONT>        }<a name="line.75"></a>
<FONT color="green">076</FONT>    <a name="line.76"></a>
<FONT color="green">077</FONT>        /**<a name="line.77"></a>
<FONT color="green">078</FONT>         * Return a FlumeAvroManager.<a name="line.78"></a>
<FONT color="green">079</FONT>         * @param agents The agents to use.<a name="line.79"></a>
<FONT color="green">080</FONT>         * @param batchSize The number of events to include in a batch.<a name="line.80"></a>
<FONT color="green">081</FONT>         * @return A FlumeAvroManager.<a name="line.81"></a>
<FONT color="green">082</FONT>         */<a name="line.82"></a>
<FONT color="green">083</FONT>        public static FlumeAvroManager getManager(Agent[] agents, int batchSize) {<a name="line.83"></a>
<FONT color="green">084</FONT>            if (agents == null || agents.length == 0) {<a name="line.84"></a>
<FONT color="green">085</FONT>                throw new IllegalArgumentException("At least one agent is required");<a name="line.85"></a>
<FONT color="green">086</FONT>            }<a name="line.86"></a>
<FONT color="green">087</FONT>    <a name="line.87"></a>
<FONT color="green">088</FONT>            if (batchSize &lt;= 0) {<a name="line.88"></a>
<FONT color="green">089</FONT>                batchSize = 1;<a name="line.89"></a>
<FONT color="green">090</FONT>            }<a name="line.90"></a>
<FONT color="green">091</FONT>    <a name="line.91"></a>
<FONT color="green">092</FONT>            StringBuilder sb = new StringBuilder("FlumeAvro[");<a name="line.92"></a>
<FONT color="green">093</FONT>            boolean first = true;<a name="line.93"></a>
<FONT color="green">094</FONT>            for (Agent agent : agents) {<a name="line.94"></a>
<FONT color="green">095</FONT>                if (!first) {<a name="line.95"></a>
<FONT color="green">096</FONT>                    sb.append(",");<a name="line.96"></a>
<FONT color="green">097</FONT>                }<a name="line.97"></a>
<FONT color="green">098</FONT>                sb.append(agent.getHost()).append(":").append(agent.getPort());<a name="line.98"></a>
<FONT color="green">099</FONT>                first = false;<a name="line.99"></a>
<FONT color="green">100</FONT>            }<a name="line.100"></a>
<FONT color="green">101</FONT>            sb.append("]");<a name="line.101"></a>
<FONT color="green">102</FONT>            return (FlumeAvroManager) getManager(sb.toString(), factory, new FactoryData(agents, batchSize));<a name="line.102"></a>
<FONT color="green">103</FONT>        }<a name="line.103"></a>
<FONT color="green">104</FONT>    <a name="line.104"></a>
<FONT color="green">105</FONT>        /**<a name="line.105"></a>
<FONT color="green">106</FONT>         * Return the agents.<a name="line.106"></a>
<FONT color="green">107</FONT>         * @return The agent array.<a name="line.107"></a>
<FONT color="green">108</FONT>         */<a name="line.108"></a>
<FONT color="green">109</FONT>        public Agent[] getAgents() {<a name="line.109"></a>
<FONT color="green">110</FONT>            return agents;<a name="line.110"></a>
<FONT color="green">111</FONT>        }<a name="line.111"></a>
<FONT color="green">112</FONT>    <a name="line.112"></a>
<FONT color="green">113</FONT>        /**<a name="line.113"></a>
<FONT color="green">114</FONT>         * Returns the index of the current agent.<a name="line.114"></a>
<FONT color="green">115</FONT>         * @return The index for the current agent.<a name="line.115"></a>
<FONT color="green">116</FONT>         */<a name="line.116"></a>
<FONT color="green">117</FONT>        public int getCurrent() {<a name="line.117"></a>
<FONT color="green">118</FONT>            return current;<a name="line.118"></a>
<FONT color="green">119</FONT>        }<a name="line.119"></a>
<FONT color="green">120</FONT>    <a name="line.120"></a>
<FONT color="green">121</FONT>        protected synchronized void send(FlumeEvent event, int delay, int retries)  {<a name="line.121"></a>
<FONT color="green">122</FONT>            if (delay == 0) {<a name="line.122"></a>
<FONT color="green">123</FONT>                delay = DEFAULT_RECONNECTION_DELAY;<a name="line.123"></a>
<FONT color="green">124</FONT>            }<a name="line.124"></a>
<FONT color="green">125</FONT>            if (retries == 0) {<a name="line.125"></a>
<FONT color="green">126</FONT>                retries = DEFAULT_RECONNECTS;<a name="line.126"></a>
<FONT color="green">127</FONT>            }<a name="line.127"></a>
<FONT color="green">128</FONT>            AvroFlumeEvent avroEvent = new AvroFlumeEvent();<a name="line.128"></a>
<FONT color="green">129</FONT>            avroEvent.body = ByteBuffer.wrap(event.getBody());<a name="line.129"></a>
<FONT color="green">130</FONT>            avroEvent.headers = new HashMap&lt;CharSequence, CharSequence&gt;();<a name="line.130"></a>
<FONT color="green">131</FONT>    <a name="line.131"></a>
<FONT color="green">132</FONT>            for (Map.Entry&lt;String, String&gt; entry : event.getHeaders().entrySet()) {<a name="line.132"></a>
<FONT color="green">133</FONT>              avroEvent.headers.put(entry.getKey(), entry.getValue());<a name="line.133"></a>
<FONT color="green">134</FONT>            }<a name="line.134"></a>
<FONT color="green">135</FONT>    <a name="line.135"></a>
<FONT color="green">136</FONT>            List&lt;AvroFlumeEvent&gt; batch = batchSize &gt; 1 ? events.addAndGet(avroEvent, batchSize) : null;<a name="line.136"></a>
<FONT color="green">137</FONT>            if (batch == null &amp;&amp; batchSize &gt; 1) {<a name="line.137"></a>
<FONT color="green">138</FONT>                return;<a name="line.138"></a>
<FONT color="green">139</FONT>            }<a name="line.139"></a>
<FONT color="green">140</FONT>    <a name="line.140"></a>
<FONT color="green">141</FONT>            int i = 0;<a name="line.141"></a>
<FONT color="green">142</FONT>    <a name="line.142"></a>
<FONT color="green">143</FONT>            String msg = "Error writing to " + getName();<a name="line.143"></a>
<FONT color="green">144</FONT>    <a name="line.144"></a>
<FONT color="green">145</FONT>            do {<a name="line.145"></a>
<FONT color="green">146</FONT>                try {<a name="line.146"></a>
<FONT color="green">147</FONT>                    Status status = (batch == null) ? client.append(avroEvent) : client.appendBatch(batch);<a name="line.147"></a>
<FONT color="green">148</FONT>                    if (!status.equals(Status.OK)) {<a name="line.148"></a>
<FONT color="green">149</FONT>                        throw new AvroRemoteException("RPC communication failed to " + agents[current].getHost() +<a name="line.149"></a>
<FONT color="green">150</FONT>                            ":" + agents[current].getPort());<a name="line.150"></a>
<FONT color="green">151</FONT>                    }<a name="line.151"></a>
<FONT color="green">152</FONT>                    return;<a name="line.152"></a>
<FONT color="green">153</FONT>                } catch (Exception ex) {<a name="line.153"></a>
<FONT color="green">154</FONT>                    if (i == retries - 1) {<a name="line.154"></a>
<FONT color="green">155</FONT>                        msg = "Error writing to " + getName() + " at " + agents[current].getHost() + ":" +<a name="line.155"></a>
<FONT color="green">156</FONT>                            agents[current].getPort();<a name="line.156"></a>
<FONT color="green">157</FONT>                        LOGGER.warn(msg, ex);<a name="line.157"></a>
<FONT color="green">158</FONT>                        break;<a name="line.158"></a>
<FONT color="green">159</FONT>                    }<a name="line.159"></a>
<FONT color="green">160</FONT>                    sleep(delay);<a name="line.160"></a>
<FONT color="green">161</FONT>                }<a name="line.161"></a>
<FONT color="green">162</FONT>            } while (++i &lt; retries);<a name="line.162"></a>
<FONT color="green">163</FONT>    <a name="line.163"></a>
<FONT color="green">164</FONT>            for (int index = 0; index &lt; agents.length; ++index) {<a name="line.164"></a>
<FONT color="green">165</FONT>                if (index == current) {<a name="line.165"></a>
<FONT color="green">166</FONT>                    continue;<a name="line.166"></a>
<FONT color="green">167</FONT>                }<a name="line.167"></a>
<FONT color="green">168</FONT>                Agent agent = agents[index];<a name="line.168"></a>
<FONT color="green">169</FONT>                i = 0;<a name="line.169"></a>
<FONT color="green">170</FONT>                do {<a name="line.170"></a>
<FONT color="green">171</FONT>                    try {<a name="line.171"></a>
<FONT color="green">172</FONT>                        transceiver = null;<a name="line.172"></a>
<FONT color="green">173</FONT>                        AvroSourceProtocol c = connect(agent.getHost(), agent.getPort());<a name="line.173"></a>
<FONT color="green">174</FONT>                        Status status = (batch == null) ? c.append(avroEvent) : c.appendBatch(batch);<a name="line.174"></a>
<FONT color="green">175</FONT>                        if (!status.equals(Status.OK)) {<a name="line.175"></a>
<FONT color="green">176</FONT>                            if (i == retries - 1) {<a name="line.176"></a>
<FONT color="green">177</FONT>                                String warnMsg = "RPC communication failed to " + getName() + " at " +<a name="line.177"></a>
<FONT color="green">178</FONT>                                    agent.getHost() + ":" + agent.getPort();<a name="line.178"></a>
<FONT color="green">179</FONT>                                LOGGER.warn(warnMsg);<a name="line.179"></a>
<FONT color="green">180</FONT>                            }<a name="line.180"></a>
<FONT color="green">181</FONT>                            continue;<a name="line.181"></a>
<FONT color="green">182</FONT>                        }<a name="line.182"></a>
<FONT color="green">183</FONT>                        client = c;<a name="line.183"></a>
<FONT color="green">184</FONT>                        current = i;<a name="line.184"></a>
<FONT color="green">185</FONT>                        return;<a name="line.185"></a>
<FONT color="green">186</FONT>                    } catch (Exception ex) {<a name="line.186"></a>
<FONT color="green">187</FONT>                        if (i == retries - 1) {<a name="line.187"></a>
<FONT color="green">188</FONT>                            String warnMsg = "Error writing to " + getName() + " at " + agent.getHost() + ":" +<a name="line.188"></a>
<FONT color="green">189</FONT>                                agent.getPort();<a name="line.189"></a>
<FONT color="green">190</FONT>                            LOGGER.warn(warnMsg, ex);<a name="line.190"></a>
<FONT color="green">191</FONT>                            break;<a name="line.191"></a>
<FONT color="green">192</FONT>                        }<a name="line.192"></a>
<FONT color="green">193</FONT>                        sleep(delay);<a name="line.193"></a>
<FONT color="green">194</FONT>                    }<a name="line.194"></a>
<FONT color="green">195</FONT>                } while (++i &lt; retries);<a name="line.195"></a>
<FONT color="green">196</FONT>            }<a name="line.196"></a>
<FONT color="green">197</FONT>    <a name="line.197"></a>
<FONT color="green">198</FONT>            throw new AppenderRuntimeException(msg);<a name="line.198"></a>
<FONT color="green">199</FONT>    <a name="line.199"></a>
<FONT color="green">200</FONT>        }<a name="line.200"></a>
<FONT color="green">201</FONT>    <a name="line.201"></a>
<FONT color="green">202</FONT>        private void sleep(int delay) {<a name="line.202"></a>
<FONT color="green">203</FONT>            try {<a name="line.203"></a>
<FONT color="green">204</FONT>                Thread.sleep(delay);<a name="line.204"></a>
<FONT color="green">205</FONT>            } catch (InterruptedException ex) {<a name="line.205"></a>
<FONT color="green">206</FONT>                Thread.currentThread().interrupt();<a name="line.206"></a>
<FONT color="green">207</FONT>            }<a name="line.207"></a>
<FONT color="green">208</FONT>        }<a name="line.208"></a>
<FONT color="green">209</FONT>    <a name="line.209"></a>
<FONT color="green">210</FONT>        /**<a name="line.210"></a>
<FONT color="green">211</FONT>         * There is a very good chance that this will always return the first agent even if it isn't available.<a name="line.211"></a>
<FONT color="green">212</FONT>         * @param agents The list of agents to choose from<a name="line.212"></a>
<FONT color="green">213</FONT>         * @return The FlumeEventAvroServer.<a name="line.213"></a>
<FONT color="green">214</FONT>         */<a name="line.214"></a>
<FONT color="green">215</FONT>        private AvroSourceProtocol connect(Agent[] agents) {<a name="line.215"></a>
<FONT color="green">216</FONT>            int i = 0;<a name="line.216"></a>
<FONT color="green">217</FONT>            for (Agent agent : agents) {<a name="line.217"></a>
<FONT color="green">218</FONT>                AvroSourceProtocol server = connect(agent.getHost(), agent.getPort());<a name="line.218"></a>
<FONT color="green">219</FONT>                if (server != null) {<a name="line.219"></a>
<FONT color="green">220</FONT>                    current = i;<a name="line.220"></a>
<FONT color="green">221</FONT>                    return server;<a name="line.221"></a>
<FONT color="green">222</FONT>                }<a name="line.222"></a>
<FONT color="green">223</FONT>                ++i;<a name="line.223"></a>
<FONT color="green">224</FONT>            }<a name="line.224"></a>
<FONT color="green">225</FONT>            throw new AppenderRuntimeException("Unable to connect to any agents");<a name="line.225"></a>
<FONT color="green">226</FONT>        }<a name="line.226"></a>
<FONT color="green">227</FONT>    <a name="line.227"></a>
<FONT color="green">228</FONT>        private AvroSourceProtocol connect(String hostname, int port) {<a name="line.228"></a>
<FONT color="green">229</FONT>            try {<a name="line.229"></a>
<FONT color="green">230</FONT>                if (transceiver == null) {<a name="line.230"></a>
<FONT color="green">231</FONT>                    transceiver = new NettyTransceiver(new InetSocketAddress(hostname, port));<a name="line.231"></a>
<FONT color="green">232</FONT>                }<a name="line.232"></a>
<FONT color="green">233</FONT>            } catch (IOException ioe) {<a name="line.233"></a>
<FONT color="green">234</FONT>                LOGGER.error("Unable to create transceiver", ioe);<a name="line.234"></a>
<FONT color="green">235</FONT>                return null;<a name="line.235"></a>
<FONT color="green">236</FONT>            }<a name="line.236"></a>
<FONT color="green">237</FONT>            try {<a name="line.237"></a>
<FONT color="green">238</FONT>                return SpecificRequestor.getClient(AvroSourceProtocol.class, transceiver);<a name="line.238"></a>
<FONT color="green">239</FONT>            } catch (IOException ioe) {<a name="line.239"></a>
<FONT color="green">240</FONT>                LOGGER.error("Unable to create Avro client");<a name="line.240"></a>
<FONT color="green">241</FONT>                return null;<a name="line.241"></a>
<FONT color="green">242</FONT>            }<a name="line.242"></a>
<FONT color="green">243</FONT>        }<a name="line.243"></a>
<FONT color="green">244</FONT>    <a name="line.244"></a>
<FONT color="green">245</FONT>        @Override<a name="line.245"></a>
<FONT color="green">246</FONT>        protected void releaseSub() {<a name="line.246"></a>
<FONT color="green">247</FONT>            if (transceiver != null) {<a name="line.247"></a>
<FONT color="green">248</FONT>                try {<a name="line.248"></a>
<FONT color="green">249</FONT>                    transceiver.close();<a name="line.249"></a>
<FONT color="green">250</FONT>                } catch (IOException ioe) {<a name="line.250"></a>
<FONT color="green">251</FONT>                    LOGGER.error("Attempt to clean up Avro transceiver failed", ioe);<a name="line.251"></a>
<FONT color="green">252</FONT>                }<a name="line.252"></a>
<FONT color="green">253</FONT>            }<a name="line.253"></a>
<FONT color="green">254</FONT>            client = null;<a name="line.254"></a>
<FONT color="green">255</FONT>        }<a name="line.255"></a>
<FONT color="green">256</FONT>    <a name="line.256"></a>
<FONT color="green">257</FONT>        /**<a name="line.257"></a>
<FONT color="green">258</FONT>         * Thread-safe List management of a batch.<a name="line.258"></a>
<FONT color="green">259</FONT>         */<a name="line.259"></a>
<FONT color="green">260</FONT>        private static class EventList extends ArrayList&lt;AvroFlumeEvent&gt; {<a name="line.260"></a>
<FONT color="green">261</FONT>    <a name="line.261"></a>
<FONT color="green">262</FONT>            public synchronized List&lt;AvroFlumeEvent&gt; addAndGet(AvroFlumeEvent event, int batchSize) {<a name="line.262"></a>
<FONT color="green">263</FONT>                super.add(event);<a name="line.263"></a>
<FONT color="green">264</FONT>                if (this.size() &gt;= batchSize) {<a name="line.264"></a>
<FONT color="green">265</FONT>                    List&lt;AvroFlumeEvent&gt; events = new ArrayList&lt;AvroFlumeEvent&gt;();<a name="line.265"></a>
<FONT color="green">266</FONT>                    events.addAll(this);<a name="line.266"></a>
<FONT color="green">267</FONT>                    clear();<a name="line.267"></a>
<FONT color="green">268</FONT>                    return events;<a name="line.268"></a>
<FONT color="green">269</FONT>                } else {<a name="line.269"></a>
<FONT color="green">270</FONT>                    return null;<a name="line.270"></a>
<FONT color="green">271</FONT>                }<a name="line.271"></a>
<FONT color="green">272</FONT>            }<a name="line.272"></a>
<FONT color="green">273</FONT>        }<a name="line.273"></a>
<FONT color="green">274</FONT>    <a name="line.274"></a>
<FONT color="green">275</FONT>        /**<a name="line.275"></a>
<FONT color="green">276</FONT>         * Factory data.<a name="line.276"></a>
<FONT color="green">277</FONT>         */<a name="line.277"></a>
<FONT color="green">278</FONT>        private static class FactoryData {<a name="line.278"></a>
<FONT color="green">279</FONT>            private Agent[] agents;<a name="line.279"></a>
<FONT color="green">280</FONT>            private int batchSize;<a name="line.280"></a>
<FONT color="green">281</FONT>    <a name="line.281"></a>
<FONT color="green">282</FONT>            /**<a name="line.282"></a>
<FONT color="green">283</FONT>             * Constructor.<a name="line.283"></a>
<FONT color="green">284</FONT>             * @param agents The agents.<a name="line.284"></a>
<FONT color="green">285</FONT>             * @param batchSize The number of events to include in a batch.<a name="line.285"></a>
<FONT color="green">286</FONT>             */<a name="line.286"></a>
<FONT color="green">287</FONT>            public FactoryData(Agent[] agents, int batchSize) {<a name="line.287"></a>
<FONT color="green">288</FONT>                this.agents = agents;<a name="line.288"></a>
<FONT color="green">289</FONT>                this.batchSize = batchSize;<a name="line.289"></a>
<FONT color="green">290</FONT>            }<a name="line.290"></a>
<FONT color="green">291</FONT>        }<a name="line.291"></a>
<FONT color="green">292</FONT>    <a name="line.292"></a>
<FONT color="green">293</FONT>        /**<a name="line.293"></a>
<FONT color="green">294</FONT>         * Avro Manager Factory.<a name="line.294"></a>
<FONT color="green">295</FONT>         */<a name="line.295"></a>
<FONT color="green">296</FONT>        private static class AvroManagerFactory implements ManagerFactory&lt;FlumeAvroManager, FactoryData&gt; {<a name="line.296"></a>
<FONT color="green">297</FONT>    <a name="line.297"></a>
<FONT color="green">298</FONT>            /**<a name="line.298"></a>
<FONT color="green">299</FONT>             * Create the FlumeAvroManager.<a name="line.299"></a>
<FONT color="green">300</FONT>             * @param name The name of the entity to manage.<a name="line.300"></a>
<FONT color="green">301</FONT>             * @param data The data required to create the entity.<a name="line.301"></a>
<FONT color="green">302</FONT>             * @return The FlumeAvroManager.<a name="line.302"></a>
<FONT color="green">303</FONT>             */<a name="line.303"></a>
<FONT color="green">304</FONT>            public FlumeAvroManager createManager(String name, FactoryData data) {<a name="line.304"></a>
<FONT color="green">305</FONT>                try {<a name="line.305"></a>
<FONT color="green">306</FONT>    <a name="line.306"></a>
<FONT color="green">307</FONT>                    return new FlumeAvroManager(name, data.agents, data.batchSize);<a name="line.307"></a>
<FONT color="green">308</FONT>                } catch (Exception ex) {<a name="line.308"></a>
<FONT color="green">309</FONT>                    LOGGER.error("Could not create FlumeAvroManager", ex);<a name="line.309"></a>
<FONT color="green">310</FONT>                }<a name="line.310"></a>
<FONT color="green">311</FONT>                return null;<a name="line.311"></a>
<FONT color="green">312</FONT>            }<a name="line.312"></a>
<FONT color="green">313</FONT>        }<a name="line.313"></a>
<FONT color="green">314</FONT>    <a name="line.314"></a>
<FONT color="green">315</FONT>    }<a name="line.315"></a>




























































</PRE>
</BODY>
</HTML>
