users@grizzly.java.net

Re: Multi-threaded client example using callbacks

From: Oleksiy Stashok <oleksiy.stashok_at_oracle.com>
Date: Thu, 12 Jun 2014 11:59:32 -0700

Done.

Thank you.

WBR,
Alexey.

On 12.06.14 00:36, Johan Maasing wrote:
> For sure: https://java.net/people/986467-jmaasing
> thanks a lot.
>
>
> 2014-06-12 0:26 GMT+02:00 Oleksiy Stashok <oleksiy.stashok_at_oracle.com
> <mailto:oleksiy.stashok_at_oracle.com>>:
>
> Unfortunately there's no pull requests in JIRA AFAIK.
> Can you pls. create a java.net <http://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
>>
>>
>
>