我有一个正在运行的springboot代码,当该代码部署在STS Tomcat服务器上时,它充当侦听器并使用Jboss EAP 7队列中的消息。
我现在需要在存在队列的jboss EAP 7服务器上部署相同的代码。
部署代码时,我收到一条消息,说明战争已经成功部署。之后,将打印“无错误或成功”日志。
但是,当我检查队列时,它没有显示任何使用者。我尝试在调试模式下检查日志,得到的只是以下消息。 如何在jboss上部署它,是否需要任何特定的配置?如果我们在Tomcat上部署并从jboss Q中消费,则相同的代码也可以正常工作
2019-06-13 22:05:30,715 FINE [javax.enterprise.resource.webcontainer.jsf.config] (ServerService Thread Pool -- 133) Completed initializing Mojarra (2.2.12-jbossorg-2 ) for context ''{0}''
2019-06-13 22:05:30,715 FINE [javax.enterprise.resource.webcontainer.jsf.timing] (ServerService Thread Pool -- 133) [TIMING] - [1025ms] : Initialization of context
2019-06-13 22:05:30,716 INFO [org.wildfly.extension.undertow] (ServerService Thread Pool -- 133) WFLYUT0021: Registered web context: /
2019-06-13 22:05:30,730 INFO [org.jboss.as.server] (ServerService Thread Pool -- 129) WFLYSRV0010: Deployed "Sample-0.0.1.war" (runtime-name : "Sample-0.0.1.war")
2019-06-13 22:05:30,730 DEBUG [org.jboss.as.server.deployment.scanner] (ServerService Thread Pool -- 133) Updating status after deployment notification for Sample-0.0.1.war
2019-06-13 22:05:32,942 DEBUG [org.apache.activemq.artemis.core.server] (activemq-expiry-reaper-thread) Cannot expire from jms.queue.ExpiryQueue into jms.queue.ExpiryQueue
我的队列配置如下:
@Bean JmsListenerContainerFactory<?> myFactory(ConnectionFactory connectionFactory,
DefaultJmsListenerContainerFactoryConfigurer configurer) throws NamingException {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(getConnectionFactory());
return factory;
}
private ConnectionFactory getConnectionFactory() throws NamingException {
Context namingContext = null;
final Properties env = new Properties();
String DEFAULT_CONNECTION_FACTORY = "jms/RemoteConnectionFactory";
String JBOSSQ_USERNAME = "admin";
String JBOSSQ_PASSWORD = "admin";
String INTIAL_CONTEXT_FACTORY = "org.jboss.naming.remote.client.InitialContextFactory";
String PROVIDER_URL = "http-remoting://127.10.10.101:8080";
env.put(Context.INITIAL_CONTEXT_FACTORY,INTIAL_CONTEXT_FACTORY);
env.put(Context.PROVIDER_URL,System.getProperty(Context.PROVIDER_URL,PROVIDER_URL));
try {
namingContext = new InitialContext(env);
} catch (NamingException e) {
e.printStackTrace();
}
ConnectionFactory connectionFactory = (ConnectionFactory) namingContext.lookup(DEFAULT_CONNECTION_FACTORY);
UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter = new UserCredentialsConnectionFactoryAdapter();
userCredentialsConnectionFactoryAdapter.setUsername(JBOSSQ_USERNAME);
userCredentialsConnectionFactoryAdapter.setPassword(JBOSSQ_PASSWORD);
userCredentialsConnectionFactoryAdapter.setTargetConnectionFactory(connectionFactory);
return userCredentialsConnectionFactoryAdapter;
}
我的消费者代码如下:
@JmsListener(destination = "testingQ", containerFactory = "myFactory")
public void receiveMessage(String msg) {
System.out.println("Received :" + msg);
答案 0 :(得分:0)
根据代码中提供的配置,您使用jms/RemoteConnectionFactory
作为默认连接工厂,这意味着您试图连接到在远程JMS服务器上创建的队列。如果您的应用程序部署在一台服务器上,而JMS则位于另一台服务器(远程服务器)上,则它将起作用。这就是为什么当您的应用程序在Tomcat服务器上并且JBoss服务器上的JMS上时,此方法成功工作的原因。
要解决此问题,您必须使用InVMConnectionFactory
。创建本地连接工厂和相关配置,并在代码中引用创建的连接工厂。如果创建的连接工厂的JNDI条目为“ jms / ConnectionFactory”,那么您的配置将如下所示:
String DEFAULT_CONNECTION_FACTORY = "jms/ConnectionFactory";
注意:还要检查您的其他配置(例如PROVIDER_URL(protocol + host + port),上下文工厂)是否正确。