У меня есть сервер, на котором весь трафик на любой общедоступный IP-адрес проходит через прокси. Я настроил https_proxy
и http_proxy
.
Я хочу подключиться к ActiveMQ Artemis, работающему в облаке, с общедоступным IP-адресом.
Теперь, когда я нажимаю команду curl
в консоли управления ActiveMQ, я получаю ответ, что означает, что я могу связаться с сервером.
<!DOCTYPE html>
<html>
<head>
<meta charset = "UTF-8" />
<title>Hawtio</title>
<base href='/activemq/'>
<link id = "favicon" rel = "icon" type = "image/x-icon" href = "img/favicon.ico?v=1">
<link rel = "stylesheet" href = "css/lib-6a1e4ce9ea.css"/>
<link rel = "stylesheet" href = "css/app-9653e9917c.css"/>
<!-- branding -->
<link id = "branding" rel = "stylesheet" type = "text/css" href = "" />
<script src = "js/lib-e53c220218.js" defer></script>
<script src = "js/app-fafe513f4b.js" defer></script>
</head>
<body>
<hawtio-login></hawtio-login>
</body>
</html>
Если я подключаюсь к серверу ActiveMQ по телнету, время ожидания истекает.
telnet <ip> 61616
брокер.xml
<acceptor name = "artemis">tcp://0.0.0.0:61616?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;amqpMinLargeMessageSize=102400;protocols=CORE,AMQP,STOMP,HORNETQ,MQTT,OPENWIRE;useEpoll=true;amqpCredits=1000;amqpLowCredits=300;amqpDuplicateDetection=true;supportAdvisory=false;suppressInternalManagementObjects=false</acceptor>
Я пытался настроить Netty по протоколу HTTP, но время ожидания все равно истекло.
artemis producer --url "tcp://<ip>:61616?httpEnabled=true" --user "artemis" --password "artemis" --message-count 1
Я получаю эту ошибку:
Exception in thread "main" javax.jms.JMSException: Failed to create session factory
at org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory.createConnectionInternal(ActiveMQConnectionFactory.java:915)
at org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory.createConnection(ActiveMQConnectionFactory.java:314)
at org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory.createConnection(ActiveMQConnectionFactory.java:309)
at org.apache.activemq.artemis.cli.commands.messages.Producer.execute(Producer.java:142)
at org.apache.activemq.artemis.cli.Artemis.internalExecute(Artemis.java:219)
at org.apache.activemq.artemis.cli.Artemis.execute(Artemis.java:165)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at org.apache.activemq.artemis.boot.Artemis.execute(Artemis.java:157)
at org.apache.activemq.artemis.boot.Artemis.main(Artemis.java:64)
Caused by: ActiveMQNotConnectedException[errorType=NOT_CONNECTED message=AMQ219007: Cannot connect to server(s). Tried with all available servers.]
at org.apache.activemq.artemis.core.client.impl.ServerLocatorImpl.createSessionFactory(ServerLocatorImpl.java:735)
at org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory.createConnectionInternal(ActiveMQConnectionFactory.java:913)
... 11 more
Добавил рассматриваемую ошибку. Что касается того, почему я пытаюсь использовать HTTP - я могу curl
консоль, подразумевает, что сеть через уровень 7 проходит через брандмауэр, но когда я telnet, я вижу тайм-аут, подразумевающий, что уровень 4 не работает. Хотя не существует жесткого правила использования только HTTP.
Это указывает на то, что проблема в сетевой инфраструктуре, не так ли? Что может с этим сделать брокер?
Да, согласен. На уровне 4 речь идет о сетевой инфраструктуре. Но поскольку уровень 7 работает, я подумал об HTTP.
И да, если на уровне 7 нет возможности, мне все равно придется поговорить с инфраструктурной командой. Я просто искал более простой вариант.
Что произойдет, если вы пойдете к брокеру напрямую, а не через прокси?
HTTP на самом деле не является хорошим протоколом для обмена сообщениями, поскольку он был разработан для совершенно другого варианта использования. Если есть шанс избежать его использования, попробуйте. Он действительно предназначен для сред, где у вас нет абсолютно никакого выбора. В любом случае, я не думаю, что клиент или брокер действительно могут что-то сделать, поскольку проблема, похоже, где-то в сети.
С этого сервера, на котором установлен этот прокси, не удается связаться с сервером AMQ. Я получаю ту же ошибку. Если я попытаюсь использовать любую другую машину без ограничений сети, я легко смогу связаться с брокером (брокер общедоступен в Интернете).
Я понимаю. Хорошо, в этом случае это будет отсортировано из сетевой инфраструктуры, чтобы включить также уровень 4.
HTTP на самом деле не является хорошим протоколом для обмена сообщениями, поскольку он был разработан для совершенно другого варианта использования. Если есть шанс избежать его использования, попробуйте. Он действительно предназначен для сред, где у вас нет абсолютно никакого выбора. В любом случае, я не думаю, что клиент или брокер действительно могут что-то сделать, поскольку проблема, похоже, где-то в сети.
Почему вы пытаетесь использовать HTTP для обмена сообщениями? Почему бы просто не использовать стандартный протокол обмена сообщениями, такой как AMQP или STOMP, или даже специальный протокол обмена сообщениями ActiveMQ, такой как Core или OpenWire?