#java #spring-boot #maven #gradle #jms-topic
#java #весенняя загрузка #maven #gradle #jms-тема
Вопрос:
Я пытаюсь загрузить небольшое приложение-подписчика, используя gradle и springboot, для прослушивания сообщений, размещенных в теме ActiveMQ. Я замечаю, что всякий раз, когда я пытаюсь запустить приложение, оно не может зарегистрироваться в качестве подписчика на ActiveMQ и прослушивать сообщения, публикуемые в теме. Процесс завершается без трассировки стека. Однако аналогичная кодовая база на github (ссылка-2), но со структурой сборки maven, похоже, подключается и получает опубликованные тематические сообщения на ActiveMQ (localhost). После долгой отладки проблемы я так и не смог определить первопричину. Ниже приведены фрагменты кода для справки:-
Любой вклад будет оценен с благодарностью. Спасибо!
Примечание: Все запуски выполняются из eclipse в среде Java 1.8.
JMSTopicSubscriber.java
@Component
public class JMSTopicSubscriber
{
@JmsListener(destination = "${jms.enrol.topic.name}")
public void receiveMessage(Exam exam)
{
System.out.println("Received message: " exam.toString());
}
}
JMSConfig.java
@EnableJms
@Configuration
@ComponentScan(basePackages = { "experiment.jms.subscriber" })
@PropertySource("classpath:application.properties")
public class JMSConfig
{
@Value("${spring.activemq.broker-url}")
String m_activeMQBrokerUrl;
@Bean
public ConnectionFactory connectionFactory()
{
ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory();
cf.setBrokerURL(m_activeMQBrokerUrl);
return cf;
}
@Bean
public JmsListenerContainerFactory<?> jmsListenerContainerFactory()
{
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setPubSubDomain(true);
factory.setMessageConverter(messageConverter());
factory.setConnectionFactory(connectionFactory());
return factory;
}
@Bean
public MessageConverter messageConverter()
{
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
converter.setTargetType(MessageType.TEXT);
converter.setTypeIdPropertyName("_type");
return converter;
}
}
ExperimentTopicJmsSubscriberApplication.java
@SpringBootApplication
@ComponentScan(basePackages = { "experiment.jmsSubscriber" })
public class ExperimentTopicJmsSubscriberApplication
{
public static void main(String[] args)
{
SpringApplication.run(ExperimentTopicJmsSubscriberApplication.class, args);
}
}
build.gradle
plugins {
id 'org.springframework.boot' version '2.4.1'
id 'io.spring.dependency-management' version '1.0.10.RELEASE'
id 'java'
}
group = 'experiment.jms.topic'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
// ActiveMQ Dependencies.
implementation 'org.springframework.boot:spring-boot-starter-activemq'
}
test {
useJUnitPlatform()
}
application.properties
spring.activemq.broker-url = tcp://localhost:61616
#topic name
jms.enrol.topic.name = allexams
spring.jms.pub-sub-domain=true
##Configure concurrent listeners using the spring.jms.concurrency and spring.jms.max-concurrency properties.
#spring.jms.concurrency property configures the minimum number of concurrent consumers.
spring.jms.listener.concurrency=2
#spring.jms.max-concurrency configures the maximum number of concurrent consumers.
spring.jms.listener.max-concurrency=2
Структура пакета
Модель данных
public class Exam implements Serializable
{
private String m_examName;
private int m_examYear;
public Exam()
{
}
public Exam( String examName, int examYear )
{
this.m_examName = examName;
this.m_examYear = examYear;
}
public String getExamName()
{
return this.m_examName;
}
public int getExamYear()
{
return this.m_examYear;
}
public String toString()
{
return "(Exam Name: " this.m_examName ", "
"Exam Year: " Integer.toString(this.m_examYear) ")";
}
}
Ссылки
Ответ №1:
Я решил проблему, удалив явные теги аннотаций проверки компонентов. Теперь приложение-подписчик прослушивает тему в activemq.