Как мне обработать один текстовый поток ввода-вывода с несколькими входами и выходами? - PullRequest
1 голос
/ 24 июля 2010

Так что я работаю над небольшой проблемой, и некоторые советы были бы хорошими.Сначала немного предыстории, извините за длину.

Я работаю над системой управления, которая запрашивает сетевые устройства по протоколу TL1 .Для тех, кто не знаком с протоколом, короткий ответ - это «читаемый человеком» язык, который общается через поток ввода-вывода на основе текста.

Я использую Spring и Jsch, чтобы открыть порт для удаленного сетевого элемента (сетевой элемент), войти в систему, выполнить команду, а затем закрыть соединение.Существует два вида доступа к удаленному сетевому элементу: либо напрямую (через шлюз ssh) , если элемент имеет адрес tcp / ip (многие из них только osi), либо через ems (система управления).) некоторого типа с использованием так называемого «северного интерфейса».

В любом случае, процедура одинакова.

  • Используйте Jsch, чтобы открыть порт для сетевого элемента или ems.
  • Отправить команду входа для NE ex."act-user<tid>:<username>:UniqueId::<password>;"
  • Отправить команду ex."rtrv-alm-all:<tid>:ALL:uniqueid::,,,,;"
  • Получение и обработка результатов.Например, приведенные выше результаты могут выглядеть примерно так ...

    RTRV-ALM-ALL:foo:ALL:uniqueid;

    CMPSW205 02-01-11 18:33:05

    M uniqueid COMPLD

    "01-01-06:MJ,BOARDOUT-ALM,SA,01-10,12-53-58,,:\"OPA_C__LRX:BOARD EXTRACTED\","

    ;

Значение ; важно, поскольку оно сигнализирует об окончании ответа.

  • Последний выход из системы изакройте порт.

В Spring я достаточно эффективно использовал ThreadPoolTaskExecutor для этого.

Пока эта проблема не возникла ...

Содна конкретная платформа ems (Hitachi) я столкнулся с контрольно-пропускным пунктом с моим подходом.Это ems обрабатывает до 80 узлов через него.Вы подключаетесь к порту, затем запускаете команду для входа в ems, а затем запускаете команды, указывающие на различные NE.Та же процедура, что и раньше, но вот проблема ...

После того, как вы войдете в ems, следующая команда, независимо от того, что это, займет до 10 минут для завершения ,пока это не произойдет, все остальные команды будут заблокированы.После этого начального ожидания все остальные команды работают быстро.Кажется, нет никакого способа победить это поведение (я подозреваю, что в течение этого периода происходит автоматическое обнаружение NE).

Теперь суть моего вопроса ...

ИтакМой следующий подход к этой платформе будет состоять в том, чтобы подключиться к ems, войти в него, оставить соединение открытым и просто передавать команды различным NE.Это будет означать 10-минутную задержку после первой загрузки приложения (через веб-интерфейс), но после этого будет нормально.

Проблема в том, как лучше всего это сделать.Наличие единого текстового iostream для прохождения этого материала выглядит как большое узкое место, плюс приложение будет использоваться несколькими пользователями, как мне обрабатывать несколько команд и ответов для этого одного iostream?Я могу открыть несколько iostreams (возможно, до 6) на этом ems, но это также усложняет сортировку того, что и куда идет.

Буду признателен за любые советы по направлению.

1 Ответ

1 голос
/ 24 июля 2010

Посмотрите на использование одного процесса в ems, чтобы связь с каждым ems была разделена.Это, по крайней мере, гарантирует, что на связи с другими ems не будут влиять проблемы с этим.

Вам нужно будет создать какую-то систему очередей команд, чтобы команды, отправляемые на Hitachi ems, не передавались.• блокировать пользовательский интерфейс, пока они не будут завершены.Либо это, либо вы должны будете установить 10-минутную задержку в клиентском программном обеспечении, прежде чем они начнут его использовать, или 10-минутную задержку в той части интерфейса, которая будет обрабатывать Hitachi.

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

Если вы можете каким-то образом изолировать Hitachi от других элементов в дизайне приложения, это действительно обеспечитчто 10-минутная задержка существует только при взаимодействии с Hitachi.Вы можете подключиться и выполнить фиктивную команду и перевести Hitachi в какое-то состояние «подключения», где команды нельзя использовать до тех пор, пока не будет получен результат, а затем вы измените состояние на готовое, чтобы пользователь мог взаимодействовать с ним.


Еще один подход заключается в разработке какого-либо компонента промежуточного программного обеспечения - я не знаю, уже сделали ли вы это.Если все клиенты имеют веб-интерфейс, вы можете запустить коммуникационную часть на веб-сервере, которая получает соединения от клиентов и передает их через одну часть на веб-сервере, которая связывается со всеми ems-серверами.Когда эта часть запускается на веб-сервере, она может подключаться к каждому ems и отправлять начальную команду ping, которая запускает 10-минутный таймер.Как только это будет завершено, часть на веб-сервере может отправлять сообщения поддержки активности время от времени, опять-таки, что-то вроде фиктивной команды, чтобы поддерживать работу сокета, чтобы не пришлось сбрасывать и снова проходить 10-минутное время ожидания.Когда пользователь открывает веб-сайт, он может связаться с этим сервером промежуточного программного обеспечения, который будет перенаправлять запросы в соответствующие ems и пересылать ответ обратно клиенту - через уже открытое соединение.

...