У меня есть 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();
}
}
}