[Red5] Red5.getConnectionLocal() from SchedulerJob returns null
Mamontov Sergey V.
moonlight at ua.elro.com
Mon Nov 19 13:19:10 PST 2007
Kyoun,
Who told You that? :)
If my Streamer extends ApplicationAdapter, he also implements all of his methods, and methods of MultithreadApplicationAdapter :)
Someone explain me, what Scheduling service invoking already in other thread, so it haven't access to all IConnection what was created in previous thread :(
I see only on possible solution, not very elegance, but i think it will work, I will use SharedObject and events for it. When scheduler will execute, he will write some flag to corresponding user, meantime main application have listeners on shardeobject change. Listener will iterate through all connection and search user whom sharedobject was changed in the connection of application and then invoke corresponding actions.
This is really not very good, but only one right solution for situation, when after executing of scheduler I need to to do something with client playback.
I will accept any possible variations on this theme :)
Regards,
Sergey
> Why next code is possible
> it is because Application class implements ISchedulingService interface
> Application app = (Application)service;
> but your streamer not implement that interface
> so your code not permited
> I'm sorry I can't help you
> Date: Mon, 19 Nov 2007 22:02:42 +0200
> From: moonlight at ua.elro.com
> To: red5 at osflash.org
> Subject: Re: [Red5] Red5.getConnectionLocal() from SchedulerJob returns null
>
> Hi Kyoung,
>
> Thanks for example, but i still can't make it work well :(
> This is my code for ScheduledJob:
>
> class myJob30sec implements IScheduledJob{
>
> private Streamer application;
> private IScope cscope;
> private static final Log log = LogFactory.getLog(myJob30sec.class);
>
> public myJob30sec(Streamer app, IScope scope){
> cscope = scope;
> application = app;
> }
>
> public void execute(ISchedulingService service) throws
> CloneNotSupportedException {
> Iterator<IConnection> iter = application.getConnectionsIter();
> while (iter.hasNext()) {
> IConnection conn = iter.next();
> if (conn.getScope().equals(cscope))
> {
> IStreamService pservice = (IStreamService) conn.getScope().getContext().getBean(IStreamService.BEAN_NAME);
> log.info("@_scheduler_@ service name "+pservice);
> pservice.seek(80000);
> }
> log.info("hi connection");
> }
> }
> }
>
>
> When I start job, I pass to it my main application named "Streamer", and scope of current user ( they can be many ).
>
> In result I need to make some action with stream, which is currently playing for selected user, for example seek forward on 80 seconds.
>
> When I trying do something like this in myJob30sec:
> Streamer app = (Streamer)service;
> the error appear, that:
> Job com.ppfm.myJob30sec at 14c0275 execution failed: org.red5.server.scheduling.QuartzSchedulingService cannot be cast to com.ppfm.Streamer
>
> If it possible, someone help me, or soon I will be punished.
>
>
> Regards,
>
>
> Sergey
>
>
>
> >
> > hi John
> >
> > you can access Application via IScheduleJob interface,
> > but except a few method of StreamService, i think you can not
> > access Appilcation via IStreamService
> >
> > next code is works
> > test it and find your answer
> >
> > public class DummyScheduleJob implements IScheduledJob {
> > private static final Log log = LogFactory.getLog(Application.class);
> > public void execute(ISchedulingService service)
> > throws CloneNotSupportedException {
> > // TODO Auto-generated method stub
> > log.info("dummy schedule joing executed");
> > Application app = (Application)service;
> > Iterator<IConnection> iter = app.getConnectionsIter();
> > while (iter.hasNext()) {
> > IConnection conn = iter.next();
> > log.info("hi connection");
> > }
> > }
> > }
> >
>
> >
> >
> >
>
> > Date: Sun, 18 Nov 2007 12:35:34 +0200
> > From: moonlight at ua.elro.com
> > To: red5 at osflash.org
> > Subject: Re: [Red5] Red5.getConnectionLocal() from SchedulerJob returns null
>
> >
>
> > John,
> >
>
> > Hello :)
> > I still don't understand how to make custom events in application.
> > And after I found attribute with of corresponding JobName, how can I
> > invoke to pause sever stream exactly for this client?
> >
>
> > P.S. maybe someone found better solution, maybe native for Red5, this will be great :)
> >
>
> > Regards,
> >
>
> > Sergey
> >
>
> > >
> > I looked at the title of this email and I did a double take
> > because I had a "saved" email that I was going to send later with
> > pretty much the Exact title. =) I thought gmail accidently sent my saved email hahaha
> >
>
> > anyway, I found that the way Red5.getconnectionlocal() works only
> > allows the local Thread to the IConnection to have access. Since
> > SchedulerJob is a completely separate thread, it does not had access to IConnection.
> >
>
> > I havent found a good solution for this yet, but for now Im
> > setting an attribute to the IClient at appconnect and on the
> > execute() method I loop through the client for the matching attribute and do my thing.
> >
>
> >
>
> >
>
> >
>
> > On Nov 16, 2007 9:22 AM, Mamontov Sergey V. <moonlight at ua.elro.com> wrote:
> >
>
> > Hi,
> >
>
> > During me development I've discovered some new strange thing. When I'm
> > trying to add some Scheduler in my application, calling of
> > Red5.getConnectionLocal(); return me "null" as connection, when
> > calling it from body of ShedulerJob, mean time, same call in main
> > class return me connection info.
> >
>
> > This is small, but main part of class, witch causing strange behavior.
> >
>
> > public class CustomStreamService extends StreamService implements IScheduledJob {
> >
>
> > public void play (String name){
> >
>
> > IConnection conn = Red5.getConnectionLocal();
> > ISchedulingService service = (ISchedulingService)
> > conn.getScope().getContext().getBean(ISchedulingService.BEAN_NAME );
> > ClientData client =
> > ((ClientData)conn.getClient().getAttribute("client"));
> > String clientId = client.getId();
> > log.info("@_StreamService_@ Connection info: "+conn); //<- works
> > great ("Connection RTMPMinaConnection from XX.XXX.XXX.XXX:1245 to
> > XX.XXX.XXX.XXX (in: 3719, out: 5329) ")
> > startPlayBackWatcher();
> > }
> >
>
> > public void startPlayBackWatcher(){
> >
>
> > IConnection conn = Red5.getConnectionLocal();
> > ISchedulingService service = (ISchedulingService)
> > conn.getScope().getContext().getBean(ISchedulingService.BEAN_NAME);
> > ClientData client =
> > ((ClientData)conn.getClient().getAttribute("client"));
> > String jobName1 = service.addScheduledOnceJob(5000, this);
> > }
> >
>
> > public void execute(ISchedulingService service) throws
> > CloneNotSupportedException {
> > IConnection conn = Red5.getConnectionLocal ();
> > pause(true, 15000);
> > log.info("@_StreamService_@ Connection info: "+conn); //<-
> > doesn't work :( ( return "null")
> > }
> >
>
> > What is wrong in my code? Please, help me :)
> > P.S. Actually I'm not really good Java developer, Flash is My life
> > :)
> >
>
> >
>
> > Regards,
> >
>
> > Sergey
> >
>
> >
>
> > _______________________________________________
> > Red5 mailing list
> > Red5 at osflash.org
> > http://osflash.org/mailman/listinfo/red5_osflash.org
> >
>
> >
>
> >
>
> >
>
> > --
> > ?? ???????????,
> > Mamontov mailto:moonlight at ua.elro.com
>
>
> > Explore the seven wonders of the world Learn more!
>
>
> _______________________________________________
> Red5 mailing list
> Red5 at osflash.org
> http://osflash.org/mailman/listinfo/red5_osflash.org
Explore the seven wonders of the world Learn more!
More information about the Red5
mailing list