NameNotFoundException: подключение к удаленной очереди через logstash

У меня есть развернутая очередь на JBoss EAP 7.1 (определенная в standalone.xml), которой управляет ActiveMQ Artemis (имя модуля xmlns = "urn: jboss: domain: messaging-activemq: 2.0"), и в то же время я хочу подключиться в эту очередь с плагином JMS в logstash (с JNDI) для использования сообщений, отправленных развернутым приложением на моем сервере JBoss, но когда я пытаюсь получить NameNotFoundException для фабрики соединений (свойство jndi_name в файле конфигурации logstash ).

Я попытался найти записи JNDI фабрик соединений по умолчанию, но даже тогда это не сработало.

Итак, я хочу знать, создаются ли фабрики соединений брокером сообщений или существуют по умолчанию для клиента? Потому что, если я не ошибаюсь, фабрика соединений - это единственный способ подключиться к брокеру и очереди и исправить, если я ошибаюсь, но они должны существовать по умолчанию для клиента.

Надеюсь, вы мне поможете, ребята, вот мой файл конфигурации logstash:

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:

<subsystem xmlns="urn:jboss:domain:messaging-activemq:2.0">
    <server name="default">
        <security-setting name="#">
            <role consume="true" create-non-durable-queue="true" delete-non-durable-queue="true" name="guest" send="true"/>
        </security-setting>
        <address-setting dead-letter-address="jms.queue.DLQ" expiry-address="jms.queue.ExpiryQueue" max-size-bytes="10485760" message-counter-history-day-limit="10" name="#" page-size-bytes="2097152"/>
        <http-connector endpoint="http-acceptor" name="http-connector" socket-binding="http"/>
        <http-connector endpoint="http-acceptor-throughput" name="http-connector-throughput" socket-binding="http">
            <param name="batch-delay" value="50"/>
        </http-connector>
        <in-vm-connector name="in-vm" server-id="0">
            <param name="buffer-pooling" value="false"/>
        </in-vm-connector>
        <remote-connector name="netty" socket-binding="remote-messaging"/>
        <http-acceptor http-listener="default" name="http-acceptor"/>
        <http-acceptor http-listener="default" name="http-acceptor-throughput">
            <param name="batch-delay" value="50"/>
            <param name="direct-deliver" value="false"/>
        </http-acceptor>
        <in-vm-acceptor name="in-vm" server-id="0">
            <param name="buffer-pooling" value="false"/>
        </in-vm-acceptor>
        <remote-acceptor name="netty" socket-binding="messaging"/>
        <jms-queue entries="java:/jms/queue/ExpiryQueue" name="ExpiryQueue"/>
        <jms-queue entries="java:/jms/queue/DLQ" name="DLQ"/>
        <jms-queue entries="queue/clientPending" name="clientPending"/>
        <jms-queue name="AuditTrailMDB" entries="queue/AuditTrailMDB"/>
        <connection-factory connectors="in-vm" entries="java:/ConnectionFactory" name="InVmConnectionFactory"/>
        <pooled-connection-factory connectors="netty" entries="java:jboss/exported/jms/RemoteConnectionFactory" name="RemoteConnectionFactory" user="admin" password="admin"/>
        <pooled-connection-factory connectors="in-vm" entries="java:/JmsXA java:jboss/DefaultJMSConnectionFactory" name="activemq-ra" transaction="xa"/>
        <connection-factory connectors="in-vm" entries="/ApplicationsQueueConnectionFactory" name="ApplicationsQueueConnectionFactory"/>
    </server>
</subsystem>
...
<socket-binding name="messaging" port="5445"/>
...

бревно:

[WARN ][logstash.inputs.jms      ][main] JMS Consumer Died {:exception=>"Java::JavaxNaming::NameNotFoundException", :exception_message=>"queueConnectionFactory", :backtrace=>["org.apache.activemq.artemis.jndi.ReadOnlyContext.lookup(org/apache/activemq/artemis/jndi/ReadOnlyContext.java:236)", "javax.naming.InitialContext.lookup(javax/naming/InitialContext.java:417)", "java.lang.reflect.Method.invoke(java/lang/reflect/Method.java:498)", "org.jruby.javasupport.JavaMethod.invokeDirectWithExceptionHandling(org/jruby/javasupport/JavaMethod.java:455)", "org.jruby.javasupport.JavaMethod.invokeDirect(org/jruby/javasupport/JavaMethod.java:316)", "home.Alternant.logstash.vendor.bundle.jruby.$2_dot_5_dot_0.gems.jruby_minus_jms_minus_1_dot_3_dot_0_minus_java.lib.jms.connection.initialize

person Stanly Smith    schedule 23.01.2020    source источник


Ответы (1)


В вашей конфигурации есть несколько ошибок как для JBoss EAP, так и для Logstash.


Начнем с JBoss EAP ...

Сначала вы изменили конфигурацию RemoteConnectionFactory по умолчанию на следующую:

<pooled-connection-factory connectors="netty" entries="java:jboss/exported/jms/RemoteConnectionFactory" name="RemoteConnectionFactory" user="admin" password="admin"/>

Это неверно. Удаленный клиент не может использовать pooled-connection-factory, только клиент в той же JVM, что и сервер приложений (например, MDB, которому необходимо отправить сообщение). Вместо этого вы должны использовать конфигурацию по умолчанию:

<connection-factory name="RemoteConnectionFactory" entries="java:jboss/exported/jms/RemoteConnectionFactory" connectors="http-connector"/>

Во-вторых, ваша AuditTrailMDB очередь не будет доступна удаленным клиентам. Вот его конфигурация:

<jms-queue name="AuditTrailMDB" entries="queue/AuditTrailMDB"/>

Ему нужна новая запись JNDI в пространстве имен java:jboss/exported/, чтобы он был доступен удаленным клиентам (например, как у RemoteConnectionFactory). Поэтому вы должны использовать это:

<jms-queue name="AuditTrailMDB" entries="queue/AuditTrailMDB java:jboss/exported/AuditTrailMDB"/>

Теперь о 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'
}

Это неверно. Когда 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'

В-третьих, вы используете неправильные банки. Вот ваша текущая конфигурация:

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-client-all "uber" jar, который доступен здесь. Тогда ваша конфигурация будет выглядеть так:

require_jars=> ['/home/Alternant/logstash/dependencies/wildfly-client-all-7.1.0.GA-redhat-11.jar']
person Justin Bertram    schedule 23.01.2020
comment
и для jndi_name следует ли мне сохранить указанную фабрику соединений, потому что она все еще показывает мне NameNotFoundException для queueConnectionFactory - person Stanly Smith; 23.01.2020
comment
Я забыл обновить эту часть. Я обновил свой ответ исправлением. - person Justin Bertram; 23.01.2020
comment
спасибо, это сработало, но теперь я получаю AMQ119031: Unable to validate user, и я уже создал пользователя с правами администратора в качестве пользователя приложения с add-user.sh и дал ему роль гостя, которая упоминается в standalone.xml. Есть ли у вас какие-либо советы по этому поводу? - person Stanly Smith; 23.01.2020
comment
Для этого вам следует создать новый вопрос. - person Justin Bertram; 23.01.2020