我的spring-boot项目,使用jms在Queue中发布消息,并使用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容器时,在spring boot主类
中进行如下配置@SpringBootApplication public class Application扩展了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:scheme java not recognized
是否有任何配置?