If using spring boot and wrapping a connection factory as a bean that is referenced in a camel context the PooledConnection ends up destroying the provided exceptionListener.
@Bean
public ConnectionFactory consumerConnectionFactory(ActiveMqProperties properties) {
JmsPoolConnectionFactory poolConnectionFactory = new JmsPoolConnectionFactory();
JmsConnectionFactory jmsConnectionFactory = new JmsConnectionFactory(
properties.getConsumer().getUsername(),
properties.getConsumer().getPassword(),
properties.getConsumer().getBrokerUrl()
);
poolConnectionFactory.setConnectionFactory(jmsConnectionFactory);
// This will never run because its overwritten when the PooledConnection is instantiated:
ExceptionListener exceptionListener = new ExceptionListener() {
@Override
public void onException(JMSException arg0) {
System.out.println("Sample" + arg0.getMessage());
}
};
jmsConnectionFactory.setExceptionListener(exceptionListener);
return poolConnectionFactory;
}
You can fix this erasure by preserving the original exception listener in the PooledConnection constructor:
public PooledConnection(Connection connection) {
final GenericKeyedObjectPoolConfig poolConfig = new GenericKeyedObjectPoolConfig<>();
poolConfig.setJmxEnabled(false);
this.connection = wrap(connection);
try {
this.setParentExceptionListener(connection.getExceptionListener())
this.connection.setExceptionListener(this);
Otherwise the connections have to be taken out of the pool and updated manually with an exception handler inbetween spring bean instantiation and camel route configuration.
If using spring boot and wrapping a connection factory as a bean that is referenced in a camel context the PooledConnection ends up destroying the provided exceptionListener.
You can fix this erasure by preserving the original exception listener in the PooledConnection constructor: public PooledConnection(Connection connection) { final GenericKeyedObjectPoolConfig poolConfig = new GenericKeyedObjectPoolConfig<>();
poolConfig.setJmxEnabled(false);
this.connection = wrap(connection);
try {
this.setParentExceptionListener(connection.getExceptionListener())
this.connection.setExceptionListener(this);
Otherwise the connections have to be taken out of the pool and updated manually with an exception handler inbetween spring bean instantiation and camel route configuration.