Task scheduller.

Post here your questions about SFS2X. Here we discuss all server-side matters. For client API questions see the dedicated forums.

Moderators: Lapo, Bax

Oleg_79
Posts: 161
Joined: 25 Feb 2011, 10:31
Location: Ukraine, Donetsk

Task scheduller.

Postby Oleg_79 » 20 Aug 2015, 14:30

Hi!
I have a zone extension here zone extension code:

Code: Select all

public class LobbyExtension extends SFSExtension{
    private ScheduledFuture _timer;
    @Override
    public void init() {
        trace("init zone " + getParentZone().getName());
        _timer = SmartFoxServer.getInstance().getTaskScheduler().scheduleAtFixedRate(new ZoneTimer(), 0, 1, TimeUnit.SECONDS);

        addEventHandler(SFSEventType.SERVER_READY, SystemEvents.class);
    }

    private void CreateRoom() {
        CreateRoomSettings settings = new CreateRoomSettings();
        settings.setName("TestRoom");
        settings.setMaxUsers(5);
        settings.setMaxSpectators(10);
        settings.setExtension(new CreateRoomSettings.RoomExtensionSettings("Games", "ol.sfs.games.lobby.RoomExtension"));
        settings.setAutoRemoveMode(SFSRoomRemoveMode.DEFAULT);
        try {
            getParentZone().createRoom(settings);
        } catch (SFSCreateRoomException e) {
            e.printStackTrace();
        }
    }

    class ZoneTimer implements Runnable {
        int ticks = 0;
        @Override
        public void run() {
            if(ticks == 15)
                CreateRoom();
            else if(ticks == 30)
                getParentZone().removeRoom(getParentZone().getRoomByName("TestRoom"));
            ticks++;
        }
    }
}


i fire timer in my zone extension and after 15 seconds create room and after 30 seconds i remove my room.

This is my room extension code:

Code: Select all

public class RoomExtension extends SFSExtension {
    ScheduledFuture timer;
    @Override
    public void init() {
        timer = SmartFoxServer.getInstance().getTaskScheduler().scheduleAtFixedRate(new RoomTimer(), 0, 1, TimeUnit.SECONDS);
    }

    class RoomTimer implements Runnable {
        int ticks = 0;
        @Override
        public void run() {
            trace("TICKS: " + ticks);
            ticks++;
        }
    }
}


in room extension i create timer and trace ticks thats all.

I have a problem when after 30 seconds my room removed, but ticks from my removed room not removed. Whats wrong with my code?
How in removed room can go ticks?

Thanks for help!
User avatar
Lapo
Site Admin
Posts: 23008
Joined: 21 Mar 2005, 09:50
Location: Italy

Re: Task scheduller.

Postby Lapo » 21 Aug 2015, 07:35

In the destroy method of your Room Extension you need to stop the Room's timer.

Code: Select all

@Override
public void destroy()
{
   timer.cancel();
}


cheers
Lapo
--
gotoAndPlay()
...addicted to flash games
arash
Posts: 14
Joined: 06 Jul 2014, 10:36

Re: Task scheduller.

Postby arash » 29 May 2016, 11:31

I put my room extension in lib folder for memory performance in my senario I have 10 little games that in every match 2 player play 3 games randomly between every games they see a page for 10 second but the times of every game is different. two question :

1- can i define this Task scheduller in room extension (in this form that it is put in lib folder) ?
2- for every match we need a unique Task scheduller if we have 200 room simultaneously do we edit TaskScheduler's thread pool in admin panel

I defined a singelton class and game data saved in that class as below :

//init a new game data:
DaniLeagueModel.getInstance().initGamePlayer
(playID,
room.getUserList().get(0).getName(),
room.getUserList().get(1).getName(),
String.valueOf(room.getVariable(Constants.ROOM_VAR_LEAGUE))
);

the games has just two player
User avatar
Lapo
Site Admin
Posts: 23008
Joined: 21 Mar 2005, 09:50
Location: Italy

Re: Task scheduller.

Postby Lapo » 30 May 2016, 09:25

arash wrote:1- can i define this Task scheduller in room extension (in this form that it is put in lib folder) ?


The task scheduler could be just one. It is not a good idea to create one Scheduler per Room. Instead you can use one Scheduler and then add hundreds of Tasks to it.

There already exist one default Scheduler which you can reference in your code like this:

Code: Select all

getApi().getSystemScheduler()



2- for every match we need a unique Task scheduller if we have 200 room simultaneously do we edit TaskScheduler's thread pool in admin panel

See my previous answer about the multiple Scheduler.

If you're creating the Scheduler in your code you will need to configure it in your code. The AdminTool Scheduler settings refer to the main SmartFoxServer Task Scheduler.

Hope it helps
Lapo

--

gotoAndPlay()

...addicted to flash games
arash
Posts: 14
Joined: 06 Jul 2014, 10:36

Re: Task scheduller.

Postby arash » 31 May 2016, 17:36

Hi Lapo thx for your description but I can not find this method :
getApi().getSystemScheduler()
User avatar
Lapo
Site Admin
Posts: 23008
Joined: 21 Mar 2005, 09:50
Location: Italy

Re: Task scheduller.

Postby Lapo » 01 Jun 2016, 07:22

What version of SmartFoxServer are you using?

In any case you can use this:

Code: Select all

SmartFoxServer.getInstance().getTaskScheduler()
Lapo

--

gotoAndPlay()

...addicted to flash games
arash
Posts: 14
Joined: 06 Jul 2014, 10:36

Re: Task scheduller.

Postby arash » 06 Jun 2016, 21:08

Hi Lapo my code thrown error after a while :(error rejectedexecutionexception)

Code: Select all

package com.codeanimate.mishakosha.danileaguemain.room;

import codeAnimate.misha.daniLeagueModel.DaniLeagueModel;
import com.codeanimate.mishakosha.danileaguemain.Constants;
import com.smartfoxserver.v2.SmartFoxServer;
import com.smartfoxserver.v2.core.SFSEventType;
import com.smartfoxserver.v2.entities.Room;
import com.smartfoxserver.v2.extensions.SFSExtension;


import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

/**
 * Created by as on 1/23/2016.
 */
public class RoomExtension extends SFSExtension {


    @Override
    public void init() {
        addEventHandler(SFSEventType.USER_JOIN_ROOM,GameRoomJoinEventHandler.class);
        addEventHandler(SFSEventType.USER_LEAVE_ROOM,OnUserGoneHandler.class);
        addEventHandler(SFSEventType.USER_DISCONNECT, OnUserGoneHandler.class);
        addRequestHandler(Constants.ALL_GAMES_SCORES,UpdateGamesScoreHandler.class);
        //

    }


    private ScheduledFuture timer=null;

    public  void doTimer(Room myRoom, Integer totalTime)
    {
        System.out.println("do Timer");
       try
       {

           if (myRoom!=null)
               System.out.println("myRoom");
           if (totalTime!=null)
               System.out.println("totalTime :"+totalTime);
           System.out.println("Pool size :"+SmartFoxServer.getInstance().getTaskScheduler().getThreadPoolSize());
            timer = SmartFoxServer.getInstance().getTaskScheduler().schedule(
                    new MyTimerTask(myRoom), totalTime, TimeUnit.SECONDS);

        } catch (Exception e ) {
           e.printStackTrace();
       }
    }

    private void endGame(Room myRoom) {
        try {
            timer.cancel(true);
            SmartFoxServer.getInstance().getTaskScheduler().destroy(timer);
            Double playID= myRoom.getVariable(Constants.ROOM_VAR_PLAY_ID).getDoubleValue();


            send(Constants.CMD_GAMES_END, DaniLeagueModel.getInstance().getGameState(playID.longValue()), myRoom.getUserList());
            System.out.println("end Game!");
                    //
            DaniLeagueModel.getInstance().putNewPlay(playID.longValue());

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @Override
    public void destroy() {
        if (timer!=null) {
            try {
                timer.cancel(true);
//                SmartFoxServer.getInstance().getTaskScheduler().destroy(timer);
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
        super.destroy();
    }

     class MyTimerTask implements Runnable
    {
        private Room _myRoom;
        public MyTimerTask(Room myRoom) {
            _myRoom=myRoom;
        }

        @Override
        public void run() {
            try {
                endGame(_myRoom);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}



User avatar
Lapo
Site Admin
Posts: 23008
Joined: 21 Mar 2005, 09:50
Location: Italy

Re: Task scheduller.

Postby Lapo » 07 Jun 2016, 08:30

Can you please post the full stack trace of the error?
Thanks
Lapo

--

gotoAndPlay()

...addicted to flash games
arash
Posts: 14
Joined: 06 Jul 2014, 10:36

Re: Task scheduller.

Postby arash » 07 Jun 2016, 11:31

Hi Lapo this is the error message (today works more than one time but after a while i got error )

Code: Select all

java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.Sched
uledThreadPoolExecutor$ScheduledFutureTask@7391483c rejected from java.util.conc
urrent.ScheduledThreadPoolExecutor@471d966a[Terminated, pool size = 0, active th
reads = 0, queued tasks = 0, completed tasks = 17064]
        at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution
(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor.reject(Unknown Source)
        at java.util.concurrent.ScheduledThreadPoolExecutor.delayedExecute(Unkno
wn Source)
        at java.util.concurrent.ScheduledThreadPoolExecutor.schedule(Unknown Sou
rce)
        at com.smartfoxserver.v2.util.TaskScheduler.schedule(TaskScheduler.java:
107)
        at com.codeanimate.mishakosha.danileaguemain.room.RoomExtension.doTimer(
RoomExtension.java:45)
        at com.codeanimate.mishakosha.danileaguemain.room.GameRoomJoinEventHandl
er.handleServerEvent(GameRoomJoinEventHandler.java:69)
        at com.smartfoxserver.v2.extensions.SFSExtension.handleServerEvent(SFSEx
tension.java:258)
        at com.smartfoxserver.v2.entities.managers.SFSExtensionManager.dispatchE
vent(SFSExtensionManager.java:769)
        at com.smartfoxserver.v2.entities.managers.SFSExtensionManager.dispatchR
oomLevelEvent(SFSExtensionManager.java:711)
        at com.smartfoxserver.v2.entities.managers.SFSExtensionManager.dispatchR
oomLevelEvent(SFSExtensionManager.java:724)
        at com.smartfoxserver.v2.entities.managers.SFSExtensionManager.handleSer
verEvent(SFSExtensionManager.java:898)
        at com.smartfoxserver.v2.core.SFSEventManager$SFSEventRunner.run(SFSEven
tManager.java:65)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)
User avatar
Lapo
Site Admin
Posts: 23008
Joined: 21 Mar 2005, 09:50
Location: Italy

Re: Task scheduller.

Postby Lapo » 07 Jun 2016, 16:01

Oh I see what is the problem.
You're calling the destroy() method on the TaskScheduler, which effectively shuts down the scheduler itself. So when you later try to run more tasks it raises an error.

To stop a running task you just need to call Task.cancel()

That's all.
Lapo

--

gotoAndPlay()

...addicted to flash games

Return to “SFS2X Questions”

Who is online

Users browsing this forum: No registered users and 49 guests