powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Синхронный запрос с помощью IBM.XMS
2 сообщений из 2, страница 1 из 1
Синхронный запрос с помощью IBM.XMS
    #38852216
xZooYx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть две очереди: для отправки запроса и для получения ответа.
Нашел кучу примеров как отправить сообщение в очередь и как получить сообщение из очереди. Но не могу найти ни одного примера, как в синхронном режиме отправить запрос и получить ответ. То есть надо как то отправить сообщение в очередь, а потом достать ответное сообщение из очереди, так, чтобы полученное сообщение было именно ответом на запрос, а не просто очередным сообщением в очереди.

На MQ.NET это делал так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
public string ExecuteRequest(string requestQueueName, string responseQueueName, string message)
        {
            var requestQueue = _queueManager.AccessQueue(requestQueueName, MQC.MQOO_OUTPUT | MQC.MQOO_FAIL_IF_QUIESCING);
            var requestMessage = new MQMessage();
            requestMessage.WriteBytes(message);
            requestQueue.Put(requestMessage, _putMessageOptions);
            _queueManager.Commit();
            requestQueue.Close();

            var responseQueue = _queueManager.AccessQueue(responseQueueName, MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_FAIL_IF_QUIESCING);
            var receiveMessage = new MQMessage { CorrelationId = requestMessage.MessageId };
            var getMessageOptions = new MQGetMessageOptions
            {
                Options = MQC.MQGMO_FAIL_IF_QUIESCING | MQC.MQGMO_WAIT,
                WaitInterval = 10000, 
                MatchOptions = MQC.MQMO_MATCH_CORREL_ID
            };
            responseQueue.Get(receiveMessage, getMessageOptions);
            _queueManager.Commit();
            responseQueue.Close();
            var byteResult = receiveMessage.ReadBytes(receiveMessage.MessageLength);
            return System.Text.Encoding.UTF8.GetString(byteResult);
        }


Т.е. сообщения связываются по CorrelationId и из второй очереди получается именно нужно сообщение.
Как тоже самое сделать на XMS?
...
Рейтинг: 0 / 0
Синхронный запрос с помощью IBM.XMS
    #38852315
xZooYx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем, взял за основу код стандартного класса Requestor и сделал вот такой вот класс (чтобы работать с двумя очередями):

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
public class Requestor : IDisposable
{
    private ISession _session;
    private IDestination _requestDestination;
    private IDestination _responseDestination;
    private IMessageProducer _producer;
    private bool _disposed;
    private int _timeout = 30000; // Default Timeout = 30 sec.


    /// <value>
    /// Время (в миллисекундах) ожидания ответного сообщения. По умолчанию - 30000 (30 сек.)
    /// </value>
    public int Timeout
    {
        get { return _timeout; }
        set { _timeout = value; }
    }


    public Requestor(ISession session, IDestination requestDestination, IDestination responseDestination)
    {
        this._session = session;
        this._requestDestination = requestDestination;
        this._responseDestination = responseDestination;
        this._producer = session.CreateProducer(requestDestination);
    }
        

    public virtual IMessage Request(IMessage requestMessage)
    {
        if (this._disposed)
            throw new IllegalStateException(this.GetType().FullName);
        this._producer.Send(requestMessage);
        IMessage responseMessage = null;
        using (IMessageConsumer consumer = _session.CreateConsumer(_responseDestination, "JMSCorrelationID = '" + requestMessage.JMSMessageID + "'"))
        {
            responseMessage = consumer.Receive(_timeout);
        }
        return responseMessage;
    }


    public void Close()
    {
        this.Dispose();
    }


    public void Dispose()
    {
        this.Dispose(true);
    }


    protected virtual void Dispose(bool disposing)
    {
        if (this._disposed)
            return;
        if (disposing)
        {
            this._responseDestination.Dispose();
            this._producer.Dispose();
            this._session = (ISession)null;
        }
        this._disposed = true;
    }
}



Использую его так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
IConnectionFactory connectionFactory = CreateConnectionFactory(host, port, queueManagerName, channelName);
using (IConnection connection = connectionFactory.CreateConnection())
{
    using (ISession session = connection.CreateSession(false, AcknowledgeMode.AutoAcknowledge))
    {
        using (IDestination requestDestination = CreateDestination(session, requestQueueName))
        using (IDestination responseDestination = CreateDestination(session, responseQueueName))
        {
            using (Requestor requestor = new Requestor(session, requestDestination, responseDestination))
            {
                connection.Start();
                IMessage requestMessage = session.CreateTextMessage(message);
                ITextMessage responseMessage = (ITextMessage)requestor.Request(requestMessage);
                Console.WriteLine(responseMessage.Text);
            } // requestor
        } // destinations
    } // session
} // connection



Вроде работает, но может у кого есть какие замечания?..
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Синхронный запрос с помощью IBM.XMS
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]