Я создал небольшую программу на Java, которая использует клиентские классы MQ для связи с сервером Websphere MQ и очередью на нем. Я хочу запрашивать размер, глубину ошибки определенной очереди через равные промежутки времени, например. каждые 10 секунд.
Что делаю, схематично:
qm = new MQQManager()
q = qm.accessQueue()
depth = q.getCurrentDepth()
- (сделайте что-нибудь с
depth
) q.close()
qm.close()
Это работает как шарм!
Из-за лени я написал свой код, чтобы каждый раз проходить все 6 шагов приведенной выше последовательности. В итоге я повторял этот цикл каждые 10 секунд. Примерно через полчаса люди, которые следят за сервером, сказали мне, что на нем открыто 153 экземпляра. Ясно, что простого выполнения close()
в очереди и QM недостаточно, чтобы убрать за собой.
Я собираюсь сделать очевидное исправление и оставить QM и очередь на время жизни программы. Но может кто-нибудь сказать мне, почему мой предыдущий подход приводит к утечке ресурсов, и что я могу с этим поделать, если решу пойти по этому пути?
ОБНОВЛЕНИЕ (25 января 2017 г.)
Сроки и принятие
Роджер предоставил красивый код и несколько полезных пояснений по темам производительности и незафиксированных сообщений. Это круто, но ответа Евгения было ровно (и минимально) достаточно для решения моей проблемы, и он был немного быстрее. Мое маленькое приложение теперь делает именно то, что я хочу, после того как я просто изменил close()
на disconnect()
по совету Юджина. Теперь я немного разорван о том, кто должен получить галочку. Мои извинения вам обоим!
Я получил именно то, что хотел, и я думаю, что закончил с этим вопросом, но я должен добавить, что я ценю вдумчивый ответ Роджера за полезную информацию, которую он предоставляет любому возможному будущему другому читателю этого вопроса. Надеюсь, другие люди будут слушать его, а не следовать моему примеру.
Производительность
Честно говоря, мне плевать на производительность. Сервер намного толще, чем необходимо для того, что он сейчас делает, и мой клиент мониторинга (тема этого вопроса) работает на машине разработки, которая обычно пуста. Я надеюсь, что он послужит своей цели в течение дня или двух, тогда я выброшу его. В то же время, если одно подключение каждые 10 секунд вызывает проблемы с производительностью, они должны балансировать нагрузку на Raspberry Pi или что-то в этом роде.
Неподтвержденные сообщения
Я тоже думаю, что это не проблема. Отправляющее приложение ставится в очередь небольшими пакетами примерно по 1-5 сообщений в течение нескольких миллисекунд и немедленно фиксируется. Принимающее приложение (клиент, который я написал, и у него вполне могут быть проблемы) постоянно прослушивает очередь, получает и подтверждает (фиксирует) каждое сообщение по отдельности. Поэтому я достаточно уверен, что никогда не будет более 1, возможно, 5 неподтвержденных сообщений. Это число ничтожно по сравнению с параметрами...
моя настоящая проблема,
который включает в себя от нескольких до нескольких сотен сообщений с задержкой обработки от 5 до 20 минут примерно в одно и то же время каждое утро. Я подозреваю, что мой принимающий клиент зависает из-за «зависания» сетевой операции ввода-вывода с чем-то другим, кроме MQS. Один из шагов, которые я хочу предпринять в изучении этого, — продемонстрировать, что в MQS действительно существует очередь ожидающих сообщений, и она не обрабатывается. Я хотел бы увидеть, когда эта очередь начнет накапливаться, как долго она там будет находиться и как быстро она исчезнет, как только мой клиент снова проснется.
Это соединение принимает от 2 000 до 10 000 сообщений в день с пиками, соответствующими пакетным процессам во второй половине дня и вечером, но задержки происходят только утром, часто с довольно небольшими объемами. Я хотел бы увидеть журнал размеров очередей, чтобы лучше понять, что происходит. В качестве следующего шага мне, вероятно, потребуется больше инструментовки в принимающем клиенте.
Окружающая среда
Что бы это ни стоило, на сервере работает WSMQ 6, поэтому мой клиент использует получение очереди с блокировкой и ожиданием, а не изящный асинхронный процесс уведомления, который я бы предпочел использовать. Мой получающий клиент — это автономное приложение C, работающее под RHEL на виртуальной машине.
DISCONNECT
и описание того, почемуCONNECT
каждые 10 секунд требует больших ресурсов и не должен быть разработан таким образом, и предоставляет рабочий пример кода для демонстрации. Ошеломленный, что это не был принятый ответ. - person T.Rob   schedule 25.01.2017