З.п от 20-25 тыс. руб по результатам собеседования.
Желателен опыт программирования на PHP, SQL, XML, XSL от 1 года. Приветствуется опыт программирования на Ruby и Java SE. Знание технического английского языка.
Вакансия Администратор Linux серверов.
З.п 30-35 тыс. рублей по результатам собеседования
Уверенное знание ОС Linux, принципов организации и администрирования локальной сети предприятия. Навыки администрирования ОС Linux и приложений heartbeat, drbd, bind, postfix, Apache HTTPd, MySQL, nginx.
Опыт программирования на shell, PHP, Java. Знание Ruby приветствуется.
Знание английского языка, специфических для отрасли терминов и оборотов.
Приложение является программно-аппаратным комплексом, позволяющим осуществлять оказание информационно-справочных услуг абонентам операторов сотовой связи посредством SMS- и USSD-сервисов.
Одна копия Приложения может быть одновременно подключена к нескольким транспортным системам (взаимодействие по протоколу SMPP 3.4 или 5.0) и обеспечивать взаимодействие с несколькими контент-провайдерами (взаимодействие по протоколу HTTP(S)).
Параметры -D для передачи JVM
gateway.home — путь к каталогу размещения Приложения. -Dgateway.home=/opt/gateway gateway.conf — путь к файлу конфигурации. -Dgateway.conf=/opt/gateway/production.xml gateway.log — путь к каталогу для хранения логов. -Dgateway.log=/opt/gateway/logfiles
Файл конфигурации содержит описание параметров, необходимых для запуска компонентов Приложения. Файл должен соответствовать спецификации XML и содержать текст в кодировке UTF-8.
Версия Приложения, для которого предназначен данный файл конфигурации. Версию можно узнать, запустив Приложение с параметром showVersion:
java -jar gateway.jar showVersion
Java SMPP Gateway Version 1.3Одна копия Приложения может быть одновременно подключена к нескольким транспортным системам (взаимодействие по протоколу SMPP 3.4 или 5.0) и обеспечивать взаимодействие с несколькими контент-провайдерами (взаимодействие по протоколу HTTP(S)).
Параметры -D для передачи JVM
gateway.home — путь к каталогу размещения Приложения. -Dgateway.home=/opt/gateway gateway.conf — путь к файлу конфигурации. -Dgateway.conf=/opt/gateway/production.xml gateway.log — путь к каталогу для хранения логов. -Dgateway.log=/opt/gateway/logfiles
В скобках после наименования параметра приводится необходимая версия Приложения. Параметры, отсутствующие в используемой версии, игнорируются.
process/@ident (версия >= 0.1)
Уникальный идентификатор процесса.
process/listen/@host (версия >= 0.1)
Имя или IP-адрес хоста, на котором будет открыт порт для прослушивания.
process/listen/@port (версия >= 0.1)
Номер порта, который будет открыт.
process/clients/@limit (версия >= 0.4)
Ограничение на количество одновременно установленных соединений.
process/clients/@timeout (версия >= 0.1)
Таймаут (в секундах) ожидания активности на установленном соединении.
process/service/@class (версия >= 0.1)
Каноническое имя класса, обрабатывающего поступающие соединения. В качестве классов могут выступать следующие:
ru.tms.smpp.gateway.Injector
Принимает сообщения в заданном формате и помещает их в очередь исходящих сообщений. Дополнительные установки в конфигурации Listener отсутствуют.
Параметры принимаемых сообщений должны иметь вид имя=значение и завершаться символом перевода строки \n . Окончание ввода параметров обозначается символом \n .
Обязательные параметры: process - идентификатор процесса Transceiver (маршрут отправки); source - источник сообщения (сервисный номер); destination - назначение сообщения (абонентский номер); body - тело сообщения. Символы перевода строки и возврата каретки должны быть заменены на последовательность \n .
Необязательные параметры: type - тип сообщения, может принимать значения: hidden - сообщение будет принято абонентским оборудованием, но не отобразится на экране и не будет сохранено в памяти; flash - сообщение будет немедленно отображено на экране при доставке на абонентское оборудование.
Принимает поток строк и помещает их в файл для последующей оффлайновой обработки и размещения в очереди исходящих сообщений. Перед отправкой строк необходимо отправить идентификатор набора для возобновления передачи в случае неудачно завершившейся предыдущей попытки, либо 0 для обозначения передачи нового набора. Строки в передаваемом потоке должны иметь вид:
Если Номер_Абонента начинается с символа h, то сообщение будет принято абонентским оборудованием, но не отобразится на экране и не будет сохранено в памяти; если с символа f, то сообщение будет немедленно отображено на экране при доставке на абонентское оборудование.
При окончании чтения процесс может сгенерировать одно из следующих сообщений:
Если Номер_Абонента начинается с символа h, то сообщение будет принято абонентским оборудованием, но не отобразится на экране и не будет сохранено в памяти; если с символа f, то сообщение будет немедленно отображено на экране при доставке на абонентское оборудование.
При окончании чтения процесс может сгенерировать сообщение следующего вида:
200 Accepted, @count message(s) enqueued within set @set
где @count — количество размещённых сообщений; @set — идентификатор набора.
Имя или IP-адрес SMS- или USSD-центра, с которым будет установлено соединение.
process/connection/@port (версия >= 0.1)
Номер порта, на котором будет установлено соединение.
process/connection/@bind (версия >= 0.9)
Имя или IP-адрес локального хоста, с которого будет установлено соединение.
process/connection/@syncmode (версия >= 1.3)
Флаг, указывающий на синхронный (значение 1) или асинхронный (значение 0) режим обмена данными с SMS- или USSD-центром.
process/connection/@retry (версия >= 0.1)
Пауза (в секундах) между повторными попытками установки соединения.
process/system (версия >= 0.1)
Данные параметры предоставляются оператором мобильной связи.
process/system/@ussd (версия >= 0.8)
Флаг, указывающий на тип подключения: 0 для SMSC, 1 для USSDC.
Поскольку кодировка текста сообщений в значительной степени зависит от реализации SMS- и USSD-центров, Приложение предоставляет механизм детектирования т. н. "базовой" и "альтернативной" кодировок. В подсекциях charset могут быть определены дополнительные кодировки.
process/charsets/@default (версия >= 0.2)
Идентификатор базовой кодировки. Должен совпадать с параметром @dcs одной из подсекций charset.
Максимальный размер сегментов сообщения, отправляемых в альтернативной кодировке.
process/charsets/charset/@dcs (версия >= 0.2)
Идентификатор схемы кодировки данных
periods/@enquire-link (версия >= 0.4)
Период (в секундах) между повторными отправками пакетов enquire_link.
periods/@delivery-delta (версия >= 0.9)
Период (в секундах) между повторными попытками доставки сообщений в случае восстановимых ошибок при передаче (например, ESME_RMSGQFUL или ESME_RSYSERR).
periods/@delivery-retry-count (версия >= 0.9)
Количество попыток повторных отправок сообщений в случае восстановимых ошибок при передаче.
periods/@throttling-delay (версия >= 0.2)
Задержка (в секундах) перед последующими попытками доставки сообщений в случае получения от SMSC ответа со статусом ESME_RTHROTTLED.
parameters/@smscid-in-response (версия >= 0.8)
Основание счисления индентификатора сообщения на стороне SMSC, полученного с пакетом submit_sm_resp.
Интервал (в секундах) между попытками сохранения накопленных сведений в БД.
process/periods/@expire-treshold (версия >= 0.2)
Срок (в секундах) ожидания поступления всех частей сегментированного сообщения. В том случае, если в течение указанного срока не удалось получить все сегменты, остальные, принадлежащие данному набору сегментов, удаляются.
process/periods/@output-usage (версия >= 0.4)
Интервал (в секундах) между уведомлениями об интенсивности утилизации очередей.
Выполняет обработку сообщений, используя внешнее приложение. Обмен данными с приложением выполняется по протоколу HTTP(S) методом GET. Общий вид конфигурации:
Таймаут (в секундах) ожидания ответа от внешнего приложения.
process/service/@defer-responses (версия >= 0.8)
В обычном режиме каждый запрос от абонента сопровождается отправкой ответного сообщения с указанного абонентом сервисного номера (значение 0). В случае, если необходимо избежать отправки ответного сообщения, следует указать значение 1.
process/service/@encoding (версия >= 0.1)
Кодировка данных, получаемых от внешнего приложения (CP1251, KOI8-R, UTF-8 и т. п.)
process/service/@source-name (версия >= 0.1)
Имя источника данных в формате URI. Доступно использование следующих макроопределений: @body@ - запрос, полученный от абонента; @source@ - идентификатор абонентского терминала (например, номер телефона); @destination@ - сервисный номер, на который поступил запрос; @transport@ - идентификатор процесса Transeiver, с помощью которого был получен запрос.
Выполняет предварительную обработку сообщений, используя внешнее приложение, написанное на языке Rhino (модификация Javascript) или на другом, поддерживаемом Java Scripting Engine.
Получение запроса от SMSC (USSDC) — LinkToTransport. Передача запроса на внешний обработчик — ServiceToHandler. Получение ответа от внешнего обработчика — HandlerToService. Передача ответа на SMSC (USSDC) - TransportToLink.
Определение точек входа в обработчики фильтров (Rhino)
function LinkToTransport( message, transport ) { // Методы объекта message message.getCreated(); // Возвращает время появления сообщения в памяти в unixtime. message.getTLV(); // Возвращает таблицу TLV message.getDestination(); // Возвращает назначение сообщения (сервисный или абонентский номер). message.getId(); // Возвращает идентификатор сообщения, присвоенный при инициализации. message.getRetry(); // Возвращает количество попыток доставки сообщения на SMSC. message.getSource(); // Возвращает источник сообщения (сервисный или абонентский номер). message.getState(); // Возвращает состояние сообщения[1] message.getSMSCId(); // Возвращает идентификатор сообщения, присвоенный SMSC. message.getText(); // Возвращает текст сообщения. message.getTransport(); // Возвращает идентификатор SMSC (транспорт сообщения). message.getType(); // Возвращает тип сообщения[2] message.getMsgRefNum(); // Возвращает идентификатор последовательности // для мультисегментного сообщения. message.getRetryCount(); // Возвращает количество попыток отправки. message.getTotalSegments(); // Возвращает количество сегментов для мультисегментного сообщения. message.getSegmentSeqNum(); // Возвращает номер сегмента в последовательности // для мультисегментного сообщения. message.getTransactionId(); // Возвращает идентификатор транзакции. message.getSetId(); // Возвращает идентификатор набора сообщений или // пустую строку, если идентификатор не был ранее задан. message.setText( text ); // Устанавливает содержимое сообщения. // [1] Состояния сообщений 'RECEIVED' — сообщение поступило из SMSC (USSDC) в очередь; 'PROCESSING' — сообщение передано в сервис; 'PENDING' — сообщение находится в очереди на передачу в SMSC (USSDC); 'DELIVERING' — сообщение передано в SMSC (USSDC), ожидается подтверждение получения; 'DELIVERED' — сообщение получено; 'UNDELIVERABLE' — сообщение не могло быть доставлено. // [2] Типы сообщений 'REGULAR' — обычное сообщение; 'FLASH' — сообщение отображается на абонентском устройстве по факту получения; 'HIDDEN' — факт получения сообщения не регистрируется абонентским устройством. // Методы объекта transport transport.getIdent(); // Возвращает идентификатор транспорта. transport.getLogger(); // Возвращает ссылку на регистратор событий. } // LinkToTransport() function ServiceToHandler( message, service ) { // Методы объекта message см. в описании LinkToTransport() // Методы объекта service service.getIdent(); // Возвращает идентификатор сервиса. service.getPhones(); // Возвращает список назначенных сервисных номеров. service.getLogger(); // Возвращает ссылку на регистратор событий. // Не выполнять запрос к внешнему обработчику (выполняется по умолчанию) result.setProperty( 'performHttpRequest', 'false' ); } // ServiceToHandler() function HandlerToService( message, service ) { // Методы объекта message см. в описании LinkToTransport() // Методы объекта service см. в описании ServiceToHandler() } // HandlerToService() function TransportToLink( message, transport ) { // Методы объекта message см. в описании LinkToTransport() // Методы объекта transport см. в описании LinkToTransport() } // TransportToLink()
Пример:
function ServiceToHandler( message, service ) { if ( service.getIdent() == "HTTPService" ) { message.setText( "Услуга временно недоступна" ); result.setProperty( "performHttpRequest", "false" ); } }