Jboss NameNotFoundException:通过日志存储连接到远程队列

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)

我在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

我试图找到默认的连接工厂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。你对此有什么建议吗?你应该创建一个新问题。