By the way, I'm not suggesting you should really implement it the
way I described below. It is too simplistic.
e.g. Problems:
1) You can't subclass the bridge for other reasons
2) You can't mix jndi sources with non jndi destinations
i.e. it lacks "aspectization", really it is a problem
of abstraction.
Better would be to make a class in jboss-integration say
public interface JMSConfiguration
{
ConnectionFactory getConnectionFactory();
XAConnectionFactory getXAConnectionFactory();
Destination getDestination();
}
that can be implemented in all sorts of different ways
(including using the JNDIProvider) then inject
that into the bridge
public class Bridge
{
setSource(JMSConfiguration source);
setTarget(JMSConfiguration target);
}
On Wed, 2007-06-27 at 15:51 +0200, Adrian wrote:
On Wed, 2007-06-27 at 14:01 +0100, Tim Fox wrote:
> The JBoss Messaging Bridge MBean has dependencies on JMSProviderLoader
> since it uses these to connect to its source and target destinations.
>
> Are you suggesting we move the Bridge MBean into the AS project?
No, I'm suggesting you think about providing a clean api
which can be used by the AS to integrate with its configuration
mechanisms.
Trying to do integration in your project just leads
to JBAS-1796 style problems and bad api!
IOC 101
Why doesn't the bridge just take connection factories
and destinations as injections (javabean setters)?
That is a trivial "no dependency required"
configuration api.
public SimpleBridge
{
setSourceConnectionFactory(XAConnectionFactory cf) {};
setTargetConnectionFactory(XAConnectionFactory cf) {};
setSourceDestination(Destination destination) {};
setTargetDestination(Destination destination) {};
...
}
ANY FORM OF INTEGRATION IS NOW EASY
For standalone ease of use, you could subclass the simple bridge
with a version that does something like (psuedo code):
public JNDIBridge extends SimpleBridge
{
public void setTargetDestinationJndiName(String targetJNDI) {}
public void setJNDITargetProperties(Properties targetProperties) { }
// Create lifecycle that does base setters from jndi configuration
public void create() throws Exception
{
if (targetJNDI == null)
throw new IllegalStateException("Target jndi name not set!");
InitialContext context;
if (targetProperties == null)
context = new InitialContext();
else
context = new InitialContext(targetProperties);
try
{
Destination d = (Destination) context.lookup(targetJNDI);
setTargetDestination(d);
etc....
}
finally
{
context.close();
}
}
}
Which is basically what the JMSProvider really does anyway!
JBOSS INTEGRATION IS ALSO TRIVIAL
In the appserver we could have a JNDIProvider based version
to integrate with the current way of configuring jms servers
in one place.
public JNDIProviderBridge extends SimpleBridge
{
public void setSourceJNDIProviderName(String jndiName) {}
public void setTargetJNDIProviderName(String jndiName) {}
public void setSourceDestination(String jndiName) {}
public void setTargetDestination(String jndiName) {}
etc....
}
--
xxxxxxxxxxxxxxxxxxxxxxxxxxxx
Adrian Brock
Chief Scientist
JBoss, a division of Red Hat
xxxxxxxxxxxxxxxxxxxxxxxxxxxx