3. SingleConnectionFactory
SingleConnectionFactory类实现了ConnectionFactory, QueueConnectionFactory, TopicConnectionFactory接口。
SingleConnectionFactory的createConnection()方法总是返回相同的Connection对象,如果出现Exception,共享连接可以自动的恢复。可以通过SingleConnectionFactory的构造函数中传入Connection对象或者ConnectionFactory对象,用来创建被代理的连接对象。SingleConnectionFactory.createConnection方法返回的连接是个代理,它忽略了对stop和close方法的调用(连接会在SingleConnectionFactory.destroy方法中关闭)。
SingleConnectionFactory的reconnectOnException属性用来指定是否在连接抛出JMSException的时候,对连接进行重置,重置后如果再调用createConnection方法,那么会返回一个新的连接。
3.1 CachingConnectionFactory
CachingConnectionFactory继承了SingleConnectionFactory,增加了MessageProducer和Session的缓存功能。
内部类CachedSessionInvocationHandler实现了java.lang.reflect.InvocationHandler接口。当我们调用getSession()方法去获得一个缓存的Session,会产生一个缓存的Session代理对象。
SingleConnectionFactory类实现了ConnectionFactory, QueueConnectionFactory, TopicConnectionFactory接口。
SingleConnectionFactory的createConnection()方法总是返回相同的Connection对象,如果出现Exception,共享连接可以自动的恢复。可以通过SingleConnectionFactory的构造函数中传入Connection对象或者ConnectionFactory对象,用来创建被代理的连接对象。SingleConnectionFactory.createConnection方法返回的连接是个代理,它忽略了对stop和close方法的调用(连接会在SingleConnectionFactory.destroy方法中关闭)。
protected Connection getSharedConnectionProxy(Connection target) {
List<Class> classes = new ArrayList<Class>(3);
classes.add(Connection.class);
if (target instanceof QueueConnection) {
classes.add(QueueConnection.class);
}
if (target instanceof TopicConnection) {
classes.add(TopicConnection.class);
}
return (Connection) Proxy.newProxyInstance(
Connection.class.getClassLoader(),
classes.toArray(new Class[classes.size()]),
new SharedConnectionInvocationHandler(target));
}
SingleConnectionFactory的reconnectOnException属性用来指定是否在连接抛出JMSException的时候,对连接进行重置,重置后如果再调用createConnection方法,那么会返回一个新的连接。
3.1 CachingConnectionFactory
CachingConnectionFactory继承了SingleConnectionFactory,增加了MessageProducer和Session的缓存功能。
private int sessionCacheSize = 1; //默认对Session的缓存为1
private boolean cacheConsumers = true; //默认缓存消息消费对象
private boolean cacheConsumers = true; //默认缓存消息生产对象
内部类CachedSessionInvocationHandler实现了java.lang.reflect.InvocationHandler接口。当我们调用getSession()方法去获得一个缓存的Session,会产生一个缓存的Session代理对象。