Hi Matt,
I do this with some frequency. The trick is to use Jetty manually to
create an appropriate jetty.Server, and then start it. The snippets below
should help.
-- Philip
import javax.servlet.Servlet;
import org.apache.avro.ipc.ResponderServlet;
import org.apache.avro.ipc.specific.SpecificResponder;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.servlet.Context;
import org.mortbay.jetty.servlet.ServletHolder;
import org.mortbay.thread.QueuedThreadPool;
public static Server createAvroServer(int port, String name, int
maxThreads,
int maxIdleTimeMs,
SpecificResponder responder)
throws EnterpriseServiceException {
try {
Server httpServer = new Server(port);
QueuedThreadPool qtp = new QueuedThreadPool();
// QueuedThreadPool is jetty's thread pool implementation;
// this lets us give it a name.
qtp.setName(name);
qtp.setDaemon(true);
qtp.setMaxThreads(maxThreads);
qtp.setMaxIdleTimeMs(maxIdleTimeMs);
httpServer.setThreadPool(qtp);
Servlet servlet = new ResponderServlet(responder);
new Context(httpServer, "/").addServlet(new ServletHolder(servlet),
"/*");
return httpServer;
} catch (Exception e) {
throw new EnterpriseServiceException(e);
}
}
// main:
SpecificResponder responder = new SpecificResponder(
XXX.class,
new XXXImpl());
server = createAvroServer(listenPort, "somename",
maxThreads, maxIdleTimeMs, responder);
server.start();
On Wed, Jan 30, 2013 at 6:38 PM, Matt Corgan <[email protected]> wrote:
> hmm - i haven't heard any suggestions in the past few days... maybe a
> really short version of the question: Can an Avro-rpc Netty server process
> requests in parallel? Will it still process in parallel if they're from
> the same client?
>
> Thanks much,
> Matt
>
>
> On Sun, Jan 27, 2013 at 4:16 PM, Matt Corgan <[email protected]> wrote:
>
>> Hi,
>> I'm trying to familiarize myself with avro-rpc by running and tweaking
>> the example at https://github.com/jbaldassari/Avro-RPC. By the way,
>> thanks for creating this example James.
>>
>> I'm using the BidderTest.sendBidRequestWithCallback method and am trying
>> to get the server to process the requests in parallel, which is something
>> i'll need in my application. I use the DelayInjectingBidder with delay of
>> 90ms so i can watch what's happening on the server. By debugging the
>> client, I see that all requests do in fact make it to the server without
>> blocking, but watching the server log i see that each request is processed
>> sequentially. So it takes ~9s to process 100 messages.
>>
>> Digging into the NettyServer constructor, I see the default
>> ChannelFactory uses Executors.newCachedThreadPool() for the Boss and Worker
>> executors. I tried overriding the worker with
>> Executors.newFixedThreadPool(8) but didn't notice any difference. Looking
>> at the threads running in Eclipse Debug mode, i see the following threads
>> which confirms that there is only one worker:
>>
>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner at localhost:50255
>> Thread [main] (Running)
>> Thread [ReaderThread] (Running)
>> Thread [New I/O server boss #2 ([id: 0x6a5dd151,
>> /0:0:0:0:0:0:0:0:45633])] (Running)
>> Thread [Avro NettyTransceiver Boss 1] (Running)
>> Thread [New I/O server worker #2-1] (Running)
>> Thread [New I/O client worker #1-1] (Running)
>>
>> I also see that the NettyTransceiver has configurable thread pools, but
>> I'm not clear on what the Transceiver's role is (client side thing?), and
>> fiddling with its ChannelFactory is causing exceptions.
>>
>> Is is possible that the behavior of the BidderTest client doesn't trigger
>> the multi-threaded server even though it's configured correctly, or that
>> the server processes all requests from a single client sequentially?
>>
>> Sidenote: i also tried using avro version 1.7.3 with the same results,
>> although the above thread pools had different names.
>>
>> I wonder if someone could shed some light on what the difference is
>> between the Server and Transceiver thread pools and how to configure them
>> for multi-threaded server processing.
>>
>> Thanks,
>> Matt
>>
>>
>