Как создать JNDI JMS-поиск во встроенном tomcat:Spring boot
Проект Spring-boot, который у меня есть, публикует сообщения в очереди с использованием jms и использует Apache ActiveMq для прослушивания.
Когда используется внешний сервер tomcat, приведенные ниже записи делаются в конфигурационном файле tomcat и принимаются сообщения JMS.
<Resource name="jms/myQCF"
auth="Container"
type="org.apache.activemq.ActiveMQConnectionFactory"
description="JMS Connection Factory"
factory="org.apache.activemq.jndi.JNDIReferenceFactory"
brokerURL="tcp://localhost:61616"
brokerName="LocalActiveMQBroker"/>
<Resource name="jms/myAPIQueue" auth="Container" type="org.apache.activemq.command.ActiveMQQueue"
description="pubTomyAPIQueue"
factory="org.apache.activemq.jndi.JNDIReferenceFactory" physicalName="API.QUEUE"/>
При использовании встроенного контейнера tomcat, настройте, как показано ниже, в основном классе весенней загрузки.
@SpringBootApplication открытый класс Приложение расширяет SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
@Bean
public TomcatEmbeddedServletContainerFactory tomcatFactory() {
return new TomcatEmbeddedServletContainerFactory() {
@Override
protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(
Tomcat tomcat) {
tomcat.enableNaming();
return super.getTomcatEmbeddedServletContainer(tomcat);
}
@Override
protected void postProcessContext(Context context) {
ContextResource resource = new ContextResource();
resource.setName("jms/myQCF");
resource.setType("org.apache.activemq.jndi.ActiveMQInitialContextFactory");
resource.setProperty("factory", "org.apache.activemq.jndi.JNDIReferenceFactory");
resource.setProperty("brokerName","LocalActiveMQBroker");
resource.setAuth("Container");
context.getNamingResources().addResource(resource);
resource.setName("jms/myAPIQueue");
resource.setType("org.apache.activemq.command.ActiveMQQueue");
resource.setProperty("factory", "org.apache.activemq.jndi.JNDIReferenceFactory");
resource.setAuth("Container");
context.getNamingResources().addResource(resource);
}
};
@Bean(destroyMethod="")
public JndiTemplate jndiTemplate() {
JndiTemplate jndiTemplate = new JndiTemplate();
Properties properties = new Properties();
properties.setProperty("java.naming.factory.initial", "org.apache.activemq.jndi.ActiveMQInitialContextFactory");
properties.setProperty("java.naming.provider.url", "vm://localhost?broker.persistent=false");
jndiTemplate.setEnvironment(properties);
return jndiTemplate;
}
@Bean(destroyMethod="")
public ConnectionFactory jmsConnectionFactory() throws IllegalArgumentException, NamingException {
JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();
jndiObjectFactoryBean.setJndiName("java:comp/env/jms/myQCF");
jndiObjectFactoryBean.setJndiTemplate(jndiTemplate());
jndiObjectFactoryBean.setProxyInterface(ConnectionFactory.class);
jndiObjectFactoryBean.setLookupOnStartup(false);
jndiObjectFactoryBean.afterPropertiesSet();
return (ConnectionFactory)jndiObjectFactoryBean.getObject();
}
@Bean(destroyMethod="")
public JndiObjectFactoryBean queueForPep() throws IllegalArgumentException, NamingException {
JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();
jndiObjectFactoryBean.setJndiName("java:comp/env/jms/myAPIQueue");
jndiObjectFactoryBean.setJndiTemplate(jndiTemplate());
jndiObjectFactoryBean.setProxyInterface(ConnectionFactory.class);
jndiObjectFactoryBean.setLookupOnStartup(false);
jndiObjectFactoryBean.afterPropertiesSet();
return jndiObjectFactoryBean;
}
}
Сообщение получает сбой javax.xml.ws.WebServiceException: javax.naming.NamingException: схема Java не распознана
Есть ли какая-либо конфигурация, чтобы сделать?