Демон Storm UI предоставляет REST API, которое позволяет взаимодействовать с кластером Storm, включая получение метрик данных и конфигурационной информации, а также операции управления, такие как запуск или остановка топологий.
REST API возвращает ответы в формате JSON и поддерживает JSONP. Клиенты могут передавать параметр запроса callback для обёртки JSON в функцию обратного вызова.
Примечание: Рекомендуется игнорировать незадокументированные элементы в ответе JSON, так как будущие версии Storm могут больше не поддерживать эти элементы.
REST API является частью демона UI Storm (запускается командой storm ui
) и поэтому работает на том же хосте и порту, что и Storm UI (демон UI часто запускается на том же хосте, что и демон Nimbus). Порт настраивается параметром ui.port
, который по умолчанию установлен на 8080
(см. defaults.yaml).
Основной URL API будет таким:
http://<ui-host>:<ui-port>/api/v1/...
Вы можете использовать инструмент, такой как curl
, чтобы общаться с REST API:
# Получить конфигурацию кластера.
# Примечание: Мы предполагаем, что ui.port настроен на значение по умолчанию 8080.
$ curl http://<ui-host>:8080/api/v1/cluster/configuration## Подмена пользователя в защищённой среде
В защищённой среде аутентифицированный пользователь может подменяться другим пользователем. Для подмены пользователя отправитель должен передать параметр doAsUser
или заголовок с значением, установленным на пользователя, от имени которого требуется выполнить запрос. Дополнительную информацию о настройке правил подмены и авторизации см. в SECURITY.MD. REST API использует те же конфигурации и ACLs, что и Nimbus.Примеры:
1. http://ui-daemon-host-name:8080/api/v1/topology/wordcount-1-1425844354\?doAsUser=testUSer1
2. curl 'http://localhost:8080/api/v1/topology/wordcount-1-1425844354/activate' -X POST -H 'doAsUser:testUSer1'
Возвращает конфигурацию кластера.
Пример ответа (не включает все поля данных):
{
"dev.zookeeper.path": "/tmp/dev-storm-zookeeper",
"topology.tick.tuple.freq.secs": null,
"topology.builtin.metrics.bucket.size.secs": 60,
"topology.fall.back.on.java.serialization": true,
"topology.max.error.report.per.interval": 5,
"zmq.linger.millis": 5000,
"topology.skip.missing.kryo.registrations": false,
"storm.messaging.netty.client_worker_threads": 1,
"ui.childopts": "-Xmx768m",
"storm.zookeeper.session.timeout": 20000,
"nimbus.reassign": true,
"topology.trident.batch.emit.interval.millis": 500,
"storm.messaging.netty.flush.check.interval.ms": 10,
"nimbus.monitor.freq.secs": 10,
"logviewer.childopts": "-Xmx128m",
"java.library.path": "/usr/local/lib:/opt/local/lib:/usr/lib",
"topology.executor.send.buffer.size": 1024
}
Возвращает сводную информацию о кластере, такую как время работы Nimbus или количество супервизоров.
Поля ответа:
Поле | Значение | Описание |
---|---|---|
stormVersion | Строка | Версия Storm |
nimbusUptime | Строка | Время работы Nimbus |
supervisors | Целое число | Количество работающих супервизоров |
topologies | Целое число | Количество работающих топологий |
slotsTotal | Целое число | Общее количество доступных слотов рабочих процессов |
slotsUsed | Целое число | Количество используемых слотов рабочих процессов |
slotsFree | Целое число | Количество свободных слотов рабочих процессов |
executorsTotal | Целое число | Общее количество исполнителей |
tasksTotal | Целое число | Общее количество задач |
{
"stormVersion": "0.9.2-incubating-SNAPSHOT",
"nimbusUptime": "3m 53s",
"supervisors": 1,
"slotsTotal": 4,
"slotsUsed": 3,
"slotsFree": 1,
"executorsTotal": 28,
"tasksTotal": 28
}
Возвращает сводную информацию обо всех супервизорах.
Поля ответа:
Поле | Значение | Описание |
---|---|---|
id | Строка | Идентификатор супервизора |
host | Строка | Имя хоста супервизора |
uptime | Строка | Отображает, сколько времени работает супервизор |
slotsTotal | Целое число | Общее количество доступных слотов рабочих процессов для данного супервизора |
slotsUsed | Целое число | Количество используемых слотов рабочих процессов для данного супервизора |
slotsFree | Целое число | Количество свободных слотов рабочих процессов для данного супервизора |
Пример ответа:
{
"supervisors": [
{
"id": "0b879808-2a26-442b-8f7d-23101e0c3696",
"host": "10.11.1.7",
"uptime": "5m 58s",
"slotsTotal": 4,
"slotsUsed": 3,
"slotsFree": 1
}
]
}
Возвращает сводную информацию обо всех топологиях.
Поля ответа:
Поле | Значение | Описание |
---|---|---|
id | Строка | Идентификатор топологии |
name | Строка | Название топологии |
status | Строка | Состояние топологии |
uptime | Строка | Отображает, сколько времени работает топология |
tasksTotal | Целое число | Общее количество задач для данной топологии |
workersTotal | Целое число | Количество используемых рабочих процессов для данной топологии |
executorsTotal | Целое число | Количество используемых исполнителей для данной топологии |
{ |
"topologies": [
{
"id": "WordCount3-1-1402960825",
"name": "WordCount3",
"status": "ACTIVE",
"uptime": "6m 5s",
"tasksTotal": 28,
"workersTotal": 3,
"executorsTotal": 28
}
]
}
Возвращает информацию о топологии и статистику. Замените `id` на идентификатор топологии.
Параметры запроса:
|Параметр |Значение |Описание |
|---------|-----------|----------|
|id |Строка (обязательный)| Идентификатор топологии |
|window |Строка. Значение по умолчанию: all-time| Продолжительность окна для метрик в секундах|
|sys |Строка. Значения: 1 или 0. Значение по умолчанию: 0| Управляет включением части статистики системы в ответ|
```Поля ответа:|Поле|Значение|Описание|
|---|---|---|
|id|String|Идентификатор топологии|
|name|String|Название топологии|
|uptime|String|Время работы топологии|
|status|String|Текущий статус топологии, например "АКТИВНАЯ"|
|tasksTotal|Integer|Общее количество задач для данной топологии|
|workersTotal|Integer|Количество рабочих процессов, используемых для данной топологии|
|executorsTotal|Integer|Количество исполнителей, используемых для данной топологии|
|msgTimeout|Integer|Количество секунд, в течение которых тьюпл считается действительным перед тем, как спаут будет считать его неудачным|
|windowHint|String|Значение параметра окна в формате "чч мм сс". По умолчанию значение равно "Все время"|
|topologyStats|Массив|Массив всех статистических данных, связанных с топологией, по каждому временному окну|
|topologyStats.windowPretty|String|Продолжительность в формате HH:MM:SS|
|topologyStats.window|String|Запрошенное пользователем временное окно для метрик|
|topologyStats.emitted|Long|Количество отправленных сообщений за данное окно|
|topologyStats.transferred|Long|Количество переданных сообщений за данное окно|
|topologyStats.completeLatency|String (значение типа double возвращается в формате строки)|Общее время задержки при обработке сообщения|
|topologyStats.acked|Long|Количество подтвержденных сообщений за данное окно|
|topologyStats.failed|Long|Количество неудачных сообщений за данное окно|
|spouts|Массив|Массив всех компонентов спаута в топологии|
|spouts.spoutId|String|Идентификатор спаута|
|spouts.|```markdown
executors|Integer|Количество исполнителей для данного спаута|
spouts.emitted|Long|Количество отправленных сообщений за данное окно|
spouts.completeLatency|String (значение типа double возвращается в формате строки)|Общее время задержки при обработке сообщения|
spouts.transferred|Long|Общее количество переданных сообщений за данное окно|
spouts.tasks|Integer|Общее количество задач для данного спаута|
spouts.lastError|String|Отображает последнюю ошибку, произошедшую в данном спауте|
spouts.errorLapsedSecs|Integer|Количество секунд, прошедших с момента последней ошибки в данном спауте|
spouts.errorWorkerLogLink|String|Ссылка на журнал рабочего процесса, который сообщил об ошибке|
spouts.acked|Long|Количество подтвержденных сообщений|
spouts.failed|Long|Количество неудачных сообщений|
bolts|Массив|Массив компонентов болта в топологии|
bolts.boltId|String|Идентификатор болта|
bolts.capacity|String (значение типа double возвращается в формате строки)|Это значение указывает на количество сообщений, выполненных * среднее время выполнения / временной интервал|
bolts.processLatency|String (значение типа double возвращается в виде строки)|Среднее время, затраченное болтом на подтверждение сообщения после его получения|
bolts.executeLatency|String (значение типа double возвращается в виде строки)|Среднее время выполнения метода execute болтом|
bolts.executors|Integer|Количество задач-исполнителей в компоненте болта|
bolts.tasks|Integer|Количество экземпляров болта|
acked| Long |Количество подтвержденных кортежей| |bolts.failed| Long |Количество неудачных кортежей| |bolts.lastError| String |Показывает последнюю ошибку, произошедшую в болне| |bolts.errorLapsedSecs| Integer |Количество секунд, прошедших с момента последней ошибки в болне| |bolts.errorWorkerLogLink| String |Ссылка на лог работы, который сообщил об исключении| |bolts.emitted| Long |Количество выданных кортежей|Примеры:```no-highlight
{
"name": "WordCount3",
"id": "WordCount3-1-1402960825",
"workersTotal": 3,
"window": "600",
"status": "АКТИВНАЯ",
"tasksTotal": 28,
"executorsTotal": 28,
"uptime": "29м 19с",
"msgTimeout": 30,
"windowHint": "10м 0с",
"topologyStats": [
{
"windowPretty": "10м 0с",
"window": "600",
"emitted": 397960,
"transferred": 213380,
"completeLatency": "0. 000",
"acked": 213460,
"failed": 0
},
{
"windowPretty": "3ч 0м 0с",
"window": "10800",
"emitted": 1190260,
"transferred": 638260,
"completeLatency": "0. 000",
"acked": 638280,
"failed": 0
},
{
"windowPretty": "1д 0ч 0м 0с",
"window": "86400",
"emitted": 1190260,
"transferred": 638260,
"completeLatency": "0. 000",
"acked": 638280,
"failed": 0
},
{
"windowPretty": "За всё время",
"window": ":all-time",
"emitted": 1190260,
"transferred": 638260,
"completeLatency": "0. 000",
"acked": 638280,
"failed": 0
}
],
"spouts": [
{
"executors": 5,
"emitted": 28880,
"completeLatency": "0. 000",
"transferred": 28880,
"acked": 0,
"spoutId": "spout",
"tasks": 5,
"lastError": "",
"errorLapsedSecs": null,
"failed": 0
}
],
"bolts": [
{
"executors": 12,
"emitted": 184580,
"transferred": 0,
"acked": 184640,
"executeLatency": "0. 048",
"tasks": 12,
"executed": 184620,
"processLatency": "0. 043",
"boltId": "count",
"lastError": "",
"errorLapsedSecs": null,
"capacity": "0. 003",
"failed": 0
},
{
"executors": 8,
"emitted": 184500,
"transferred": 184500,
"acked": 28820,
"executeLatency": "0. 024",
"tasks": 8,
"executed": 28780,
``````json
{
"processLatency": "2.112",
"boltId": "split"
}
```
```markdown
LastError: ""
ErrorLapsedSecs: null
Capacity: "0.000"
Failed: 0
]
},
"configuration": {
"storm.id": "WordCount3-1-1402960825",
"dev.zookeeper.path": "/tmp/dev-storm-zookeeper",
"topology.tick.tuple.freq.secs": null,
"topology.builtin.metrics.bucket.size.secs": 60,
"topology.fall.back.on.java.serialization": true,
"topology.max.error.report.per.interval": 5,
"zmq.linger.millis": 5000,
"topology.skip.missing.kryo.registrations": false,
"storm.messaging.netty.client_worker_threads": 1,
"ui.childopts": "-Xmx768m",
"storm.zookeeper.session.timeout": 20000,
"nimbus.reassign": true,
"topology.trident.batch.emit.interval.millis": 500,
"storm.messaging.netty.flush.check.interval.ms": 10,
"nimbus.monitor.freq.secs": 10,
"logviewer.childopts": "-Xmx128m",
"java.library.path": "/usr/local/lib:/opt/local/lib:/usr/lib",
"topology.executor.send.buffer.size": 1024,
"storm.local.dir": "storm-local",
"storm.messaging.netty.buffer_size": 5242880,
"supervisor.worker.start.timeout.secs": 120,
"topology.enable.message.timeouts": true,
"nimbus.cleanup.inbox.freq.secs": 600,
"nimbus.inbox.jar.expiration.secs": 3600,
"drpc.worker.threads": 64,
"topology.worker.shared.thread.pool.size": 4,
"nimbus.host": "hw10843.local",
"storm.messaging.netty.min_wait_ms": 100,
"storm.zookeeper.port": 2181,
"transactional.zookeeper.port": null,
"topology.executor.receive.buffer.size": 1024,
"transactional.zookeeper.servers": null,
"storm.zookeeper.root": "/storm",
"storm.zookeeper.retry.intervalceiling.millis": 30000,
"supervisor.enable": true,
"storm.messaging.netty.server_worker_threads": 1
}
```
### /api/v1/topology/:id/компонент/:component (GET)Возвращает детальные метрики и информацию об исполнителе
|Параметр |Значение |Описание |
|---------|-----------|----------|
|id |Строка (обязательно)| ID топологии |
|component|Строка (обязательно)| ID компонента |
|window |Строка. Значение по умолчанию :all-time| продолжительность окна для метрик в секундах|
|sys |Строка. Значения 1 или 0. Значение по умолчанию 0| управляет включением части ответа с системными данными|Поля ответа:|Поле |Значение |Описание|
|--- |--- |---
|id | String | ID компонента|
|name | String | Название топологии|
|componentType | String | тип компонента: SPOUT или BOLT|
|windowHint| String | значение параметра окна в формате "чч мм сс". Значение по умолчанию - "All Time"|
|executors| Integer | Количество задач выполнителя в компоненте|
|componentErrors| Массив ошибок | Список ошибок компонента|
|componentErrors.time| Long | Временная метка, когда произошло исключение |
|componentErrors.errorHost| String | имя хоста для ошибки|
|componentErrors.errorPort| String | порт для ошибки|
|componentErrors.error| String | Ошибка, произошедшая в компоненте|
|componentErrors.errorLapsedSecs| Integer | Количество секунд, прошедших с момента возникновения ошибки в компоненте |
|componentErrors.errorWorkerLogLink| String | Ссылка на журнал рабочего процесса, который сообщил об исключении |
|topologyId| String | ID топологии|
|tasks| Integer | Количество экземпляров компонента|
|window| String. Значение по умолчанию "All Time" | продолжительность окна для метрик в секундах|
|spoutSummary или boltStats| Массив | Массив статистики компонента. **Обратите внимание, что этот элемент может быть spoutSummary или boltStats в зависимости от значения componentType**|
|spoutSummary.windowPretty| String | Продолжительность в формате ЧЧ:ММ:СС|
|spoutSummary.window| String | продолжительность окна для метрик в секундах|
|spoutSummary.emitted| Long | Количество отправленных сообщений в данном окне |
|spoutSummary.completeLatency| String (значение типа double возвращается в формате строки) | Общее время задержки при обработке сообщения|transferred| Long | Общее количество переданных сообщений в данном окне|
|spoutSummary.acked| Long | Количество подтвержденных сообщений|
|spoutSummary.failed| Long | Количество неудачных сообщений|
|boltStats.windowPretty| String | Продолжительность в формате ЧЧ:ММ:СС|
|boltStats.window| String | Продолжительность окна для метрик в секундах|
|boltStats.transferred| Long | Общее количество переданных сообщений в данном окне|
|boltStats.processLatency| String (значение типа double возвращается в формате строки) | Среднее время, затраченное болном на подтверждение сообщения после его получения|
|boltStats.acked| Long | Количество подтвержденных сообщений|
|boltStats.failed| Long | Количество неудачных сообщений|```no-highlight
1. http://ui-daemon-host-name:8080/api/v1/topology/WordCount3-1-1402960825/component/spout
2. http://ui-daemon-host-name:8080/api/v1/topology/WordCount3-1-1402960825/component/spout?sys=1
3. http://ui-daemon-host-name:8080/api/v1/topology/WordCount3-1-1402960825/component/spout?window=600
``````json
{
"name": "WordCount3",
"id": "spout",
"componentType": "spout",
"windowHint": "10m 0s",
"executors": 5,
"componentErrors": [{
"time": 1406006074000,
"errorHost": "10. 11. 1. 70",
"errorPort": 6701,
"errorWorkerLogLink": "http://10. 11. 1. 7:8000/log?file=worker-6701.log",
"errorLapsedSecs": 16,
"error": "java.lang.RuntimeException: java.lang.StringIndexOutOfBoundsException: Some Error\n\tat backtype.storm.utils.DisruptorQueue.consumeBatchToCursor(DisruptorQueue.java:128)\n\tat backtype.storm.utils.DisruptorQueue.consumeBatchWhenAvailable(DisruptorQueue.java:99)\n\tat backtype.storm.disruptor$consume_batch_when_available.invoke(disruptor.clj:80)\n\tat backtype.storm.disruptor$consume_batch_when_available.invoke(disruptor.clj:80)"
}],
"topologyId": "WordCount3-1-1402960825",
"tasks": 5,
"window": "600",
"spoutSummary": [
{
"windowPretty": "10m 0s",
"window": "600",
"emitted": 28500,
"transferred": 28460,
"completeLatency": "0.000",
"acked": 0,
"failed": 0
},
{
"windowPretty": "3h 0m 0s",
"window": "10800",
"emitted": 127640,
"transferred": 127440,
"completeLatency": "0.000",
"acked": 0,
"failed": 0
},
{
"windowPretty": "1d 0h 0m 0s",
"window": "86400",
"emitted": 127640,
"transferred": 127440,
"completeLatency": "0.000",
"acked": 0,
"failed": 0
},
{
"windowPretty": "All time",
"window": ":all-time",
"emitted": 127640,
"transferred": 127440,
"completeLatency": "0.000",
"acked": 0,
"failed": 0
}
],
"outputStats": [
{
"stream": "__metrics",
"emitted": 40,
"transferred": 0,
"completeLatency": "0",
"acked": 0,
"failed": 0
},
{
"stream": "default",
"emitted": 28460,
"transferred": 28460,
"completeLatency": "0",
"acked": 0,
"failed": 0
}
],
"executorStats": [
{
``````yaml
{
"workers": [
{
"workerLogLink": "http://10.11.1.7:8000/log?file=worker-6701.log",
"emitted": 5720,
"port": 6701,
"completeLatency": "0.000",
"transferred": 5720,
"host": "10.11.1.7",
"acked": 0,
"uptime": "43m 4s",
"id": "[24-24]",
"failed": 0
},
{
"workerLogLink": "http://10.11.1.7:8000/log?file=worker-6703.log",
"emitted": 5700,
"port": 6703,
"completeLatency": "0.000",
"transferred": 5700,
"host": "10.11.1.7",
"acked": 0,
"uptime": "42m 57s",
"id": "[25-25]",
"failed": 0
},
{
"workerLogLink": "http://10.11.1.7:8000/log?file=worker-6702.log",
"emitted": 5700,
"port": 6702,
"completeLatency": "0.000",
"transferred": 5680,
"host": "10.11.1.7",
"acked": 0,
"uptime": "42m 57s",
"id": "[26-26]",
"failed": 0
},
{
"workerLogLink": "http://10.11.1.7:8000/log?file=worker-6701.log",
"emitted": 5700,
"port": 6701,
"completeLatency": "0.000",
"transferred": 5680,
"host": "10.11.1.7",
"acked": 0,
"uptime": "43m 4s",
"id": "[27-27]",
"failed": 0
},
{
"workerLogLink": "http://10.11.1.7:8000/log?file=worker-6703.log",
"emitted": 5680,
"port": 6703,
"completeLatency": "0.000",
"transferred": 5680,
"host": "10.11.1.7",
"acked": 0,
"uptime": "42m 57s",
"id": "[28-28]",
"failed": 0
}
]
}
```
## Операции POST### /api/v1/topology/:id/activate (POST)
Активирует топологию.
|Параметр |Значение |Описание |
|---------|-----------|----------|
|id |Строка (обязательно)| Идентификатор топологии |
Пример ответа:
```json
{"topologyOperation":"activate","topologyId":"wordcount-1-1420308665","status":"success"}
```
### /api/v1/topology/:id/deactivate (POST)
Деактивирует топологию.
|Параметр |Значение |Описание |
|---------|-----------|----------|
|id |Строка (обязательно)| Идентификатор топологии |
Пример ответа:
```json
{"topologyOperation":"deactivate","topologyId":"wordcount-1-1420308665","status":"success"}
```
### /api/v1/topology/:id/rebalance/:wait-time (POST)
Перераспределяет топологию.
|Параметр |Значение |Описание |
|---------|-----------|----------|
|id |Строка (обязательно)| Идентификатор топологии |
|wait-time| Строка (обязательно)| Время ожидания перед перераспределением |
|rebalanceOptions| Json (необязательно) | Опции перераспределения топологии |
Пример JSON с опциями перераспределения:
```json
{"rebalanceOptions" : {"numWorkers" : 2, "executors" : {"spout" :4, "count" : 10}}, "callback" : "foo"}
```
Примеры:
```no-highlight
curl -i -b ~/cookiejar.txt -c ~/cookiejar.txt -X POST
-H "Content-Type: application/json"
-d '{"rebalanceOptions": {"numWorkers": 2, "executors": { "spout" : "5", "split": 7, "count": 5 }}, "callback":"foo"}'
http://localhost:8080/api/v1/topology/wordcount-1-1420308665/rebalance/0
```
Пример ответа:
```json
{"topologyOperation":"rebalance","topologyId":"wordcount-1-1420308665","status":"success"}
```
### /api/v1/topology/:id/kill/:wait-time (POST)
Уничтожает топологию.
|Параметр |Значение |Описание |
|---------|-----------|----------|
|id |Строка (обязательно)| Идентификатор топологии |
|wait-time| Строка (обязательно)| Время ожидания перед уничтожением |Внимание: Краткие периоды ожидания (0-5 секунд) могут увеличить вероятность активации ошибки, описанной в [STORM-112](https://issues.apache.org/jira/browse/STORM-112), что может привести к проблемам с демонами Supervisor брокера.
Пример ответа:
```json
{"topologyOperation":"kill","topologyId":"wordcount-1-1420308665","status":"success"}
```
## Ошибки API
API возвращает HTTP-статус 500 в случае возникновения ошибок.```json
{
"error": "Внутренняя ошибка сервера",
"errorMessage": "java.lang.NullPointerException\n\tat clojure.core$name.invoke(core.clj:1505)\n\tat backtype.storm.ui.core$component_page.invoke(core.clj:752)\n\tat backtype.storm.ui.core$fn__7766.invoke(core.clj:782)\n\tat compojure.core$make_route$fn__5755.invoke(core.clj:93)\n\tat compojure.core$if_route$fn__5743.invoke(core.clj:39)\n\tat compojure.core$if_method$fn__5736.invoke(core.clj:24)\n\tat compojure.core$routing$fn__5761.invoke(core.clj:106)\n\tat clojure.core$some.invoke(core.clj:2443)\n\tat compojure.core$routing.doInvoke(core.clj:106)\n\tat clojure.lang.RestFn.applyTo(RestFn.java:139)\n\tat clojure.core$apply.invoke(core.clj:619)\n\tat compojure.core$routes$fn__5765.invoke(core.clj:111)\n\tat ring.middleware.reload$wrap_reload$fn__6880.invoke(reload.clj:14)\n\tat backtype.storm.ui.core$catch_errors$fn__7800.invoke(core.clj:836)\n\tat ring.middleware.keyword_params$wrap_keyword_params$fn__6319.invoke(keyword_params.clj:27)\n\tat ring.middleware.nested_params$wrap_nested_params$fn__6358.invoke(nested_params.clj:65)\n\tat ring.middleware.params$wrap_params$fn__6291.invoke(params.clj:55)\n\tat ring.middleware.multipart_params$wrap_multipart_params$fn__6386.invoke(multipart_params.clj:103)\n\tat ring.middleware.flash$wrap_flash$fn__6675.invoke(flash.clj:14)\n\tat ring.middleware.session$wrap_session$fn__6664.invoke(session.clj:43)\n\tat ring.middleware.cookies$wrap_cookies$fn__6595.invoke(cookies.clj:160)\n\tat ring.adapter.jetty$proxy_handler$fn__6112.invoke(jetty.clj:16)\n\tat ring.adapter.jetty.proxy$org.mortbay.jetty.handler.AbstractHandler$0.handle(Unknown Source)\n\tat org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)\n\tat org.mortbay.jetty.Server.handle(Server.java:326)\n\tat org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)\n\tat org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:928)\n\tat org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:549)\n\tat org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)\n\tat org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)\n\tat org.mortbay.jetty.bio.SocketConnector$Connection.run(SocketConnector.java:228)\n\tat org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)\n"
}
```
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )