Jboss NameNotFoundException:通过日志存储连接到远程队列
我在JBoss EAP 7.1(在Jboss NameNotFoundException:通过日志存储连接到远程队列,jboss,queue,jms,logstash,activemq-artemis,Jboss,Queue,Jms,Logstash,Activemq Artemis,我在JBoss EAP 7.1(在standalone.xml中定义)上部署了一个队列,该队列由ActiveMQ Artemis(模块名称xmlns=“urn:JBoss:domain:messaging ActiveMQ:2.0”)管理,同时我希望使用logstash中的JMS插件(使用JNDI)连接到该队列用于使用JBoss服务器上部署的应用程序发送的消息,但当我尝试使用时,会得到连接工厂的NameNotFoundException(logstash conf文件中的属性jndi_name)
standalone.xml
中定义)上部署了一个队列,该队列由ActiveMQ Artemis(模块名称xmlns=“urn:JBoss:domain:messaging ActiveMQ:2.0”)管理,同时我希望使用logstash中的JMS插件(使用JNDI)连接到该队列用于使用JBoss服务器上部署的应用程序发送的消息,但当我尝试使用时,会得到连接工厂的NameNotFoundException
(logstash conf文件中的属性jndi_name
)
我试图找到默认的连接工厂JNDI条目,但即使这样也不起作用
所以我想知道连接工厂是由MessageBroker创建的,还是默认存在于客户端?因为如果我没有弄错的话,连接工厂是连接到代理和队列的唯一方法,如果我弄错了,请更正,但是客户端默认情况下它们必须存在
我希望你们能帮我这里是我的日志文件:
input {
jms {
# Logstash Configuration Settings.
include_header => false
include_properties => false
include_body => true
use_jms_timestamp => false
destination => "AuditTrailMDB"
pub_sub => false
# JNDI Settings
jndi_name => 'queueConnectionFactory'
jndi_context => {
'java.naming.factory.initial' => 'org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory'
'java.naming.security.principal' => 'admin'
'java.naming.provider.url' => 'tcp://localhost:5445?type=QUEUE_CF'
'java.naming.security.credentials' => 'admin'
}
# Jar files to be imported
require_jars=> ['/home/Alternant/logstash/dependencies/jboss-client.jar',
'/home/Alternant/logstash/dependencies/artemis-ra.jar',
'/home/Alternant/logstash/dependencies/ironjacamar-core-impl.jar',
'/home/Alternant/logstash/dependencies/ironjacamar-core-api.jar',
'/home/Alternant/logstash/dependencies/ironjacamar-common-api.jar']
}
}output{
stdout{}
}
下面是我在standalone.xml
中的队列定义:
...
...
日志:
JBoss EAP和Logstash的配置都存在一些问题
让我们从JBoss EAP开始 首先,您将
远程连接工厂的默认配置更改为:
这是不正确的。远程客户端不能使用池连接工厂
,只有与应用服务器位于同一JVM中的客户端才能使用(例如,需要发送消息的MDB)。您应该改用默认配置:
jndi_context => {
'java.naming.factory.initial' => 'org.wildfly.naming.client.WildFlyInitialContextFactory'
'java.naming.security.principal' => 'admin'
'java.naming.provider.url' => 'http-remoting://127.0.0.1:8080'
'java.naming.security.credentials' => 'admin'
}
Second,您的AuditTrailMDB
队列将不可用于远程客户端。以下是它的配置:
jndi_context => {
'java.naming.factory.initial' => 'org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory'
'java.naming.security.principal' => 'admin'
'java.naming.provider.url' => 'tcp://localhost:5445?type=QUEUE_CF'
'java.naming.security.credentials' => 'admin'
}
require_jars=> ['/home/Alternant/logstash/dependencies/jboss-client.jar',
'/home/Alternant/logstash/dependencies/artemis-ra.jar',
'/home/Alternant/logstash/dependencies/ironjacamar-core-impl.jar',
'/home/Alternant/logstash/dependencies/ironjacamar-core-api.jar',
'/home/Alternant/logstash/dependencies/ironjacamar-common-api.jar']
它需要在java:jboss/exported/
名称空间中有一个新的JNDI条目,以便对远程客户端可用(例如,像RemoteConnectionFactory
has)。因此,您应该使用:
现在是Logstash
首先,您使用了错误的JNDI属性。您正在使用的属性用于ActiveMQ Artemis JNDI实现。以下是您当前的配置:
jndi_context => {
'java.naming.factory.initial' => 'org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory'
'java.naming.security.principal' => 'admin'
'java.naming.provider.url' => 'tcp://localhost:5445?type=QUEUE_CF'
'java.naming.security.credentials' => 'admin'
}
require_jars=> ['/home/Alternant/logstash/dependencies/jboss-client.jar',
'/home/Alternant/logstash/dependencies/artemis-ra.jar',
'/home/Alternant/logstash/dependencies/ironjacamar-core-impl.jar',
'/home/Alternant/logstash/dependencies/ironjacamar-core-api.jar',
'/home/Alternant/logstash/dependencies/ironjacamar-common-api.jar']
这是不正确的。当ActiveMQ Artemis嵌入到JBoss EAP中时,EAP本身处理所有JNDI查找。因此,您应该改用此配置:
jndi_context => {
'java.naming.factory.initial' => 'org.wildfly.naming.client.WildFlyInitialContextFactory'
'java.naming.security.principal' => 'admin'
'java.naming.provider.url' => 'http-remoting://127.0.0.1:8080'
'java.naming.security.credentials' => 'admin'
}
当然,这假设您已将适当的admin
用户添加到EAP
其次,您的连接工厂JNDI名称不正确。您当前使用的是:
jndi_name => 'queueConnectionFactory'
您应该改为使用此选项:
jndi_name => 'jms/RemoteConnectionFactory'
第三个,您使用的罐子不正确。以下是您当前的配置:
jndi_context => {
'java.naming.factory.initial' => 'org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory'
'java.naming.security.principal' => 'admin'
'java.naming.provider.url' => 'tcp://localhost:5445?type=QUEUE_CF'
'java.naming.security.credentials' => 'admin'
}
require_jars=> ['/home/Alternant/logstash/dependencies/jboss-client.jar',
'/home/Alternant/logstash/dependencies/artemis-ra.jar',
'/home/Alternant/logstash/dependencies/ironjacamar-core-impl.jar',
'/home/Alternant/logstash/dependencies/ironjacamar-core-api.jar',
'/home/Alternant/logstash/dependencies/ironjacamar-common-api.jar']
你根本不需要这些。您可以使用可用的wildfly客户端all
“uber”jar简化配置。然后,您的配置将如下所示:
require_jars=> ['/home/Alternant/logstash/dependencies/wildfly-client-all-7.1.0.GA-redhat-11.jar']
对于jndi_name
我是否应该保留所提到的连接工厂,因为它仍然显示NameNotFoundException
对于queueConnectionFactory
我忘了更新该部分。我已经用更正更新了我的答案。谢谢,它起作用了,但现在我得到了AMQ119031:无法验证用户
,我已经用add user.sh
将管理员用户创建为应用程序用户,并给了他standalone.xml
中提到的角色guest。你对此有什么建议吗?你应该创建一个新问题。