2013-10-14 3 views
2

У меня есть брокер ActiveMQ v5.7.0, работающий в Karaf v2.3.3, который я хочу включить для удаленных подключений. Я установил URL-адрес брокера 0.0.0.0:61616, чтобы он мог прослушивать сетевой трафик. Я открыл брандмауэр, чтобы разрешить трафик с клиентских компьютеров. Однако всем удаленным соединениям отказывают. Быстрый netstat, кажется, говорит мне, что брокер не слушает вне локального хоста.Удаленные соединения ActiveMQ отказались, несмотря на 0.0.0.0 в брокере URL

[email protected]:~$ netstat -pan | grep 61616 
tcp6  0  0 127.0.0.1:61616   :::*     LISTEN  -    

Глядя на брокера через Hawtio говорит мне, что URL выглядит так, как это должно быть.

Transport connectors Openwire: tcp://0.0.0.0:61616?maximumConnections=1000&wireformat.maxFrameSize=104857600 

Брандмауэр определенно в порядке, поскольку соединения отклонены, а не просто удаляются.

Брокер правильно отвечает на соединения с localhost.

2013-10-14 17:34:29 Connected to localhost:61613 

Это то ошибка, я получаю от удаленных соединений: -

Error connecting to xxx.xxx.xxx.xxx:61613: IO::Socket::INET: connect: Connection refused at /usr/local/share/perl/5.14.2/Net/Stomp.pm line 102. 

EDIT: выход телнета добавил

Localhost порт 61613

[email protected]:~$ telnet localhost 61613 
Trying 127.0.0.1... 
Connected to localhost. 
Escape character is '^]'. 

Удаленное подключение порт 61613

[email protected]:~$ telnet xxx.xxx.xxx.xxx 61613 
Trying xxx.xxx.xxx.xxx... 
telnet: Unable to connect to remote host: Connection refused 

Localhost порт подключения 61616 (это один интересно)

[email protected]:~$ telnet localhost 61616 
Trying 127.0.0.1... 
Connected to localhost. 
Escape character is '^]'. 
ðActiveMQ  Þ 
MaxFrameSizÿÿÿ CacheSize 
CacheEnabledSizePrefixDisabled MaxInactivityDurationInitalDelay'TcpNoDelayEnabledMaxInactivityDurationu0TightEncodingEnabledStackTraceEnabledPuTTYConnection closed by foreign host. 

Удаленный порт подключения 61616

[email protected]:~$ telnet xxx.xxx.xxx.xxx 61616 
Trying xxx.xxx.xxx.xxx... 
telnet: Unable to connect to remote host: Connection refused 

EDIT: удаленный сервер karaf войти выход добавил

2013-10-15 19:00:46,599 | ERROR | c.event.invited] | faultJmsMessageListenerContainer | .DefaultMessageListenerContainer 909 | 69 - org.springframework.jms - 3.2.4.RELEASE | Could not refresh JMS Connection for destination 'Consumer.notifications.VirtualTopic.event.invited' - retrying in 5000 ms. Cause: Error while attempting to add new Connection to the pool; nested exception is javax.jms.JMSException: Could not connect to broker URL: tcp://xxx.xxx.xxx.xxx:61616. Reason: java.net.ConnectException: Connection refused 

Вот брокер.xml.

<?xml version="1.0" encoding="UTF-8"?> 
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" 
    xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0" 
    xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0" 
    xmlns:amq="http://activemq.apache.org/schema/core"> 

    <ext:property-placeholder /> 

    <broker xmlns="http://activemq.apache.org/schema/core" 
    brokerName="jellyfish-messaging" 
    dataDirectory="${karaf.data}/activemq/localhost" 
    useShutdownHook="false" 
    persistent="true" 
    schedulerSupport="true" 
    startAsync="true"> 

    <destinationPolicy> 
     <policyMap> 
     <policyEntries> 
      <policyEntry topic=">" producerFlowControl="true" memoryLimit="1mb"> 
      <pendingSubscriberPolicy> 
       <vmCursor /> 
      </pendingSubscriberPolicy> 
      </policyEntry> 
      <policyEntry queue=">" producerFlowControl="true" memoryLimit="1mb"> 
      </policyEntry> 
     </policyEntries> 
     </policyMap> 
    </destinationPolicy> 

    <persistenceAdapter> 
     <kahaDB directory="${karaf.data}/activemq/localhost/kahadb"/> 
    </persistenceAdapter> 

    <systemUsage> 
     <systemUsage> 
      <memoryUsage> 
       <memoryUsage limit="64 mb"/> 
      </memoryUsage> 
      <storeUsage> 
       <storeUsage limit="100 gb"/> 
      </storeUsage> 
      <tempUsage> 
       <tempUsage limit="50 gb"/> 
      </tempUsage> 
     </systemUsage> 
    </systemUsage> 

    <!-- The transport connectors ActiveMQ will listen to --> 
    <transportConnectors> 
     <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB --> 
     <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireformat.maxFrameSize=104857600"/> 
     <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireformat.maxFrameSize=104857600"/> 
    </transportConnectors> 

    </broker> 

    <bean id="jmsConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> 
    <property name="brokerURL" value="tcp://0.0.0.0:61616" /> 
    </bean> 

    <bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory"> 
    <property name="maxConnections" value="8" /> 
    <property name="maximumActive" value="500" /> 
    <property name="connectionFactory" ref="jmsConnectionFactory" /> 
    </bean> 

    <bean id="resourceManager" class="org.apache.activemq.pool.ActiveMQResourceManager" init-method="recoverResource"> 
    <property name="transactionManager" ref="transactionManager" /> 
    <property name="connectionFactory" ref="jmsConnectionFactory" /> 
    <property name="resourceName" value="activemq.localhost" /> 
    </bean> 

    <bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration"> 
    <property name="connectionFactory" ref="pooledConnectionFactory" /> 
    <property name="transacted" value="false" /> 
    <property name="concurrentConsumers" value="10" /> 
    </bean> 

    <bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent"> 
    <property name="configuration" ref="jmsConfig" /> 
    </bean> 

    <reference id="transactionManager" interface="javax.transaction.TransactionManager" /> 

    <service ref="pooledConnectionFactory" interface="javax.jms.ConnectionFactory"> 
    <service-properties> 
     <entry key="name" value="localhost"/> 
    </service-properties> 
    </service> 
</blueprint> 

Может ли кто-нибудь сказать мне, что мне не хватает?

Спасибо,

J.

+0

Можете ли вы попросить telnetting как на 61613, так и на 61616 с локального и удаленного хоста и добавить вывод к вопросу? –

+0

Готово - большое спасибо. –

+0

Все это выглядит нормально с точки зрения ActiveMQ. Это определенно похоже на проблему с брандмауэром - если вы работаете на Linux-машине, у вас может быть локальный, такой как iptables. Telnetting in to JMX (1099) должен подтвердить это - в любой конфигурации нет ничего, что блокирует его из удаленных ящиков. –

ответ

1

Я решил эту проблему. Это не было проблемой для брандмауэра и конфигурации ActiveMQ.

Файл Karaf kar, в котором был определен брокер ActiveMQ, включал функцию activemq-web-console. Мы не использовали эту функцию, так как мы поклонники Hawtio, поэтому никогда не настраивали ее.

В соответствии с this blog post, консоль была настроена по умолчанию, включая прослушивание на порту 61616. Это означало, что два брокера находились в состоянии гонки при запуске, а обычно определяемая веб-консолью выигрывала. Поскольку по умолчанию он не настроен для удаленного доступа, он блокировал порт только для соединений localhost.

Подкатегория - это каталог под названием $ {activemq.data} (буквально) в домашнем каталоге Karaf, содержащий второй репозиторий Kahadb. Вся наша конфигурация брокера была настроена на использование каталога , и мы никогда специально не задавали переменные среды ActiveMQ, поэтому это заставило нас искать, откуда мог прийти второй брокер.

Возможно, это произошло быстрее, если бы мы сделали activemq: list внутри сеанса Karaf, поскольку в нем было перечислено два брокера.

Простое решение - удалите activemq-web-console из функций XML.

Смежные вопросы