[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [xmlblaster] Subscriber getting first message only - big clue!



The way I use the pattern is to have static methods of the class used to
create instances... so it's not really a Singleton pattern since there's
no initial instance.  Here's a trivial example:


public class Global
{
	private static String[] savedArgs;

	public static Global create(String[] args)
	{
		savedArgs = args;
		return new Global();
	}

	public static Global create()
	{
		// maybe check to make sure savedArgs is non-null.
		// if it's null, setup some defaults first.
		return new Global();
	}

	private Global()
	{
		// uses savedArgs to initialize
	}
}

-----Original Message-----
From: Michael Atighetchi [mailto:matighet at bbn.com] 
Sent: Tuesday, April 08, 2003 10:11 AM
To: xmlblaster at server.xmlblaster.org
Subject: Re: [xmlblaster] Subscriber getting first message only - big
clue!


I like the factory pattern you described. The factory would then be a
singelton, right ?

Michael


On Tue, Apr 08, 2003 at 09:09:34AM -0500, David Hooker wrote:
> Global is confusing because it acts like a singleton... but isn't.
I'd
> suggest that it be made into a factory - make the constructors private
> and provide static methods to create each connection-specific global.
> In order to avoid having to pass in the args everytime, have one of
the
> static factory methods take the config parameters and store them as
> static members.  Have another no-arg factory method which creates a
> global using those stored values.  I think this is much cleaner.
> 
> From: Marcel Ruff [mailto:mr at marcelruff.info] 
> Sent: Tuesday, April 08, 2003 2:43 AM
> To: xmlblaster at server.xmlblaster.org
> Subject: Re: [xmlblaster] Subscriber getting first message only - big
> clue!
> 
> 
> Hi,
> 
> HelloWorld5.java uses two connections, here
> the second connection clones a global:
> 
>    ...
>    Global globReceiver = glob.getClone(null);
>    receiver = globReceiver.getXmlBlasterAccess();
> 
>    ConnectQos qos = new ConnectQos(receiver.getGlobal());
>    ConnectReturnQos conRetQos = receiver.connect(qos, new I_Callback()
{
>    ...
> 
> The getClone(String[]) is probably the way to go.
> 
> The Global is a 'local stack' of execution, the
> local settings of a client connection (and as well
> the local settings of an embedded xmlBlaster server).
> With this approach you can have many independent
> client connections and embedded servers in the same
> JVM.
> 
> We don't use ANY singletons in xmlBlaster (apart from
> finals) as they are only causing problems.
> Global can be seen as a connection specific singleton.
> 
> Since this is now the second time that somebody
> gets confused about using different global instances
> for different connections we need to think about
> the design or a better naming ... any ideas?
> 
> 
> David Hooker wrote:
> > Well, if I call "new Global()" more than once, it prints a warning
> > message to the screen.  So the best thing I see is to do something
> like
> > this:
> > 
> > 	global = new Global(Global.instance());
> 
> I have set this to deprecated, please use getClone() instead.
> 
> thanks
> 
> Marcel
> > 
> > I hope that's the preferred way to create multiple Globals.  The
3-arg
> > constructor is very cumbersome.
> 

-- 
matighet at bbn.com   BBN Technologies