Я работаю над проектом Spring Boot (1.5.14.RELEASE) и обновил его до Springboot3. У меня есть очередь OracleAQ, и я использовал XmlMessageListenerContainer (потому что мой payloadtype — "SYS". "XMLTYPE" в таблице очереди) из org.springframework.data:spring-data-oracle:1.2.1.RELEASE со старой версией, но теперь мне нужно использовать DefaultMessageListenerContainer из org.springframework:spring-jms:6.1.11, потому что в пакете нет прослушивателя XML. При запуске проекта с новой реализацией возникает ошибка
"o.s.j.l.DefaultMessageListenerContainer: не удалось настроить вызов прослушивателя сообщений JMS для назначения 'XYZ.APPOINTMENT_QUEUE' - пытаюсь восстановить. Причина: JMS-137: необходимо указать фабрику полезных нагрузок для назначений с полезными нагрузками ADT"
Я пытался добавить спецификацию, как показано ниже, но это не сработало
Вот моя старая реализация
Вот моя новая реализация
OracleConnection oracleConnection = (OracleConnection) dataSource.getConnection();
Map<String, Class<?>> typeMap = oracleConnection.getTypeMap();
typeMap.put("SYS.XMLTYPE", Class.forName("oracle.xdb.XMLTypeFactory"));
org.springframework.data.jdbc.jms.listener.oracle
@Bean( destroyMethod = "destroy" )
public XmlMessageListenerContainer listenerContainer( final ConnectionFactory connectionFactory,
final CustomDatabaseConfiguration databaseConfiguration,
final DataSourceTransactionManager dataSourceTransactionManager,
final OMessageListener oMessageListener,
final XmlMessageConverter xmlMessageConverter )
{
final XmlMessageListenerContainer listenerContainer = new XmlMessageListenerContainer();
listenerContainer.setConnectionFactory( connectionFactory );
listenerContainer.setDestinationName( "XYZ.APPOINTMENT_QUEUE" );
listenerContainer.setMaxConcurrentConsumers( databaseConfiguration.getMaximumPoolSize() );
listenerContainer.setMessageConverter( xmlMessageConverter );
listenerContainer.setMessageListener( oMessageListener );
listenerContainer.setSessionAcknowledgeMode( Session.SESSION_TRANSACTED );
listenerContainer.setSessionTransacted( true );
listenerContainer.setTransactionManager( dataSourceTransactionManager );
return listenerContainer;
}
org.springframework.jms.listener.DefaultMessageListenerContainer
@Bean(destroyMethod = "destroy")
public DefaultMessageListenerContainer listenerContainer(final ConnectionFactory connectionFactory,
final OracleDataSourceConfiguration.CustomDatabaseConfiguration databaseConfiguration,
final DataSourceTransactionManager dataSourceTransactionManager,
final OMessageListener oMessageListener
) {
final DefaultMessageListenerContainer listenerContainer = new DefaultMessageListenerContainer();
listenerContainer.setConnectionFactory(connectionFactory);
listenerContainer.setDestinationName("XYZ.APPOINTMENT_QUEUE");
listenerContainer.setMaxConcurrentConsumers(databaseConfiguration.getMaximumPoolSize());
listenerContainer.setMessageListener(oMessageListener);
listenerContainer.setSessionAcknowledgeMode(Session.SESSION_TRANSACTED);
listenerContainer.setSessionTransacted(true);
listenerContainer.setTransactionManager(dataSourceTransactionManager);
return listenerContainer;
}