Forum Discussion

chaklasiyanikun's avatar
5 years ago

How To Manage Response From Task Node With Slow Internet?

I access My Task node in Main Scene Like below.

sub init()
m.Response = CreateObject("roSGNode", "TaskNodeFile") m.Response.control = "RUN"
end sub

And Task node Code Like below.

sub init()
   ?"init() - Start"
   readdata = CreateObject("roUrlTransfer")

   data = "http://Domain:Port" 
   readdata.setUrl(data)

   readdata.SetMinimumTransferRate(1, 75)

   ? "data is " data
   m.port = CreateObject("roMessagePort")
   readdata.setport(m.port)
   readdata.gettostring()
   readdata.SetRequest("POST")

   request = readdata.AsyncPostFromString(data) 
   ?"request : " request
   while (true)
      msg = Wait(3000, m.port) 'Here It's Crashed. I also tried with the 0 MilliSecond. " It's Give a Execution Time Out 
      statusCode = msg.GetResponseCode() 
      if (Type(msg) = "roUrlEvent")
         statusCode = msg.GetResponseCode()
         headers = msg.GetResponseHeaders()
         if msg.getresponsecode() = 200 then
            Response = msg.getstring()
            headers = msg.getresponseheadersarray()
            ?"Response : " Response
            exit while
         else
            m.top.isError = "true"
            m.readdata.asynccancel()
            exit while
         end if
else ? "wait for data" end if end while end sub

Here the issue is: I tested this Code with 2 Roku premiere+ devices.

In 1st Device Internet Speed: 10mbps and
In 2nd Device Internet Speed: 50mbps.

I checked My API Response using the Postman tool :
With 10mbps: It takes an 1800 MilliSeconds
With 50mbps: It takes a 350 MilliSeconds

In My Case With 10 Mbps, The Application crashed with this line msg = Wait(3000, m.port). Here, I also tried with the 0 MilliSeconds. After also It's Crashed and Gives Execution Timeout. If Some Internet issues, It's no waiting. It's Directly Crashed. Does anyone Found Good solutions or How to handle this Scenario?.

3 Replies

  • First off, your task is not set up correctly

    sub init()
        m.top.functionName = "codeToRun" 'what will be called on task.control ="RUN"
    end sub
    function codeToRun()
        'do stuff here
    end function

      as you have it the task will do stuff only when created of task.control ="init"

     

    since this is in a task and should be running on a no blocking thread try 

    msg = Wait(1, m.port)

     otherwise you are waiting 3000 milliseconds each loop 

    • chaklasiyanikun's avatar
      chaklasiyanikun
      Roku Guru

      I already tried which you suggest. My Task node like below : 

      sub init()
      ?"Start - init()" m.top.functionName = "MakePostRequest" 'Roku execution skips this line in my case.
      ?"End - init()" end sub
      function MakePostRequest() 
      ?"Start - MakePostRequest" 'The call doesn't come here
      readdata = CreateObject("roUrlTransfer") data = "http://Domain:Port" readdata.setUrl(data) readdata.SetMinimumTransferRate(1, 75) ? "data is " data m.port = CreateObject("roMessagePort") readdata.setport(m.port) readdata.gettostring() readdata.SetRequest("POST") request = readdata.AsyncPostFromString(data) ?"request : " request while (true) msg = Wait(0, m.port) statusCode = msg.GetResponseCode() if (Type(msg) = "roUrlEvent") statusCode = msg.GetResponseCode() headers = msg.GetResponseHeaders() if msg.getresponsecode() = 200 then Response = msg.getstring() headers = msg.getresponseheadersarray() ?"Response : " Response exit while else m.top.isError = "true" m.readdata.asynccancel() exit while end if
      else ? "wait for data" end if end while
      ?"End - MakePostRequest"
      end function  

      I make a separate project for this but here also result is the same.

      I have to do is stand there until there is a response. Because I created multiple Task nodes and every task node Depends on Each Other. Currently, your ways are happening like => Consider I used 3 Task node. so First It's 2nd Task node Response comes. After 3rd Task node Response comes then it's Run 1st Task node Response comes. But I need to run 1st, 2nd, 3rd wise.

      • necrotek's avatar
        necrotek
        Roku Guru

        Are you sure that your "task" xml extends task? not sure why it would skip that line. "functionName" is the field that is called as a function when you "run" a task. 

        https://developer.roku.com/docs/references/scenegraph/control-nodes/task.md

        since this is a task and not blocking, omit the while loop and don't do async

          urlhost = CreateObject("roUrlTransfer")
            urlhost.SetCertificatesFile("common:/certs/ca-bundle.crt")
            urlhost.AddHeader("X-Roku-Reserved-Dev-Id", "")
            urlhost.InitClientCertificates()
            urlhost.SetUrl(m.top.url)
            rsp = urlhost.GetToString()
            
            ResponseJSON = ParseJSON(rsp)