Создается CONSUMER_NAME при каждом запуске - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть spring-jms, интегрированный с многопользовательской Oracle Advanced Queue, и каждый раз, когда приложение запускается, добавляется новый потребитель с именем TSUB_1_[RANDOM], как TSUB_1_9FA550C4DC828DA9E05347F.

Есть ли способ указать имя подписчика / потребителя, которое будет использоваться интеграцией?

Я безуспешно пытался внедрить SubscriptionNameProvider на приемнике, установив true setSubscriptionDurable и setSubscriptionShared, указав setSubscriptionName на MessageListenerContainer, указав bindAgent во время создания на AQjmsSession и некоторых других.

Это моя конфигурация:

@EnableJms
@Configuration
public class JMSConfiguration {
    public static final String QUEUE_NAME = "MY_Q";
    public static final String QUEUE_USER = "QUEUE_USER_SCHEMA";
    public static final String QUEUE_CONSUMER_NAME = "JAVA_SPRING_CONSUMER";

    @Autowired
    private SpringReceiver springReceiver;

    @Bean
    public QueueConnectionFactory connectionFactory(DataSource dataSource) throws Exception {
        return AQjmsFactory.getQueueConnectionFactory(dataSource);
    }

    @Bean
    public DefaultMessageListenerContainer messageListenerContainer(ConnectionFactory conFactory, DataSource dataSource) {
        AQCustomPayloadMessageListenerContainer dmlc = new AQCustomPayloadMessageListenerContainer();
        dmlc.setConnectionFactory(conFactory);

        dmlc.setDestinationName(QUEUE_NAME);
        dmlc.setSessionTransacted(true);
        dmlc.setPubSubDomain(true);

        DataSourceTransactionManager manager = new DataSourceTransactionManager();
        manager.setDataSource(dataSource);
        dmlc.setTransactionManager(manager);

        dmlc.setMessageListener(springReceiver);
        return dmlc;
    }
}

Реализация слушателя:

public class AQCustomPayloadMessageListenerContainer extends DefaultMessageListenerContainer {

    @Override
    protected MessageConsumer createConsumer(Session s, Destination destination) throws JMSException {
        AQjmsSession session = (AQjmsSession) s;
        MessageConsumer consumer = session.createConsumer(destination, getMessageSelector(), T_NOTIFICAELEMENTO.getORADataFactory(), null, isPubSubNoLocal());
        return consumer;

    }
}

И мой приемник:

@Component
public class SpringReceiver implements SessionAwareMessageListener<Message> {

    public void onMessage(Message message, Session session) throws JMSException {
        AQjmsAdtMessage msg = (AQjmsAdtMessage) message;

        try {
            CUSTOM_TYPE obj = (CUSTOM_TYPE) msg.getAdtPayload();
            System.out.println("Data:"+ obj.getData());
            message.acknowledge();
            session.commit();
        } catch (JMSException e1) {
            e1.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
...