Мониторинг очередей MSMQ

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Belkin
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 63
Зарегистрирован: 02.11.2007 (Пт) 18:02
Откуда: Рязань

Мониторинг очередей MSMQ

Сообщение Belkin » 06.08.2008 (Ср) 11:43

Есть удаленный сервак, на котором организованы куча очередей MSMQ. Все это делали и делают разработчики.
В наши задачи, в частности одну из моих задач входит мониторинг нескольких таких очередей и разбираться почему сообщения не обрабатываются, при этом падают в другую очередь (отклоненные)
Вобщем это происходит, то редко, то часто.
Мысль написать прогу, которую буду запускать на своем компе для мониторинга определенных очередей.
Проблема в том, что даже не знаю с чего начать и как подступиться к этому MSMQ
Подскажите, кто имел такой опыт.
И если это нельзя сделать на VB то подскажите на чем делать.

Заранее благодарен.
Андрей.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 06.08.2008 (Ср) 15:12

в VB6 - незнаю, полагаю, что не оч удобно.
в .NET - из Server Explorer накидать на форму очередей ... делов то...
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Belkin
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 63
Зарегистрирован: 02.11.2007 (Пт) 18:02
Откуда: Рязань

Сообщение Belkin » 07.08.2008 (Чт) 8:25

Sebas
А есть какой нибудь пример или ссылка?
Буду устанавливать студию, вопрос какую лучше?
Андрей.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 07.08.2008 (Чт) 9:50

2008 канеш
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Belkin
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 63
Зарегистрирован: 02.11.2007 (Пт) 18:02
Откуда: Рязань

Re: Мониторинг очередей MSMQ

Сообщение Belkin » 19.08.2008 (Вт) 9:05

Неужели никто такой задачей не занимался и нет примерчика для "разгона"?
Андрей.

Belkin
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 63
Зарегистрирован: 02.11.2007 (Пт) 18:02
Откуда: Рязань

Re: Мониторинг очередей MSMQ

Сообщение Belkin » 26.08.2008 (Вт) 12:41

Немного разобрался с очередями MSMQ.
Напишу несколько кусочков кода для работы.
Во первых в проекте нужно подключить Microsoft Mesage Queue 3.0 Object Librery (хранится в mqoa.dll). Должна быть установлена служба: "Очереди сообщений"
Далее можно работать с очередеми в приделах Active Directory
(Мне нужно было работать с очередями на компе другого домена, но не удалось со своего компа, прогу буду запускать там)

Создаем очередь:
Код: Выделить всё
Dim qinfo As New MSMQQueueInfo
Dim strMachineName As String
Dim strQueLbl As String

strMachineName = "." ' . Означает свой компьютер
strQueLbl = "Andrey.test4"
qinfo.PathName = strMachineName & "\" & strQueLbl
qinfo.Create


Поиск очереди по лэблу:
Код: Выделить всё
Dim query As New MSMQQuery
Dim qinfos As MSMQQueueInfos
Dim strQueLbl As String
Dim FindQueOnLabel As Variant
Dim qinfo As MSMQQueueInfo

strQueLbl = "Andrey.test2"

Set qinfos = query.LookupQueue(Label:=strQueLbl)
qinfos.Reset
Set qinfo = qinfos.Next

If qinfo Is Nothing Then
    MsgBox "Очереди с лэйблом " & strQueLbl & " не найдено"
Else
    Set FindQueOnLabel = qinfo
    MsgBox "Очередь найдена!"
End If


Чтение тела сообщения из очереди:
Код: Выделить всё
Dim qQueue As MSMQ.MSMQQueue
Dim qMessage As MSMQ.MSMQMessage
Dim qinfo As New MSMQQueueInfo
Dim i As Integer
Dim bytBody() As Byte
Dim strBody As String

qinfo.PathName = ".\Andrey.test"
Set qQueue = qinfo.Open(MQ_PEEK_ACCESS, MQ_DENY_NONE)

Set qMessage = qQueue.PeekCurrent(ReceiveTimeout:=300)
Do While Not (qMessage Is Nothing)
    Select Case TypeName(qMessage.Body)
        Case "Long"
            MsgBox CStr(qMessage.Body)
        Case "String"
            MsgBox qMessage.Body
        Case "Byte()"
            ReDim bytBody(qMessage.BodyLength)
            bytBody = qMessage.Body
            strBody = ""
            For i = LBound(bytBody) To UBound(bytBody)
                strBody = strBody & Chr(bytBody(i))
            Next i
            MsgBox strBody
    End Select
    Set qMessage = qQueue.PeekNext(ReceiveTimeout:=300)
Loop

qQueue.Close


Удаляем все сообщения из очереди:
Код: Выделить всё
Dim qQueue As MSMQ.MSMQQueue
Dim qMessage As MSMQ.MSMQMessage
Dim qinfo As New MSMQQueueInfo
Dim qmgmt As New MSMQManagement
Dim i As Integer

Dim bytBody() As Byte
Dim strPath As String

qinfo.PathName = ".\Andrey.test2"
Set qQueue = qinfo.Open(MQ_RECEIVE_ACCESS, MQ_DENY_NONE)
qmgmt.Init Machine:="it-bes", PathName:="it-bes\andrey.test2"
For i = 1 To qmgmt.MessageCount
    Set qMessage = qQueue.ReceiveCurrent(ReceiveTimeout:=300)
Next i
qQueue.Close


Отправляем сообщение в очередь:
Код: Выделить всё
Dim qinfo As New MSMQQueueInfo
Dim qQueue As MSMQ.MSMQQueue
Dim msg As New MSMQMessage

qinfo.PathName = ".\Andrey.test2"
Set qQueue = qinfo.Open(MQ_SEND_ACCESS, MQ_DENY_NONE)

msg.Label = "Это лэйбл"
msg.Body = "А это само тело сообщений"

msg.Send qQueue
qQueue.Close


Данные куски кода работоспособны, но их можно и нужно доделывать и усовершенствовать, чем сейчас и занимаюсь, создавая программу мониторинга очередей MSMQ.
Всем удачного освоения!!!
Андрей.

Belkin
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 63
Зарегистрирован: 02.11.2007 (Пт) 18:02
Откуда: Рязань

Re: Мониторинг очередей MSMQ

Сообщение Belkin » 28.08.2008 (Чт) 12:41

И еще одно дополнение при отправке сообщений в очередь нужно выяснить какой она является транзакционной или нет:
Код: Выделить всё
Dim qinfo As New MSMQQueueInfo
Dim qQueue As MSMQ.MSMQQueue
Dim qdest As MSMQDestination
Dim msg As New MSMQMessage
Dim q As String ' Очередь
Dim qmgmt As New MSMQManagement

Dim dispenser As New MSMQTransactionDispenser
Dim transaction As MSMQTransaction

q = InputBox("Введите название очереди", "Название очереди", "Test_1")
qinfo.PathName = Environ("computername") & "\" & q
'qinfo.DefaultPropertiesToSend.Recoverable = True
Set qQueue = qinfo.Open(MQ_SEND_ACCESS, MQ_DENY_NONE)

msg.Label = "Это лэйбл"
msg.Body = InputBox("Введите тело сообщения", "Тело сообщения", "Здесь тело сообшения")

qmgmt.Init Machine:=Environ("computername"), PathName:=Environ("computername") & "\" & q

If qmgmt.TransactionalStatus = 0 Then ' 0 означает транзакционная очередь
    Set transaction = dispenser.BeginTransaction
    msg.Send qQueue, transaction
    transaction.Commit
Else
    msg.Send qQueue
End If

qQueue.Close

Дело в том что сообщения нетранзакционной очереди пропадают после перезакгрузки компа, так как хранятся в памяти.
Хотя есть какое-то свойство, которое позволили бы сохранять сообщения и нетранзакционной очереди. Случайно нашел VB.NET но никак не применю и не найду аналог для VB6
Код: Выделить всё
Dim queue As New MessageQueue()
queue.Path = ".\Private$\TestQueue"
queue.DefaultPropertiesToSend.Recoverable = True

'This method can also be used
'Here, we use the Recoverable property of the message itself
'Dim msg As New Message()
'msg.Body = "My recoverable message"
'msg.Label = "Some Label"
'msg.Recoverable = True
'queue.Send(msg)

queue.Send("My recoverable message","Some Label")
queue.Close()

Получается нужно искать аналог Recoverable
Андрей.

Belkin
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 63
Зарегистрирован: 02.11.2007 (Пт) 18:02
Откуда: Рязань

Re: Мониторинг очередей MSMQ

Сообщение Belkin » 29.08.2008 (Пт) 8:47

Решил вопрос с сохранением сообщений в нетранзакционную очередь.
Все решается просто: перед отправкой сообщений нужно сообщению добавить одно свойство
Код: Выделить всё
msg.Delivery = MQMSG_DELIVERY_RECOVERABLE
Андрей.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Re: Мониторинг очередей MSMQ

Сообщение Sebas » 29.08.2008 (Пт) 9:22

Assembly System.Messaging
c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Messaging.dll

А это не пробовал использоваться?
Всё-таки управляемая библа или вб6 обязателен?
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Belkin
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 63
Зарегистрирован: 02.11.2007 (Пт) 18:02
Откуда: Рязань

Re: Мониторинг очередей MSMQ

Сообщение Belkin » 30.08.2008 (Сб) 16:43

Sebas
Да, я так и не моставил Visual Studia.
Да и не разбирался с .net
Поэтому все еще пишу на VB6
А с MSMQ разобрался, по крайней мере все то что я хотел реализовать, я СДЕЛАЛ!!! Даже сделал чуть больше.
Тебе все равно СПАСИБО!
Еще неделька и ОТПУСК!!!
Уезжаю от цивилизации в тайгу на урал!!!
Приеду может и забуду не только MSMQ, но и VB и SQL и вообще свой пароль в систему :) ;) :lol:
Андрей.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 27

    TopList