You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@thrift.apache.org by "Matthias Einwag (JIRA)" <ji...@apache.org> on 2011/06/28 17:31:16 UTC

[jira] [Created] (THRIFT-1223) AS3 extension - Socket IO, asnychronous calls, callbacks

AS3 extension - Socket IO, asnychronous calls, callbacks
--------------------------------------------------------

                 Key: THRIFT-1223
                 URL: https://issues.apache.org/jira/browse/THRIFT-1223
             Project: Thrift
          Issue Type: New Feature
          Components: AS3 - Compiler, AS3 - Library
            Reporter: Matthias Einwag


Hi everyone,

first of all I'm new to Thrift and JIRA, so I hope I can get this right. 
I will try to attach my modified version of the AS3 generator and the AS3 libs.

I did some work on the AS3 implementation of thrift to get TCP/IP socket support. This includes a new transport TSocket.
Because actionscript supports only non-blocking IO you must use TFramedTransport, which is also added and wraps around TSocket.
Some example code to create a framed transport:
private var socket:Socket;
private var transport:TIOStreamTransport;
private var framedTransport:TFramedTransport;

socket = new Socket("127.0.0.1",9090);
transport = new TSocket(socket);
transport.open();
framedTransport = new TFramedTransport(transport);



As I did not like the current asynchronous implementation of Thrift/AS3, I did some further changes:
- For each service function a send function and a receive function is generated
- The send function sends the data over the transport and creates an AsyncResult object (similar to the Deferred in the Py-Twisted implementation), which stores error and success callback functions as well as the corresponding receive function. I would also like to add a timeout timer later to this.
- I now use a processor object for clients and servers. The processor registers at the transport and is notified when a new Frame was received. Then process() is called which decodes one message. The processor has a dictionary that contains the sent requests (TAsyncResult objects). If a response message is requested the processor calls the recveive function for the request, which will then lead to a success or error call. This is not similar to the Java and Py-Twisted implementation where the sequence id and dictionary is stored in the client. But I find it more useful because I can support callbacks (see later).
- The generic implementation TProcessor can be used to support client only functionality.
Example:
protocol = new TBinaryProtocol(framedTransport);
processor = new TProcessor(protocol);	
client = new ServiceClient(processor);
TAsyncResult ar = client.send_doSomething(successHandler,errorHandler);

- Derived processors are used for server side functionality and callbacks
Example:
service = new ServiceProcessor(theComponentThatImplementsTheServiceInterface,protocol);
Now this type of processor can be used to send requests (creating a client as seen above) and meanwhile will also process incoming requests for the specified service.
I need to use this for callbacks (events that are sent spontaneously from the server to the actionscript client)

Missing:
- Improved error handling. At the moment the as3 client does not detect if the server disconnect, only if it sends a request.
- "Real" server side functionality. Would need a serversocket that creates a new serviceProcessor for each client that connects.
- The older HTTP transports are currently not compatible. They have to be changed to the new processor usage and must send a TMessageReceivedEvent to the processor. Maybe some minor changes I could add, but I have no time to test HTTP.

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

[jira] [Updated] (THRIFT-1223) AS3 extension - Socket IO, asnychronous calls, callbacks

Posted by "Matthias Einwag (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/THRIFT-1223?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Matthias Einwag updated THRIFT-1223:
------------------------------------

    Attachment: as3library.zip

No comments up to now on this?

I further improved the library a little bit. Added some documentation and error handling. Now an event is sent by the transport in case of an error or client disconnect. In this case also all pending requests are notified as failed to the applications.

I also tried to make THttpClient compatible with the new architecture. However did not test it. Anybody interested? 
One drawback I still see here: If one HTTP request fails *all* pending requests using this transport are reported as failed.
Apart from that TFullDuplexHttpClient is still incompatible.

> AS3 extension - Socket IO, asnychronous calls, callbacks
> --------------------------------------------------------
>
>                 Key: THRIFT-1223
>                 URL: https://issues.apache.org/jira/browse/THRIFT-1223
>             Project: Thrift
>          Issue Type: New Feature
>          Components: AS3 - Compiler, AS3 - Library
>            Reporter: Matthias Einwag
>              Labels: AS3, Async, Compiler, Library
>         Attachments: as3library.zip, as3library.zip, t_as3_generator.cc, thrift.zip
>
>
> Hi everyone,
> first of all I'm new to Thrift and JIRA, so I hope I can get this right. 
> I will try to attach my modified version of the AS3 generator and the AS3 libs.
> I did some work on the AS3 implementation of thrift to get TCP/IP socket support. This includes a new transport TSocket.
> Because actionscript supports only non-blocking IO you must use TFramedTransport, which is also added and wraps around TSocket.
> Some example code to create a framed transport:
> private var socket:Socket;
> private var transport:TIOStreamTransport;
> private var framedTransport:TFramedTransport;
> socket = new Socket("127.0.0.1",9090);
> transport = new TSocket(socket);
> transport.open();
> framedTransport = new TFramedTransport(transport);
> As I did not like the current asynchronous implementation of Thrift/AS3, I did some further changes:
> - For each service function a send function and a receive function is generated
> - The send function sends the data over the transport and creates an AsyncResult object (similar to the Deferred in the Py-Twisted implementation), which stores error and success callback functions as well as the corresponding receive function. I would also like to add a timeout timer later to this.
> - I now use a processor object for clients and servers. The processor registers at the transport and is notified when a new Frame was received. Then process() is called which decodes one message. The processor has a dictionary that contains the sent requests (TAsyncResult objects). If a response message is requested the processor calls the recveive function for the request, which will then lead to a success or error call. This is not similar to the Java and Py-Twisted implementation where the sequence id and dictionary is stored in the client. But I find it more useful because I can support callbacks (see later).
> - The generic implementation TProcessor can be used to support client only functionality.
> Example:
> protocol = new TBinaryProtocol(framedTransport);
> processor = new TProcessor(protocol);	
> client = new ServiceClient(processor);
> TAsyncResult ar = client.send_doSomething(successHandler,errorHandler);
> - Derived processors are used for server side functionality and callbacks
> Example:
> service = new ServiceProcessor(theComponentThatImplementsTheServiceInterface,protocol);
> Now this type of processor can be used to send requests (creating a client as seen above) and meanwhile will also process incoming requests for the specified service.
> I need to use this for callbacks (events that are sent spontaneously from the server to the actionscript client)
> Missing:
> - Improved error handling. At the moment the as3 client does not detect if the server disconnect, only if it sends a request.
> - "Real" server side functionality. Would need a serversocket that creates a new serviceProcessor for each client that connects.
> - The older HTTP transports are currently not compatible. They have to be changed to the new processor usage and must send a TMessageReceivedEvent to the processor. Maybe some minor changes I could add, but I have no time to test HTTP.

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

[jira] [Updated] (THRIFT-1223) AS3 extension - Socket IO, asnychronous calls, callbacks

Posted by "Matthias Einwag (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/THRIFT-1223?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Matthias Einwag updated THRIFT-1223:
------------------------------------

    Attachment: thrift.zip

My version of the thrift compiler for windows which generates the new style AS3 interface, client and processor.

> AS3 extension - Socket IO, asnychronous calls, callbacks
> --------------------------------------------------------
>
>                 Key: THRIFT-1223
>                 URL: https://issues.apache.org/jira/browse/THRIFT-1223
>             Project: Thrift
>          Issue Type: New Feature
>          Components: AS3 - Compiler, AS3 - Library
>            Reporter: Matthias Einwag
>              Labels: AS3, Async, Compiler, Library
>         Attachments: as3library.zip, t_as3_generator.cc, thrift.zip
>
>
> Hi everyone,
> first of all I'm new to Thrift and JIRA, so I hope I can get this right. 
> I will try to attach my modified version of the AS3 generator and the AS3 libs.
> I did some work on the AS3 implementation of thrift to get TCP/IP socket support. This includes a new transport TSocket.
> Because actionscript supports only non-blocking IO you must use TFramedTransport, which is also added and wraps around TSocket.
> Some example code to create a framed transport:
> private var socket:Socket;
> private var transport:TIOStreamTransport;
> private var framedTransport:TFramedTransport;
> socket = new Socket("127.0.0.1",9090);
> transport = new TSocket(socket);
> transport.open();
> framedTransport = new TFramedTransport(transport);
> As I did not like the current asynchronous implementation of Thrift/AS3, I did some further changes:
> - For each service function a send function and a receive function is generated
> - The send function sends the data over the transport and creates an AsyncResult object (similar to the Deferred in the Py-Twisted implementation), which stores error and success callback functions as well as the corresponding receive function. I would also like to add a timeout timer later to this.
> - I now use a processor object for clients and servers. The processor registers at the transport and is notified when a new Frame was received. Then process() is called which decodes one message. The processor has a dictionary that contains the sent requests (TAsyncResult objects). If a response message is requested the processor calls the recveive function for the request, which will then lead to a success or error call. This is not similar to the Java and Py-Twisted implementation where the sequence id and dictionary is stored in the client. But I find it more useful because I can support callbacks (see later).
> - The generic implementation TProcessor can be used to support client only functionality.
> Example:
> protocol = new TBinaryProtocol(framedTransport);
> processor = new TProcessor(protocol);	
> client = new ServiceClient(processor);
> TAsyncResult ar = client.send_doSomething(successHandler,errorHandler);
> - Derived processors are used for server side functionality and callbacks
> Example:
> service = new ServiceProcessor(theComponentThatImplementsTheServiceInterface,protocol);
> Now this type of processor can be used to send requests (creating a client as seen above) and meanwhile will also process incoming requests for the specified service.
> I need to use this for callbacks (events that are sent spontaneously from the server to the actionscript client)
> Missing:
> - Improved error handling. At the moment the as3 client does not detect if the server disconnect, only if it sends a request.
> - "Real" server side functionality. Would need a serversocket that creates a new serviceProcessor for each client that connects.
> - The older HTTP transports are currently not compatible. They have to be changed to the new processor usage and must send a TMessageReceivedEvent to the processor. Maybe some minor changes I could add, but I have no time to test HTTP.

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

[jira] [Issue Comment Edited] (THRIFT-1223) AS3 extension - Socket IO, asnychronous calls, callbacks

Posted by "Matthias Einwag (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/THRIFT-1223?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13064531#comment-13064531 ] 

Matthias Einwag edited comment on THRIFT-1223 at 7/13/11 1:03 PM:
------------------------------------------------------------------

No comments up to now on this?

I further improved the library a little bit. Added some documentation and error handling. Now an event is sent by the transport in case of an error or client disconnect. In this case also all pending requests are reported as failed to the applications.

I also tried to make THttpClient compatible with the new architecture. However did not test it. Anybody interested? 
One drawback I still see here: If one HTTP request fails *all* pending requests using this transport are reported as failed.
Apart from that TFullDuplexHttpClient is still incompatible.

      was (Author: matthiase):
    No comments up to now on this?

I further improved the library a little bit. Added some documentation and error handling. Now an event is sent by the transport in case of an error or client disconnect. In this case also all pending requests are notified as failed to the applications.

I also tried to make THttpClient compatible with the new architecture. However did not test it. Anybody interested? 
One drawback I still see here: If one HTTP request fails *all* pending requests using this transport are reported as failed.
Apart from that TFullDuplexHttpClient is still incompatible.
  
> AS3 extension - Socket IO, asnychronous calls, callbacks
> --------------------------------------------------------
>
>                 Key: THRIFT-1223
>                 URL: https://issues.apache.org/jira/browse/THRIFT-1223
>             Project: Thrift
>          Issue Type: New Feature
>          Components: AS3 - Compiler, AS3 - Library
>            Reporter: Matthias Einwag
>              Labels: AS3, Async, Compiler, Library
>         Attachments: as3library.zip, as3library.zip, t_as3_generator.cc, thrift.zip
>
>
> Hi everyone,
> first of all I'm new to Thrift and JIRA, so I hope I can get this right. 
> I will try to attach my modified version of the AS3 generator and the AS3 libs.
> I did some work on the AS3 implementation of thrift to get TCP/IP socket support. This includes a new transport TSocket.
> Because actionscript supports only non-blocking IO you must use TFramedTransport, which is also added and wraps around TSocket.
> Some example code to create a framed transport:
> private var socket:Socket;
> private var transport:TIOStreamTransport;
> private var framedTransport:TFramedTransport;
> socket = new Socket("127.0.0.1",9090);
> transport = new TSocket(socket);
> transport.open();
> framedTransport = new TFramedTransport(transport);
> As I did not like the current asynchronous implementation of Thrift/AS3, I did some further changes:
> - For each service function a send function and a receive function is generated
> - The send function sends the data over the transport and creates an AsyncResult object (similar to the Deferred in the Py-Twisted implementation), which stores error and success callback functions as well as the corresponding receive function. I would also like to add a timeout timer later to this.
> - I now use a processor object for clients and servers. The processor registers at the transport and is notified when a new Frame was received. Then process() is called which decodes one message. The processor has a dictionary that contains the sent requests (TAsyncResult objects). If a response message is requested the processor calls the recveive function for the request, which will then lead to a success or error call. This is not similar to the Java and Py-Twisted implementation where the sequence id and dictionary is stored in the client. But I find it more useful because I can support callbacks (see later).
> - The generic implementation TProcessor can be used to support client only functionality.
> Example:
> protocol = new TBinaryProtocol(framedTransport);
> processor = new TProcessor(protocol);	
> client = new ServiceClient(processor);
> TAsyncResult ar = client.send_doSomething(successHandler,errorHandler);
> - Derived processors are used for server side functionality and callbacks
> Example:
> service = new ServiceProcessor(theComponentThatImplementsTheServiceInterface,protocol);
> Now this type of processor can be used to send requests (creating a client as seen above) and meanwhile will also process incoming requests for the specified service.
> I need to use this for callbacks (events that are sent spontaneously from the server to the actionscript client)
> Missing:
> - Improved error handling. At the moment the as3 client does not detect if the server disconnect, only if it sends a request.
> - "Real" server side functionality. Would need a serversocket that creates a new serviceProcessor for each client that connects.
> - The older HTTP transports are currently not compatible. They have to be changed to the new processor usage and must send a TMessageReceivedEvent to the processor. Maybe some minor changes I could add, but I have no time to test HTTP.

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

[jira] [Updated] (THRIFT-1223) AS3 extension - Socket IO, asnychronous calls, callbacks

Posted by "Matthias Einwag (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/THRIFT-1223?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Matthias Einwag updated THRIFT-1223:
------------------------------------

    Attachment: as3library.zip
                t_as3_generator.cc

Improved Thrift Actionscript3 compiler and library

> AS3 extension - Socket IO, asnychronous calls, callbacks
> --------------------------------------------------------
>
>                 Key: THRIFT-1223
>                 URL: https://issues.apache.org/jira/browse/THRIFT-1223
>             Project: Thrift
>          Issue Type: New Feature
>          Components: AS3 - Compiler, AS3 - Library
>            Reporter: Matthias Einwag
>              Labels: AS3, Async, Compiler, Library
>         Attachments: as3library.zip, t_as3_generator.cc
>
>
> Hi everyone,
> first of all I'm new to Thrift and JIRA, so I hope I can get this right. 
> I will try to attach my modified version of the AS3 generator and the AS3 libs.
> I did some work on the AS3 implementation of thrift to get TCP/IP socket support. This includes a new transport TSocket.
> Because actionscript supports only non-blocking IO you must use TFramedTransport, which is also added and wraps around TSocket.
> Some example code to create a framed transport:
> private var socket:Socket;
> private var transport:TIOStreamTransport;
> private var framedTransport:TFramedTransport;
> socket = new Socket("127.0.0.1",9090);
> transport = new TSocket(socket);
> transport.open();
> framedTransport = new TFramedTransport(transport);
> As I did not like the current asynchronous implementation of Thrift/AS3, I did some further changes:
> - For each service function a send function and a receive function is generated
> - The send function sends the data over the transport and creates an AsyncResult object (similar to the Deferred in the Py-Twisted implementation), which stores error and success callback functions as well as the corresponding receive function. I would also like to add a timeout timer later to this.
> - I now use a processor object for clients and servers. The processor registers at the transport and is notified when a new Frame was received. Then process() is called which decodes one message. The processor has a dictionary that contains the sent requests (TAsyncResult objects). If a response message is requested the processor calls the recveive function for the request, which will then lead to a success or error call. This is not similar to the Java and Py-Twisted implementation where the sequence id and dictionary is stored in the client. But I find it more useful because I can support callbacks (see later).
> - The generic implementation TProcessor can be used to support client only functionality.
> Example:
> protocol = new TBinaryProtocol(framedTransport);
> processor = new TProcessor(protocol);	
> client = new ServiceClient(processor);
> TAsyncResult ar = client.send_doSomething(successHandler,errorHandler);
> - Derived processors are used for server side functionality and callbacks
> Example:
> service = new ServiceProcessor(theComponentThatImplementsTheServiceInterface,protocol);
> Now this type of processor can be used to send requests (creating a client as seen above) and meanwhile will also process incoming requests for the specified service.
> I need to use this for callbacks (events that are sent spontaneously from the server to the actionscript client)
> Missing:
> - Improved error handling. At the moment the as3 client does not detect if the server disconnect, only if it sends a request.
> - "Real" server side functionality. Would need a serversocket that creates a new serviceProcessor for each client that connects.
> - The older HTTP transports are currently not compatible. They have to be changed to the new processor usage and must send a TMessageReceivedEvent to the processor. Maybe some minor changes I could add, but I have no time to test HTTP.

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira