Проблема с полезными нагрузками ADT Spring-Jms DefaultMessageListenerContainer

Я работаю над проектом 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;
  }
Савватий
Вопрос задан26 апреля 2024 г.

1 Ответ

Ваш ответ

Загрузить файл.