[Red5] Red5.getConnectionLocal() from SchedulerJob returns null

Mamontov Sergey V. moonlight at ua.elro.com
Tue Nov 20 10:43:06 PST 2007


Andy,


When I will need to use IServiceCapableConnection it works great. But
how to get control over IStreamService?

Such construction crashes scheduler:
(IStreamService) streams = (IStreamService)c;
streams.pause(true, 30000)

How can I implement this features in Scheduler? What about me, my
result with it is zero. Maybe You will be more lucky.

I need to control playback on server-side.

Thanks,

Sergey

> If you are building your own player, that is easy.
> Just send your player a signal to change.

> I use the scheduler for important timing too.
> Here I use it to send ping times every 6 or 10 seconds.

> http://www.thebitstream.com/omnicron/rooms.swf

> The ping is displayed.

> The scheduler runs on the scope I give it to ping 
> The source code is here for both swf and red5 app.

> http://redsandy.googlecode.com/svn/trunk/red5World/webapps/omnicron/


> -----Original Message-----
> From: red5-bounces at osflash.org [mailto:red5-bounces at osflash.org] On
> Behalf Of Mamontov Sergey V.
> Sent: Tuesday, November 20, 2007 8:47 AM
> To: Andy
> Subject: Re: [Red5] Red5.getConnectionLocal() from SchedulerJob returns
> null

> Still nothing :(

> Thanks who try to help me with this useless Scheduler, it can't be
> used for our main target.

> Now I've returned to ServerStream. There is only one thing witch don't
> allow us to use PlayList fully.

> After above 60 seconds of streaming increasing latency, and at the end
> of playback it looks really strange.

> Our target is to: paste to non registered users every 30 seconds some
> promo, and controling when was played first 30 seconds for signed up
> users.

> Can anybody handle in this question?

> Thanks,

> Sergey

>> No, there is no local connection to the thread. You scheduled the
> thread
>> through the services. This is normal. It will be null.


>> Id do something like this to make it work real fast, but their might
> be
>> better ways.




>> public void streamPlaylistItemPlay(IPlaylistSubscriberStream stream,
>>         IPlayItem item, boolean isLive)
>> {
>>
> Red5.getConnectionLocal().GetClient().setAttribute("playing",item.name);
>> PLaylistTimer PLayTimer=new
>> PLaylistTimer(Red5.getConnectionLocal().GetClient().getScope());

>> String jobname=addscheduledJob(10000, PLayTimer)
>> PlayTimer.name= jobname;

>> Red5.getConnectionLocal().GetClient().setAttribute("jobname",
> jobname);

>>         
>> }


>> Then your thread execute




>> Iterator<IConnection>clientSet=m_r5IScope.getConnections();
>>                         
>> while(clientSet.hasNext())
>> {
>> IConnection c=clientSet.next();
>> try
>> {
>>        
>> if(c.getcClient().getAttribute("jobname","").equals(this.name))
>>         red5.getconnectionlocal().close();//or Pause
>> }



>> -----Original Message-----
>> From: red5-bounces at osflash.org [mailto:red5-bounces at osflash.org] On
>> Behalf Of Mamontov Sergey V.
>> Sent: Monday, November 19, 2007 10:33 PM
>> To: Andy
>> Subject: Re: [Red5] Red5.getConnectionLocal() from SchedulerJob
> returns
>> null

>> Andy,

>> Yes, this works great :)
>> But if I try call from execute some function of my application, for
>> example:
>> public void testMethod(IConnection conn){
>>  log.info("Getting connection. Connection is: "
>>  +Red5.getConnectionLocal()) //<-  Getting connection. Connection is:
>>  null
>>  log.info("Application IConnect: "+conn) //<- it will trace needed
>>  connection, but doesn't have accesses to already created Clients,
>>  connections.
>> }
>>  I can get may variables and that's all what is possible
>>  to do.

>>  Andy, try make something like this and you will understand me :) Try
>>  for example pause VOD playback :)


>>  Regards,

>>  Sergey

>>> Sergey

>>> I have created a class on the server to represent the client ,
> holding
>>> all his important stuff, as well as a reference to the IConnection.
>>> The list arrays make this work very easy, and I have even implemented
>>> the very use you describe. But there is a better way. 

>>> The easier way is for your IScheduledJob class to take the
> Application
>>> scope or some scope in the constructor, and store a reference. When
> it
>>> is executed, it already has all the clients and connections for the
>>> scope it was given.



>>> -----Original Message-----
>>> From: red5-bounces at osflash.org [mailto:red5-bounces at osflash.org] On
>>> Behalf Of Mamontov Sergey V.
>>> Sent: Monday, November 19, 2007 1:19 PM
>>> To: kyoung wan park
>>> Subject: Re: [Red5] Red5.getConnectionLocal() from SchedulerJob
>> returns
>>> null

>>> 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! 


>>> _______________________________________________
>>> Red5 mailing list
>>> Red5 at osflash.org
>>> http://osflash.org/mailman/listinfo/red5_osflash.org



>> _______________________________________________
>> Red5 mailing list
>> Red5 at osflash.org
>> http://osflash.org/mailman/listinfo/red5_osflash.org



> _______________________________________________
> Red5 mailing list
> Red5 at osflash.org
> http://osflash.org/mailman/listinfo/red5_osflash.org
                  mailto:moonlight at ua.elro.com




More information about the Red5 mailing list