[Glass] ZnZincServerAdaptor on Gemstone
Iwan Vosloo
iwan at reahl.org
Mon Jun 22 02:00:00 PDT 2020
Hi Dale,
I was not aware of the classes below ZnZincServerAdaptor or the gem
server framework. Those are nice docs, thanks.
-i
On 2020/06/17 20:40, Dale Henrichs via Glass wrote:
> Iwan,
>
> Have you looked at gsApplicationTools[1][2]? The GemServers in
> gsApplicationTools are designed to work with Zinc instead of FFI.
>
> In my Seaside installation this is the class hierarchy for
> ZnZincServerAdaptor:
>
> Object
> GRObject
> WAObject
> WAServerAdaptor
> ZnZincServerAdaptor
> WAGsZincAdaptor
> WAZincNewGemServerAdaptor
>
> The class WAGsZincAdaptor and WAZincNewGemServerAdaptor are Zinc
> adaptors designed to work in GemStone. To get those classes loaded you
> should load Seaside with at Metacello expression that loads 'Zinc
> Project' along with your other `loads:` arguments and that should get
> you all of the Seaside classes needed to uze Zinc servers in GemStone.
>
> If you decide not to use gsApplicationTools, you should at least take a
> look at gsApplicationTools for examples on how to use the adaptors.
>
> Dale
>
> [1] https://github.com/dalehenrich/gsApplicationTools
> [2]
> https://github.com/GsDevKit/gsApplicationTools/blob/master/docs/gettingStarted.md#table-of-contents
> On 6/17/20 5:00 AM, Iwan Vosloo via Glass wrote:
>> Hello.
>>
>> We're currently using WAFastCGIAdaptor in Gemstone 3.4.1. Calling
>> start on it does not return and utilises the current process to serve
>> requests.
>>
>> We'd like to use ZnZincServerAdaptor in the same way, but I can't
>> figure out how to do that. (We're using v2.4.3.6 of
>> github://GsDevKit/zinc).
>>
>> What I've tried to do is to subclass from ZnSingleThreadedServer, and
>> on it override start to something that does not fork:
>>
>> ZnForegroundServer:
>>
>> start
>> self stop: false.
>> self class default = self
>> ifTrue: [ self register ].
>> [ self listenLoop ] repeat
>>
>> Then, I'd start the adaptor like this:
>>
>> (ZnZincServerAdaptor port: portInteger)
>> serverClass: ZnForegroundServer;
>> start.
>>
>> Running the above blocks and listens on the socket. But as soon as I
>> try to hit it with a web browser, the browser is left waiting for a
>> response while the server breaks with:
>>
>> ERROR 2710 , a ConnectionClosed occurred (error 2710), , Connection
>> closed while waiting for data. (ConnectionClosed)
>>
>> I realise I don't understand this code at all, but I thought this
>> ought to be do-able. Any advice would be appreciated!
>>
>> For interest, here is the stack trace when run from topaz:
>>
>> ==> 1 ConnectionClosed (AbstractException) >> _signalWith: @6 line 25
>> 2 ConnectionClosed (AbstractException) >> signal: @3 line 7
>> 3 ConnectionClosed class (AbstractException class) >> signal: @3 line 4
>> 4 SocketStreamSocket >> receiveDataSignallingTimeout:into:startingAt:
>> @11 line 14
>> 5 SocketStream >> receiveData @6 line 15
>> 6 SocketStream >> next @7 line 9
>> 7 ZnLineReader >> processNext @6 line 4
>> 8 ZnLineReader >> nextLine @3 line 3
>> 9 ZnRequestLine >> readFrom: @4 line 3
>> 10 ZnRequestLine class >> readFrom: @3 line 3
>> 11 ZnRequest >> readHeaderFrom: @2 line 2
>> 12 ZnRequest (ZnMessage) >> readFrom: @2 line 2
>> 13 ZnRequest class (ZnMessage class) >> readFrom: @3 line 3
>> 14 [] in ZnServer >> reader @7 line 4
>> 15 [] in ZnSingleThreadedServer >> readRequest: @16 line 6
>> 16 [] in ZnSingleThreadedServer >> withMaximumEntitySizeDo: @11 line 6
>> 17 [] in DynamicVariable class >> value:during: @16 line 9
>> 18 ExecBlock0 (ExecBlock) >> ensure: @2 line 12
>> 19 ZnMaximumEntitySize class (DynamicVariable class) >> value:during:
>> @7 line 10
>> 20 ZnForegroundServer (ZnSingleThreadedServer) >>
>> withMaximumEntitySizeDo: @6 line 5
>> 21 ZnForegroundServer (ZnSingleThreadedServer) >> readRequest: @3 line 6
>> 22 [] in ZnSingleThreadedServer >> executeOneRequestResponseOn: @13
>> line 12
>> 23 ExecBlock0 (ExecBlock) >> on:do: @3 line 44
>> 24 [] in ZnSingleThreadedServer >> executeOneRequestResponseOn: @9
>> line 16
>> 25 [] in DynamicVariable class >> value:during: @16 line 9
>> 26 ExecBlock0 (ExecBlock) >> ensure: @2 line 12
>> 27 ZnCurrentServer class (DynamicVariable class) >> value:during: @7
>> line 10
>> 28 ZnForegroundServer (ZnSingleThreadedServer) >>
>> executeOneRequestResponseOn: @5 line 9
>> 29 [] in ZnSingleThreadedServer >> serveConnectionOn: @31 line 13
>> 30 ExecBlock0 (ExecBlock) >> on:do: @3 line 44
>> 31 [] in ZnSingleThreadedServer >> serveConnectionOn: @27 line 14
>> 32 ExecBlock0 (ExecBlock) >> ensure: @2 line 12
>> 33 [] in ZnSingleThreadedServer >> serveConnectionOn: @21 line 16
>> 34 [] in ExecBlock >> ifCurtailed: @8 line 6
>> 35 ExecBlock0 (ExecBlock) >> ensure: @2 line 12
>> 36 ExecBlock0 (ExecBlock) >> ifCurtailed: @4 line 8
>> 37 [] in ZnSingleThreadedServer >> serveConnectionOn: @17 line 19
>> 38 ExecBlock0 (ExecBlock) >> on:do: @3 line 44
>> 39 ZnForegroundServer (ZnSingleThreadedServer) >> serveConnectionOn:
>> @5 line 22
>> 40 [] in ZnSingleThreadedServer >> listenLoop @12 line 12
>> 41 [] in ExecBlock >> ifCurtailed: @8 line 6
>> 42 ExecBlock0 (ExecBlock) >> ensure: @2 line 12
>> 43 ExecBlock0 (ExecBlock) >> ifCurtailed: @4 line 8
>> 44 ZnForegroundServer (ZnSingleThreadedServer) >> listenLoop @4 line 14
>> 45 ZnForegroundServer >> start @8 line 5
>> 46 ZnZincServerAdaptor >> basicStart @3 line 2
>> 47 [] in WAServerManager >> start: @9 line 3
>> 48 [] in ExecBlock >> ifCurtailed: @8 line 6
>> 49 ExecBlock0 (ExecBlock) >> ensure: @2 line 12
>> 50 ExecBlock0 (ExecBlock) >> ifCurtailed: @4 line 8
>> 51 WAServerManager >> start: @5 line 4
>> 52 ZnZincServerAdaptor (WAServerAdaptor) >> start @3 line 2
>>
>>
>>
>>
>
> _______________________________________________
> Glass mailing list
> Glass at lists.gemtalksystems.com
> https://lists.gemtalksystems.com/mailman/listinfo/glass
>
--
Reahl, the Python only web framework / www.reahl.org
More information about the Glass
mailing list