users@grizzly.java.net

Re: Multi-threaded client example using callbacks

From: Oleksiy Stashok <oleksiy.stashok_at_oracle.com>
Date: Wed, 11 Jun 2014 15:26:12 -0700

Unfortunately there's no pull requests in JIRA AFAIK.
Can you pls. create a java.net id and join the project, so I can give
you a developer permission?

Thank you.

WBR,
Alexey.

On 11.06.14 14:01, Johan Maasing wrote:
> Is there some system for pull requests on Kenai? I couldn't find a way
> to send you my proposal without pushing to master (which I ofc aren't
> allowed to do).
>
>
> 2014-06-11 3:44 GMT+02:00 Oleksiy Stashok <oleksiy.stashok_at_oracle.com
> <mailto:oleksiy.stashok_at_oracle.com>>:
>
> Thanks a lot Johan!
>
> We can keep this sample in our mailing list archive, or, if you
> have time, you can consider adding it to Grizzly documentation
> git://java.net/grizzly~site
>
> I was thinking about adding a cookbook chapter to our
> documentation with useful samples.
> You can find the folder src/site/markdown with the documentation
> *.md files (markdown format) and add one more chapter (for example
> cookbook.md <http://cookbook.md>).
>
> Thank you.
>
> WBR,
> Alexey.
>
>
>
> On 10.06.14 02:56, Johan Maasing wrote:
>> I'm learning Grizzly and with help from the mailing list I
>> finally got a little multi-threaded client running. Hope this
>> example seems like "best practice" and can be informative to others.
>>
>> public class CallbackClient {
>> private final static int NUMBER_OF_CLIENT_THREADS = 10;
>> private final CountDownLatch finishLatch = new
>> CountDownLatch(NUMBER_OF_CLIENT_THREADS);
>> private TCPNIOTransport transport;
>> private final Attribute<CallbackListener> listenerAttribute =
>> Grizzly.DEFAULT_ATTRIBUTE_BUILDER.createAttribute("listenerAttribute");
>>
>> public static void main(String... args) throws
>> InterruptedException, IOException {
>> CallbackClient app = new CallbackClient();
>> app.startup();
>> app.run();
>> }
>>
>> private void run() throws InterruptedException {
>> for (int n = 0; n < NUMBER_OF_CLIENT_THREADS; n++) {
>> final String listenerID = "Listener: " + n ;
>> final String message = "Hello from client: " + n + "\n";
>> Thread clientThread = new Thread(() -> {
>> final GrizzlyFuture<Connection>
>> connectionGrizzlyFuture = transport.connect("127.0.0.1", 5431);
>> try {
>> final Connection connection =
>> connectionGrizzlyFuture.get();
>> listenerAttribute.set(connection, (CallbackResult result) -> {
>> System.out.println(listenerID + " callback result: " +
>> result.message);
>> finishLatch.countDown();
>> });
>> connection.write(message);
>> } catch (InterruptedException |
>> ExecutionException e) {
>> e.printStackTrace();
>> }
>> }
>> );
>> clientThread.start();
>> }
>>
>> finishLatch.await();
>> }
>>
>> private void startup() throws IOException {
>>
>> FilterChainBuilder clientFilterChainBuilder =
>> FilterChainBuilder.stateless();
>> clientFilterChainBuilder.add(new TransportFilter());
>> clientFilterChainBuilder.add(new
>> StringFilter(Charset.defaultCharset(), "\n"));
>> clientFilterChainBuilder.add(new
>> CallbackFilter(listenerAttribute));
>> transport = TCPNIOTransportBuilder.newInstance().build();
>> transport.setProcessor(clientFilterChainBuilder.build());
>> transport.start();
>> }
>>
>> public static class CallbackFilter extends BaseFilter {
>> private final Attribute<CallbackListener> listenerAttribute;
>>
>> public CallbackFilter(Attribute<CallbackListener>
>> listenerAttribute) {
>> this.listenerAttribute = listenerAttribute;
>> }
>>
>> @Override
>> public NextAction handleRead(FilterChainContext ctx)
>> throws IOException {
>> final String message = ctx.getMessage();
>> final CallbackListener callbackListener =
>> listenerAttribute.get(ctx.getConnection());
>> callbackListener.callback(new CallbackResult(message));
>> return ctx.getStopAction();
>> }
>> }
>> }
>>
>>
>> Here is an "old-school" blocking IO server that can be used to
>> test the client.
>> public class EchoServer {
>> boolean keepRunning = true;
>>
>> public static void main(String[] args) throws Exception {
>> EchoServer app = new EchoServer();
>> app.run();
>> }
>>
>> private void run() throws IOException {
>> ServerSocket ss = new ServerSocket(5431);
>> while (keepRunning) {
>> final Socket socket = ss.accept();
>> System.out.println("Server accepted a connection");
>> Thread clientThread = new Thread(() -> {
>> try {
>> BufferedReader in = new BufferedReader(new
>> InputStreamReader(socket.getInputStream(), "UTF-8"));
>> final String clientMessage = in.readLine();
>> final String outMessage = "You said: " +
>> clientMessage + "\n";
>> System.out.print(outMessage);
>> OutputStream outs = socket.getOutputStream() ;
>> outs.write(outMessage.getBytes("UTF-8"));
>> outs.flush();
>> outs.close();
>> in.close();
>> socket.close();
>> } catch (IOException e) {
>> e.printStackTrace();
>> keepRunning = false;
>> }
>> });
>> clientThread.start();
>> }
>> }
>>
>> }
>>
>> Cheers,
>> Johan
>
>