#activemq-artemis #jolokia
Вопрос:
- У меня есть брокер Artemis (2.17), работающий на моей машине разработчика для локального тестирования.
- Из веб-консоли я извлек запрос на получение имен всех очередей.
Когда я выполняю запрос из консоли браузера, я получаю результат JSON, подобный этому:
{
"request": {
"mbean": "org.apache.activemq.artemis:broker="MyBroker"",
"arguments": [
"ANYCAST"
],
"type": "exec",
"operation": "getQueueNames(java.lang.String)"
},
"value": [
"DLQ",
"ExpiryQueue"
],
"timestamp": 1624274952,
"status": 200
}
Когда я выполняю один и тот же запрос из своего кода, я получаю совсем другой результат:
{
"request": {
"type": "version"
},
"value": {
"agent": "1.6.2",
"protocol": "7.2",
"config": {
"listenForHttpService": "true",
"authIgnoreCerts": "false",
"agentId": "192.168.1.41-30064-15b82644-servlet",
"debug": "false",
"agentType": "servlet",
"policyLocation": "file:/C:/Artemis/MyBroker/etc//jolokia-access.xml",
"agentContext": "/jolokia",
"serializeException": "false",
"mimeType": "text/plain",
"dispatcherClasses": "org.jolokia.http.Jsr160ProxyNotEnabledByDefaultAnymoreDispatcher",
"authMode": "basic",
"authMatch": "any",
"streaming": "true",
"canonicalNaming": "true",
"historyMaxEntries": "10",
"allowErrorDetails": "false",
"allowDnsReverseLookup": "true",
"realm": "jolokia",
"includeStackTrace": "false",
"mbeanQualifier": "qualifier=hawtio",
"useRestrictorService": "false",
"debugMaxEntries": "100"
},
"info": {
"product": "jetty",
"vendor": "Eclipse",
"version": "9.4.27.v20200227"
}
},
"timestamp": 1624274809,
"status": 200
}
Jsr160ProxyNotEnabledByDefaultAnymoreDispatcher швы очень странные. Но при поиске этого имени я не смог найти ничего полезного. Также я не могу найти никакой полезной информации в журналах Artemis.
Вот мой код:
using System;
using System.Net.Http;
using System.Text;
using System.Threading;
const String username = "admin";
const String password = "password";
var encoded = Convert.ToBase64String( Encoding.GetEncoding( "ISO-8859-1" )
.GetBytes( username ":" password ) );
var url = "http://localhost:8161/console/jolokia/?maxDepth=7amp;maxCollectionSize=50000amp;ignoreErrors=trueamp;canonicalNaming=false";
var http = new HttpClient();
http.BaseAddress = new("http://localhost:8161/");
http.DefaultRequestHeaders.Add( "Authorization", "Basic " encoded );
http.DefaultRequestHeaders.Add( "Origin", "http://localhost:8161/" );
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new(url),
Content = new StringContent( "{"type":"exec","mbean":"org.apache.activemq.artemis:broker=\"MyBroker\"","operation":"getQueueNames(java.lang.String)","arguments":["ANYCAST"]}" )
};
request.Content.Headers.ContentType = new("text/json");
var response = await http.SendAsync( request, HttpCompletionOption.ResponseHeadersRead, CancellationToken.None );
if ( response.IsSuccessStatusCode )
{
var content = await response.Content.ReadAsStringAsync();
Console.WriteLine( content );
}
else
Console.WriteLine( "Request failed...." );
Console.ReadLine();
- В
bootstrap.xml
привязке установлено значение 0.0.0.0, которое должно быть в порядке. jolokia-access.xml
содержится<allow-origin>*://localhost*</allow-origin>
, что должно быть нормально, но просто чтобы убедиться, что я заменил его<allow-origin>*</allow-origin>
Есть ли что-то, что мне нужно настроить, чтобы это сработало?
Ответ №1:
Запросы Jolokia могут быть отправлены двумя способами: либо в виде запроса HTTP GET, в этом случае параметры запроса полностью кодируются в URL. Или как запрос POST, в котором запрос помещается в полезную нагрузку JSON в теле HTTP-запроса. Смотрите Протокол Jolokia для получения более подробной информации.
Когда служба Jolokia не получит никакого запроса, она ответит информацией об услуге, т. е.:
{
"request": {
"type": "version"
},
"value": {
...
Чтобы запросить имена очередей с помощью запроса HTTP GET
curl -H "Origin:http://localhost:8161" -u admin:admin http://localhost:8161/console/jolokia/exec/org.apache.activemq.artemis:broker="MyBroker"/getQueueNames/ANYCAST
Чтобы запросить имена очередей с помощью запроса HTTP POST
curl -X POST -H "Content-Type: application/json" -H "Origin:http://localhost:8161" -u admin:admin http://localhost:8161/console/jolokia -d '{"type" : "EXEC", "mbean" : "org.apache.activemq.artemis:broker="MyBroker"", "operation" : "getQueueNames", "arguments" : ["ANYCAST"]}'
Комментарии:
1. Большое спасибо. В этом была проблема… Не знаю, как я мог пропустить что-то настолько очевидное.
Ответ №2:
Ваш код использует HTTP GET
, но он использует фиксированный URL (т. Е. http://localhost:8161/console/jolokia/?maxDepth=7amp;maxCollectionSize=50000amp;ignoreErrors=trueamp;canonicalNaming=false
и полезную нагрузку (т. Е. {"type":"exec","mbean":"org.apache.activemq.artemis:broker="MyBroker","operation":"getQueueNames(java.lang.String)","arguments":["ANYCAST"]}"
). Это не соответствует протоколу Джолокии.
Если вы используете HTTP GET
, то все должно быть в самом URL-адресе, предположительно, так же, как в консоли вашего браузера. Например, используйте это:
http://localhost:8161/console/jolokia/exec/org.apache.activemq.artemis:broker="MyBroker"/getQueueNames/ANYCAST