GenieFramework / Stipple.jl

The reactive UI library for interactive data applications with pure Julia.
MIT License
318 stars 27 forks source link

what, in general terms, causes "ChannelNotFoundException" errors please #142

Open ghost opened 1 year ago

ghost commented 1 year ago

Sometimes when I start my stipple server I get this and I have to restart it. Can someone point me at a way to research it. I don't want to post code as want to see how to analyze these issues myself. I just want the fishing rod not the fish :-) thanks

┌ Error: Genie.WebChannels.ChannelNotFoundException("ODNWXVZVQVMILNLENTAFYZDNTPPQOGGB") └ @ Stipple /home/dave/.julia/packages/Stipple/qiTHA/src/Stipple.jl:889

essenciary commented 1 year ago

I also get it sometimes, but I haven't had the chance to investigate. But it doesn't seem to cause any issues, everything just works for me. What doesn't work for you?

ghost commented 1 year ago

I have a real time update of a dataframe going and when the error happens then the web page is frozen but the dataframe continues to update in the background. In my case it doesn't stop. I don't want to post the code just yet on the forum as It's FULL of debugging crap and embaressing. I just put in the logging code so that will help A LOT :-)

NOW I'm having an issue with ZMQ right now and I "think" it might be associated with that. The cunning plan is I use cron to start the webserver and it just sits there listening on a ZMQ socket. when it gets a ZMQ message then it updates the dataframe which notifies the web server. NOW I've been just closing ZMQ sockets and breaking out of a while loop in the stipple script using an "END" message. When the cronjob fires the next morning I get an immediate "END" message which seems to kill the stipple process before it builds out the GENIE environment. Here's the logging of the failure BUT, as I say, I think this might be caused by the ZMQ socket NOT being flushed out properly on shutdown at night.

┌ Info: message : 2022-09-07T08:15:34.127 : 
│   message = HLAB~AAPL~EARNDAYS~47
└ @ Main /home/dave/tontine_2022/2022_live/9_6_22_stpl_pull.jl:176
┌ Error: Genie.WebChannels.ChannelNotFoundException("ODNWXVZVQVMILNLENTAFYZDNTPPQOGGB")
└ @ Stipple /home/dave/.julia/packages/Stipple/qiTHA/src/Stipple.jl:889
┌ Info: NOTIFY CATCH  something went wrong with df_table :
│   f = MethodError(convert, (Bool, nothing), 0x0000000000007ee2)
└ @ Main /home/dave/tontine_2022/2022_live/9_6_22_stpl_pull.jl:218
┌ Info: message : 2022-09-07T08:15:34.644 : 
│   message = HLAB~AMZN~EARNDAYS~47
└ @ Main /home/dave/tontine_2022/2022_live/9_6_22_stpl_pull.jl:176
┌ Error: Genie.WebChannels.ChannelNotFoundException("ODNWXVZVQVMILNLENTAFYZDNTPPQOGGB")
└ @ Stipple /home/dave/.julia/packages/Stipple/qiTHA/src/Stipple.jl:889
┌ Info: NOTIFY CATCH  something went wrong with df_table :
│   f = MethodError(convert, (Bool, nothing), 0x0000000000007ee2)
└ @ Main /home/dave/tontine_2022/2022_live/9_6_22_stpl_pull.jl:218
┌ Info: message : 2022-09-07T08:15:34.647 : 
│   message = HLAB~C~EARNDAYS~33
└ @ Main /home/dave/tontine_2022/2022_live/9_6_22_stpl_pull.jl:176
┌ Error: Genie.WebChannels.ChannelNotFoundException("ODNWXVZVQVMILNLENTAFYZDNTPPQOGGB")
└ @ Stipple /home/dave/.julia/packages/Stipple/qiTHA/src/Stipple.jl:889
┌ Info: NOTIFY CATCH  something went wrong with df_table :
│   f = MethodError(convert, (Bool, nothing), 0x0000000000007ee2)
└ @ Main /home/dave/tontine_2022/2022_live/9_6_22_stpl_pull.jl:218
┌ Info: message : 2022-09-07T08:15:34.649 : 
│   message = HLAB~DD~EARNDAYS~47
└ @ Main /home/dave/tontine_2022/2022_live/9_6_22_stpl_pull.jl:176
┌ Error: Genie.WebChannels.ChannelNotFoundException("ODNWXVZVQVMILNLENTAFYZDNTPPQOGGB")
└ @ Stipple /home/dave/.julia/packages/Stipple/qiTHA/src/Stipple.jl:889
┌ Info: NOTIFY CATCH  something went wrong with df_table :
│   f = MethodError(convert, (Bool, nothing), 0x0000000000007ee2)
└ @ Main /home/dave/tontine_2022/2022_live/9_6_22_stpl_pull.jl:218
┌ Info: message : 2022-09-07T08:15:34.651 : 
│   message = HLAB~EBAY~EARNDAYS~47
└ @ Main /home/dave/tontine_2022/2022_live/9_6_22_stpl_pull.jl:176
┌ Error: Genie.WebChannels.ChannelNotFoundException("ODNWXVZVQVMILNLENTAF

as I say I'll spend a little quality time RTFM on ZMQ. I thought this might be something someone else saw in regards to the real time update of df. Coding with Stipple, DataFrames, Genie and ZMQ is FUN!!! thanks for doing this

UPDATE Here is the status so far.
When the message

 Error: Genie.WebChannels.ChannelNotFoundException("ODNWXVZVQVMILNLENTAFYZDNTPPQOGGB")
└ @ Stipple /home/dave/.julia/packages/Stipple/qiTHA/src/Stipple.jl:889

happens then it kills the realtime update of the web page's view of the dataframe. This doesn't seem to be a ZMQ issue as I can replicate it by just simulating the cronjobs using bash ( basically cutting a pasting from cron).

so to reset the environment I send a "END" message in ZMQ which logs success. I also check to make sure that the SOCKET listens are shut down. Which they are. I use HTOP to see if GENIE, Julia et al are running and they are not.

to me this means that the environment is down and everything is closed off.

I start the Stipple script in bash and it builds the ui and the log is created and currently is empty as it's waiting for a ZMQ message. I send a sequence of zmq messages and the web page is updated with the correct information. time 15:43

Info: message : 2022-09-07T15:43:47.790 : 
│   message = HLAB~WMT~EARNDAYS~69

I resend the same message stream ( end with WMT) note the time 15:46

 Info: message : 2022-09-07T15:46:37.822 : 
│   message = HLAB~WMT~EARNDAYS~69

I REsend the same sequence and THEN the problem happens.

 Info: GET / 200
└ @ Genie.Router /home/dave/.julia/packages/Genie/hbOGK/src/Router.jl:178
┌ Info: GET /stipple.jl/master/assets/css/stipplecore.css 200
└ @ Genie.Router /home/dave/.julia/packages/Genie/hbOGK/src/Router.jl:178
┌ Info: GET /stippleui.jl/master/assets/css/quasar.min.css 200
└ @ Genie.Router /home/dave/.julia/packages/Genie/hbOGK/src/Router.jl:178
┌ Info: GET /genie.jl/master/assets/js/channels.js 200
└ @ Genie.Router /home/dave/.julia/packages/Genie/hbOGK/src/Router.jl:178
┌ Info: GET /stipple.jl/master/assets/js/underscore-min.js 200
└ @ Genie.Router /home/dave/.julia/packages/Genie/hbOGK/src/Router.jl:178
┌ Info: GET /stipple.jl/master/assets/js/vue.js 200
└ @ Genie.Router /home/dave/.julia/packages/Genie/hbOGK/src/Router.jl:178
┌ Info: GET /stipple.jl/master/assets/js/stipplecore.js 200
└ @ Genie.Router /home/dave/.julia/packages/Genie/hbOGK/src/Router.jl:178
┌ Info: GET /stipple.jl/master/assets/js/vue_filters.js 200
└ @ Genie.Router /home/dave/.julia/packages/Genie/hbOGK/src/Router.jl:178
┌ Info: GET /stipple.jl/master/assets/js/watchers.js 200
└ @ Genie.Router /home/dave/.julia/packages/Genie/hbOGK/src/Router.jl:178
┌ Info: GET /stipple.jl/master/assets/js/keepalive.js 200
└ @ Genie.Router /home/dave/.julia/packages/Genie/hbOGK/src/Router.jl:178
┌ Info: GET /stippleui.jl/master/assets/js/quasar.umd.min.js 200
└ @ Genie.Router /home/dave/.julia/packages/Genie/hbOGK/src/Router.jl:178
┌ Info: GET /stippleplotly.jl/master/assets/js/plotly2.min.js 200
└ @ Genie.Router /home/dave/.julia/packages/Genie/hbOGK/src/Router.jl:178
┌ Info: GET /stippleplotly.jl/master/assets/js/resizesensor.min.js 200
└ @ Genie.Router /home/dave/.julia/packages/Genie/hbOGK/src/Router.jl:178
┌ Info: GET /stippleplotly.jl/master/assets/js/lodash.min.js 200
└ @ Genie.Router /home/dave/.julia/packages/Genie/hbOGK/src/Router.jl:178
┌ Info: GET /stippleplotly.jl/master/assets/js/vueresize.min.js 200
└ @ Genie.Router /home/dave/.julia/packages/Genie/hbOGK/src/Router.jl:178
┌ Info: GET /stippleplotly.jl/master/assets/js/vueplotly.min.js 200
└ @ Genie.Router /home/dave/.julia/packages/Genie/hbOGK/src/Router.jl:178
┌ Info: GET /stippleplotly.jl/master/assets/js/sentinel.min.js 200
└ @ Genie.Router /home/dave/.julia/packages/Genie/hbOGK/src/Router.jl:178
┌ Info: GET /stippleplotly.jl/master/assets/js/syncplot.js 200
└ @ Genie.Router /home/dave/.julia/packages/Genie/hbOGK/src/Router.jl:178
┌ Info: GET /stipple.jl/master/assets/js/tontinemodel.js 200
└ @ Genie.Router /home/dave/.julia/packages/Genie/hbOGK/src/Router.jl:178
┌ Info: message : 2022-09-07T15:48:20.170 : 
│   message = HLAB~AAPL~EARNDAYS~47
└ @ Main /home/dave/tontine_2022/2022_live/9_6_22_stpl_pull.jl:180
┌ Error: Genie.WebChannels.ChannelNotFoundException("EWYTGZUXABYXOAXUYVIUEVGWNVSZAFLQ")
└ @ Stipple /home/dave/.julia/packages/Stipple/qiTHA/src/Stipple.jl:889
┌ Info: NOTIFY CATCH  something went wrong with df_table :
│   f = MethodError(convert, (Bool, nothing), 0x0000000000007ee2)
└ @ Main /home/dave/tontine_2022/2022_live/9_6_22_stpl_pull.jl:230
┌ Info: =====================  >    entering while loop waiting for message
└ @ Main /home/dave/tontine_2022/2022_live/9_6_22_stpl_pull.jl:177
┌ Info: message : 2022-09-07T15:48:20.479 : 
│   message = HLAB~AMZN~EARNDAYS~47

the dataframe is now not updating. I have included the whole log for you to see the events.

what is SUPPOSED to happen is that the Stipple server just sits there and updates the dataframe which triggers the notify thus the refresh. The ZMQ stream is the same in both cases but something happened between message streams. I'll keep plugging away but if you can see anything in the log that makes you go AHA! happy to hear it :-)

tontine2_log_2022_09_07_15_39.log

This is the final log that shows Another set of data being sent NOT showing up on the webpage but updating the dataframe. It also shows what happens when the END is sent.

tontine2_log_2022_09_07_15_39.log

here's the ui after messages update dataframe but BEFORE refresh before refresh

after refresh ( note the log the dataframe is fine)

after refesh

hhaensel commented 1 year ago

You could ask for model.isready[] before you update your dataframe, e.g.

timeout = 10 # or whatever your startup process needs
t0 = now()
while ! model.isready[] && now() - t0 < timeout
    sleep(200)
end
now() - t0 < timeout && model.df[] = my_brand_new_dataframe

or just do

model.isready[] && model.df[] = my_brand_new_dataframe

depending on how often END messages occur and whether it is important to catch all of them.

ghost commented 1 year ago

@hhaensel @essenciary

today's run ( 9/8/22) didn't work again. Same problem. I didn't put the isready code in as I couldn't get it to work in the repl as I don't think I understand what is going on. ( see bottom of this comment).

all that happens is that the web server is started, messages come in via ZMQ, the dataframe is updated, the changes notify the model and the UI reflects the changes, the "END" message shuts the whole thing down at the end of the day.

I have thought through your model.isready approach and have the following observation.

the dataframe had already been updated with seed data and that seemed to go well and the UI was updated properly. The ZMQ messaging system doesn't change. It's just a pipe. The dataframe rows have all been created, the columns are updating correctly and so the model has been ready since the start ( after HLAB messages are processed)

the error

Error: Genie.WebChannels.ChannelNotFoundException("EWYTGZUXABYXOAXUYVIUEVGWNVSZAFLQ")
└ @ Stipple /home/dave/.julia/packages/Stipple/qiTHA/src/Stipple.jl:889

happens and the UI ceases to update in real time ( prior to the event it was fine) BUT the datafames is still being updated properly it's just not showing on the UI

I'm wondering if it's anything to do with the way I set up my model

@reactive mutable struct TontineModel <: ReactiveModel
    tontine_data::R{DataTable} = DataTable(df_table[])
end

function ui(model::TontineModel)
    page(
        model, class="container", title="title TONTINE2 ", head_content=Genie.Assets.favicon_support(),

        [
        heading("heading Tontine2 9/6/22")

        row([
            cell(class="st-module", [
            h5("h5 tontine data")
            table(:tontine_data;
            style="height: 2000px;",)
            ])
        ])
        ]
    )
end

function handlers(model)
    on(df_table) do _
        notify(model.tontine_data)
    end

    model
end

and I process ZMQ messages with

while true

   @info "===  >    entering while loop waiting for message" 
   message = String(ZMQ.recv(socket))

   @info("message : $(now()) : ", message) 

   flush(io)

   println("Received request: $message")

   if message == "END"
      println("dying")
      println(df_table)
      @info "============> got end dying"
      @info df_table

      try 
         ZMQ.close(socket)
         ZMQ.close(context)
         break
      catch zmq_error
            @info something went wrong with closing zmq sockets => " zmq_error ZMQ.zmq_errno()
      end

   end

   global in_source, sym_in, field_in , value_in = split( message , "~")

   global value_fl = parse(Float64, value_in) # convert to Float64

   try
     global field_out = zmq_dash[ field_in]                # ie field_in "OPTION_IMPLIED_VOL" => field_out "iv"
     sym_in in df_table[][!,:sym] || push!(df_table[], (sym_in,0.0, 0.0, 0.0, 0.0 , 0.0, 0.0 , 0.0 , 0.0 , 0.0 , 0.0))
     df_table[][findfirst(==(sym_in), df_table[].sym), findfirst(==(field_out), names(df_table[]))] = value_fl
     if field_out == "price" 
        price_calcs()
     end

     try 
        notify(df_table)
     catch f
         @info "NOTIFY CATCH  something went wrong with df_table :" f
     end
   catch e
     @error "** PROBLEM WITH DF UPDATE >  "  field_out  e 
   end
end

@info "============== exiting while loop got END " 

just to show that the process works in general here's the log when I just fire up the web server, send a stream of messages via ZMQ to the while loop ( see above) and it works properly. There's no difference ( other than content) between the messages in this successful log and the ones in the failures. This log is a simple MVP and the UI showed the updates properly.

tontine2_log_2022_09_08_20_11.log

comicpilsen commented 1 year ago

@essenciary @hhaensel hi both this issue isn't going away and right now I'm stumped. I suspect I haven't set up the model correctly ( see above) and I don't know how to debug it ( I'm a noob), My quandry is that the update of the dataframe works ALL the time but something breaks the realtime update of the UI. I looked at https://genieframework.com/docs/stipple/guides/Stipple-LifeCycle.html and can't see anything that would cause the error ( see logs above) as the ZMQ messages are of the same format and the frequency isn't that great ( see log timing). IF you can give me some hints in how to diagnose this issue I would be most grateful. From the Stipple lifecycle doc ( pretty good work by the way) I see the isready is already set. I am so useless I can't even figure out how to set that despite the code been written for me by @hhaensel. NOTE in @hhaensel code it's NOT a ZMQ message but an internal random string generated to simulate the ZMQ.

as data is exchanged over the async connection with the frontend, various properties of the Julia model are changed, causing their handlers to be triggered – starting with the automatically triggered isready event

a BIG part of my problem is that I am using your YT video from Munich to learn how this works ( excellent by the way) and the VERY bit I want to know about is the part where it goes wrong!!! https://youtu.be/xlieoONTLUs?t=1454 later on you mention that you had problems with too many callers/listeners and I was wondering if this might be a related issue???

ANY help you can give me would be appreciated as I am so close here.

ghost commented 1 year ago

nothiing I am doing is getting this solved. I am digging a fairly deep hole here so I'm going to switch back for a while to python/dash and pandas.

the "model.isready[]" approach did not work as the model was not found. At this moment there had been no browser activity on the web page.

when I browsed the webpage and THEN started the ZMQ feed all was working perfectly BUT the moment refreshed the browser saw the return ( permanently ) of the

┌ Error: Genie.WebChannels.ChannelNotFoundException("EWYTGZUXABYXOAXUYVIUEVGWNVSZAFLQ") └ @ Stipple /home/dave/.julia/packages/Stipple/qiTHA/src/Stipple.jl

If I refreshed the web page then I could see the "live" data but it was not real time as it was at the start.

Thank you for trying to help me.

hhaensel commented 1 year ago

What you could do in this case at least as a quick work around is to define your model globally and to initialise it in the main part of your code. In the route you would only use the model.

model = init(TontineModel)

route("/") do
    global model
    model |> handlers |> ui |> html
end

The only disadvantage with this approach is that you will always look at the same model with all web browsers. So if you open more than one window, all will be synchronised. But due to your using a global model it also did not work properly before.

Will you be needing multiple browser windows?

ghost commented 1 year ago

Hi there @hhaensel

I thank you for taking the time BUT, there's always a but isn't there :-), I am a little fatigued with julia at the moment. I was wasting your and @essenciary time. Clearly there is something wrong here and I don't have the skills to diagnose it.
I was almost there and the approach was proven to work. The seed IPM's built out the foundation data, the real time ipm's created a real time dashboard which was excellent. I don't really want to have a quick workaround as that NEVER ends well for me :-) Here is the code I came up just in case it's useful for others.

Again thanks again for being so patient. You have an excellent package in Stipple and more competent julia coders will build wonderful things with it. Tomorrow we have the Carbon people over and I now have an excellent problem for them to solve IF they have the product and not just vaporware.

Sorry I just saw your question. Yes this would be a web app with 10 people looking at it. ALSO there would have been more adaptions in the future using a finite state machine approach to changing the processing flow of the application using ZMQ and queue theory.

theakson

using Stipple
using StippleUI
using StipplePlotly
using CSV, DataFrames, Dates , Logging
using ZMQ

log_date = Dates.format(now(),"yyyy_mm_dd_HH_MM")
log_name = "/home/dave/tontine_2022/data/logs/tontine2_log_" * log_date * ".log"
io = open( log_name, "w+")
logger = SimpleLogger(io)
global_logger(logger)

dash_columns = ["sym","close","price","sdmove","hv20","hv10","hv5","iv","iv%ile","prc%ile","ern_days"]

df = DataFrame([col => (col == "sym" ? String : Float64)[] for col in dash_columns])
df_table = Observable(df)

zmq_dash = Dict("LAST" => "price","CLOSE" => "close","OPTION_IMPLIED_VOL" => "iv","OPTION_HISTORICAL_VOL" => "iv",
                         "VOLUME"  => "volume","IV" => "iv","IV_PERCENTILE" => "iv%ile" ,"HV20" => "hv20",
                         "HV10" => "hv10","HV5" => "hv5" ,"PRICE_PERCENTILE" => "prc%ile","EARNDAYS" => "ern_days")

@reactive mutable struct TontineModel <: ReactiveModel
    tontine_data::R{DataTable} = DataTable(df_table[])
    tontine_data_pagination::DataTablePagination = DataTablePagination(rows_per_page=100) #9/11/22
end

function ui(model::TontineModel)
    page(
        model, class="container", title="title TONTINE2 ", head_content=Genie.Assets.favicon_support(),

        [
        heading( "heading Tontine2 5555 9/11/22 from 9_11_22_stpl_pull.jl pag = 100 px = 3000"  )

        row([
            cell(class="st-module", [
            h5("h5 tontine data")
            table(:tontine_data;
            style="height: 3000px;",
            pagination=:tontine_data_pagination) # 9/11/22 added pagination
            ])
        ])
        ]
    )
end

function handlers(model)
    on(df_table) do _
        notify(model.tontine_data)
    end

    model
end

route("/") do #9/12/22 https://discourse.julialang.org/t/noob-needs-help-debugging-and-understanding-reactive-models/87038/12
    global model
    (model = init(TontineModel)) |> handlers |> ui |> html #  = has lowest precedence
end

up()       # up(9000; async = true, server = Stipple.bootstrap())

context = Context()

socket = Socket(context, PULL)

ZMQ.bind(socket, "tcp://*:5555")

@info " $(now())  ======>>>    starting IN Socket 5555" 

flush(io)

println(" $(now())  entering main, waiting for message")

while true

   message = String(ZMQ.recv(socket))

   @info "message : $(now()) : " message    # 9/11/22 https://julialogging.github.io/tutorials/logging-basics/

   flush(io)

   println("Received request: $message")

   if message == "END"
      println("dying")
      println(df_table)
      @info "========================> $(now())  got end dying"
      @info df_table

      try 
         ZMQ.close(socket)
         ZMQ.close(context)
         break
      catch zmq_error
            @info "**************************==> something went wrong with closing zmq sockets => " zmq_error ZMQ.zmq_errno()
      end

   end

   global in_source, sym_in, field_in , value_in = split( message , "~")

   global value_fl = parse(Float64, value_in) # convert to Float64

   try
     global field_out = zmq_dash[ field_in]                # ie field_in "OPTION_IMPLIED_VOL" => field_out "iv"

     #println("message to add : ", in_source," ",sym_in," ",field_out," " ,value_in)

     sym_in in df_table[][!,:sym] || push!(df_table[], (sym_in,0.0, 0.0, 0.0, 0.0 , 0.0, 0.0 , 0.0 , 0.0 , 0.0 , 0.0))

     df_table[][findfirst(==(sym_in), df_table[].sym), findfirst(==(field_out), names(df_table[]))] = value_fl

     if field_out == "price" 
        price_calcs()
     end

     try 
        notify(df_table)
     catch f
        #println(" NOTIFY CATCH  something went wrong with df_table : ", f)
        #println("sym_in :", sym_in," field_out : ", field_out)
        @info " $(now())    NOTIFY CATCH  something went wrong with df_table :" f

     end

   catch e

     @error "** PROBLEM WITH DF UPDATE >  "  field_out  e 

   end

end

@info "====>   $(now())  exiting while loop got END " 
flush(io)

EDIT: Reformatted the code part with triple back ticks 😉

ghost commented 1 year ago

thank you I SWEAR I was using the "< >" code approach. I'll make sure I use the ``` next time. Thanks again for trying. theakson

hhaensel commented 1 year ago

In general, this error is thrown when code tries to push updates of the model to the client. In most cases it is, because a client went offline or was never online. @essenciary Do we really have to throw an error? Wouldn't be a warning sufficient?

In case that the client is not yet online can be tackled by checking model.isready[], the other case is more difficult, but a try catch could do the job.

ghost commented 1 year ago

@hhaensel if you look at the runs I did the model isn't present. The "seed" historical data ( HV and percentile) is used to build the dataframe BEFORE any browser activity takes place. At that moment, it seems to me, the model has not been initialized and therefore any call to model or model.isready[] won't work. The moment I browse the web page the model is accessible. But is not real time, if I refresh the page it gives me the last data snapshot. If I let it run with NO browser intervention the dataframe is updated correctly.

dave@deepthought:~/tontine_2022/data/logs$ tail -n 20 tontine2_log_2022_09_16_04_00.log 
│   message = STK~MSFT~LAST~244.98
└ @ Main /home/dave/tontine_2022/2022_live/9_11_22_stpl_pull.jl:151
┌ Info: message : 2022-09-16T15:15:17.477 : 
│   message = STK~NFLX~LAST~240.3
└ @ Main /home/dave/tontine_2022/2022_live/9_11_22_stpl_pull.jl:151
┌ Info: message : 2022-09-16T15:15:18.477 : 
│   message = STK~IWM~LAST~179.11
└ @ Main /home/dave/tontine_2022/2022_live/9_11_22_stpl_pull.jl:151
┌ Info: message : 2022-09-16T15:15:18.727 : 
│   message = STK~QQQ~LAST~289.4
└ @ Main /home/dave/tontine_2022/2022_live/9_11_22_stpl_pull.jl:151
┌ Info: message : 2022-09-16T15:15:19.729 : 
│   message = STK~SPY~LAST~386.14
└ @ Main /home/dave/tontine_2022/2022_live/9_11_22_stpl_pull.jl:151
┌ Info: message : 2022-09-16T15:15:24.984 : 
│   message = STK~AAPL~LAST~150.59
└ @ Main /home/dave/tontine_2022/2022_live/9_11_22_stpl_pull.jl:151
┌ Info: message : 2022-09-16T15:15:25.986 : 
│   message = STK~META~LAST~146.21
└ @ Main /home/dave/tontine_2022/2022_live/9_11_22_stpl_pull.jl:151

this is what I indicated earlier.

nothiing I am doing is getting this solved. I am digging a fairly deep hole here so I'm going to switch back for a while to python/dash and pandas.

the "model.isready[]" approach did not work as the model was not found. At this moment there had been no browser activity on the web page.

when I browsed the webpage and THEN started the ZMQ feed all was working perfectly BUT the moment refreshed the browser saw the return ( permanently ) of the

┌ Error: Genie.WebChannels.ChannelNotFoundException("EWYTGZUXABYXOAXUYVIUEVGWNVSZAFLQ")
└ @ Stipple /home/dave/.julia/packages/Stipple/qiTHA/src/Stipple.jl

If I refreshed the web page then I could see the "live" data but it was not real time as it was at the start.

Thank you for trying to help me.
ghost commented 1 year ago

hi there @essenciary asked for a test harness and some test data find attached. Had to rename the testjl to TXT as the attach function didn't seem to take jl just install ZMQ and it should work. NB might have to change the port to 5556

test_3000_msg.csv 2_5_23_test_3000_zmq_5556_msg.TXT