/** * <summary> * Attempts to locate the messaged indicated by <c>id</c>. If the message * is succesfully located, the cursor will point to the message idenfified * and the message may be retrieved there after. * </summary> * * <param name="id">The recipt UUID of the message to be located </param> * <param name="timeout"> * The maximum number of seconds the call should be allowed * before resulting in a "timeout".</param> * <param name="cursorID"> * The cursor which should be be assigned the position * of the message indicated by <c>id</c></param> * * <returns><c>Safmq.EC_NOERROR</c> upon success, otherwise see * <c>MQConnection.SeekID(QueueHandle,UUID,int,CursorHandle)</c> * for error codes. * </returns> * * <seealso cref="MQConnection.SeekID(QueueHandle,UUID,int,CursorHandle)">MQConnection.SeekID(QueueHandle,UUID,int,CursorHandle)</seealso> */ public ErrorCode SeekID(UUID id, int timeout, CursorHandle cursorID) { return con.SeekID(que,id,timeout,cursorID); }
public void test_PeekID_PeekFront_OpenCursor_PeekCursor_SeekID_RetrieveCursor_AdvanceCursor_TestCurosr_CloseCursor_RetrieveID() { MQConnection con = null; try { con = connectToServer(address, null, null); addAllGroups(con); addAllUsers(con); addAllQueues(con); QueueHandle handle = new QueueHandle(); ErrorCode ec = con.OpenQueue(TEST_QUEUE[0], handle); Assert.IsTrue(ec == ErrorCode.EC_NOERROR, "Unable to open queue: " + TEST_QUEUE[0]); sendMessages(con, handle, 5, 0); QueueMessage msg = new QueueMessage(); StreamWriter sw = new StreamWriter(msg.Stream); sw.WriteLine(SPECIAL_MESSAGE); sw.Close(); byte[] b = { 0, 0, 0, 0, 0, 0, 0, 0 }; UUID uuid = new UUID(new Guid(123456789,4321,1234,b)); msg.ReciptID = uuid; //msg.ReciptID = ((UUID)uuid.Clone()); ec = con.Enqueue(handle, msg); Assert.IsTrue(ec == ErrorCode.EC_NOERROR, "Unable to write special message"); sendMessages(con, handle, 5, 5); msg = new QueueMessage(); ec = con.PeekID(handle, true, uuid, 0, msg); Assert.IsTrue(ec == ErrorCode.EC_NOERROR, "Unable to PeekID:" + ec); string txt = (new StreamReader(msg.Stream)).ReadLine(); Console.WriteLine("txt:\t\t\t" + txt); Console.WriteLine("uuid:\t\t\t" + (Guid)uuid); Console.WriteLine("msg.ReceiptID:\t" + (Guid)msg.ReciptID); Console.WriteLine("txt.Equals(SPECIAL_MESSAGE): " + txt.Equals(SPECIAL_MESSAGE)); Console.WriteLine("uuid.Equals(msg.ReceiptID)): " + uuid.Equals(msg.ReciptID)); Assert.IsTrue(txt.Equals(SPECIAL_MESSAGE) && uuid.Equals(msg.ReciptID), "Incorrect PeekID Message: " + (Guid)msg.ReciptID); msg = new QueueMessage(); ec = con.PeekFront(handle, true, 0, msg); Assert.IsTrue(ec == ErrorCode.EC_NOERROR, "Unable to PeekFront"); txt = (new StreamReader(msg.Stream)).ReadLine(); Assert.IsTrue(txt.Equals("0"), "Incorrect PeekFront Message: body=" + txt); CursorHandle cur = new CursorHandle(); ec = con.OpenCursor(handle, cur); Assert.IsTrue(ec == ErrorCode.EC_NOERROR, "Unable to OpenCursor"); ec = con.SeekID(handle, uuid, 0, cur); Assert.IsTrue(ec == ErrorCode.EC_NOERROR, "Unable to SeekID"); msg = new QueueMessage(); ec = con.PeekCursor(handle, true, cur, msg); Assert.IsTrue(ec == ErrorCode.EC_NOERROR, "Unable to PeekCursor"); txt = (new StreamReader(msg.Stream)).ReadLine(); Assert.IsTrue(txt.Equals(SPECIAL_MESSAGE) && uuid.Equals(msg.ReciptID), "Incorrect PeekCursor Message: " + msg.ReciptID); ec = con.AdvanceCursor(handle, cur); Assert.IsTrue(ec == ErrorCode.EC_NOERROR, "Unable to AdvanceCursor"); msg = new QueueMessage(); ec = con.PeekCursor(handle, true, cur, msg); Assert.IsTrue(ec == ErrorCode.EC_NOERROR, "Unable to PeekCursor (after advance)"); txt = (new StreamReader(msg.Stream)).ReadLine(); Assert.IsTrue(txt.Equals("5"), "Incorrect PeekCursor (after advance) Message: " + msg.ReciptID); msg = new QueueMessage(); ec = con.RetrieveCursor(handle, true, cur, msg); Assert.IsTrue(ec == ErrorCode.EC_NOERROR, "Unable to RetrieveCursor"); txt = (new StreamReader(msg.Stream)).ReadLine(); Assert.IsTrue(txt.Equals("5"), "Incorrect PeekCursor (after RetrieveCursor) Message: " + msg.ReciptID); ec = con.TestCursor(handle, cur); Assert.IsTrue(ec == ErrorCode.EC_NOERROR, "Unable to test Cursor, ec: " + ec); ec = con.CloseCursor(handle, cur); Assert.IsTrue(ec == ErrorCode.EC_NOERROR, "Unable to CloseCursor, ec: " + ec); msg = new QueueMessage(); ec = con.RetrieveID(handle, true, uuid, 0, msg); Assert.IsTrue(ec == ErrorCode.EC_NOERROR, "Unable to RetrieveID"); txt = (new StreamReader(msg.Stream)).ReadLine(); Assert.IsTrue(txt.Equals(SPECIAL_MESSAGE) && uuid.Equals(msg.ReciptID), "Incorrect RetrieveID Message: " + msg.ReciptID); int[] bodies = { 0, 1, 2, 3, 4, 6, 7, 8, 9 }; // 5 was retrieved above. for(int x=0; x<bodies.Length; x++) { msg = new QueueMessage(); ec = con.Retrieve(handle, true, 0, msg); Assert.IsTrue(ec == ErrorCode.EC_NOERROR, "Unable to retrieve message: " + x); txt = (new StreamReader(msg.Stream)).ReadLine(); Console.WriteLine("txt: " + txt); Assert.IsTrue(int.Parse(txt) == bodies[x], "Incorrect message: " + txt); } ec = con.CloseQueue(handle); Assert.IsTrue(ec == ErrorCode.EC_NOERROR, "Unable to Close queue"); } finally { if (con != null) con.Close(); } }
/** * <summary> * Retrieves the message identified by <c>id</c> in the message's * recipt id, set prior to the message having been enqueued (See: * <c>Enqueue(QueueMessage)</c>. The results are placed in the object * <c>msg</c>. * </summary> * * <remarks> * <para>Note: Message responsders will typically place the message id of the original * message in the recipt id of the message being returned. This round-trip * message identification is provided by SAFMQ as a method for coordinated two-way * communications.</para> * * <para>Note: Retrieved messages are removed from the queue.</para> * </remarks> * * <param name="retrievebody"> * A flag indicating whether the body of the message should be retrieved</param> * <param name="id"> The UUID of the message to be retrieved.</param> * <param name="timeout"> * The number of seconds to wait before returning, a value of zero (0) will * cause the method to return immediately if no messages are present on the queue, * a value of (-1) will cause the method to wait until a message is placed on the queue. * </param> * <param name="msg"> Receives the contents of the message.</param> * * <returns>Upon success a value of <c>Safmq.EC_NOERROR</c>, otherwise * see MQConnection.RetrieveID() for result codes.</returns> * * <seealso cref="MQConnection.RetrieveID(QueueHandle,bool,UUID,int,QueueMessage)">MQConnection.Retrieve(QueueHandle,bool,int,QueueMessage)</seealso> * <seealso cref="Enqueue(QueueMessage)">Enqueue(QueueMessage)</seealso> */ public ErrorCode RetrieveID(bool retrievebody, UUID id, int timeout, QueueMessage msg) { return con.RetrieveID(que,retrievebody,id,timeout,msg); }
/** * <summary> * Attempts to locate the messaged indicated by <c>id</c>. If the message * is succesfully located, the cursor will point to the message idenfified * and the message may be retrieved there after. * </summary> * * <param name="qhandle"> A handle to a queue previously opened by a call to OpenQueue(string)</param> * <param name="id"> The recipt UUID of the message to be located </param> * <param name="timeoutseconds">The maximum number of seconds the call should be allowed * before resulting in a "timeout".</param> * <param name="cursorID"> The cursor which should be be assigned the position * of the message indicated by <c>id</c></param> * * <returns><c>ErrorCode.EC_NOERROR</c> upon success, otherwise errors returned * could be but are not limited to:<br/> * <table border="0" cellpadding="3" cellspacing="0"> * <tr><td><c>ErrorCode.EC_NETWORKERROR</c></td> * <td>A networking error has occurred and the conneciton * is nolonger valid. * </td></tr> * <tr><td><c>ErrorCode.EC_NOTAUTHORIZED</c></td> * <td>The user is not authorized to Read messages from this * queue. * </td></tr> * <tr><td><c>ErrorCode.EC_NOTOPEN</c></td> * <td>The queue specified has not been opened by this connection. * </td></tr> * <tr><td><c>ErrorCode.EC_CURSORINVALIDATED</c></td> * <td>The cursor is no longer valid. * </td></tr> * </table> * </returns> * * <seealso cref="OpenQueue(string, QueueHandle)"/> */ public ErrorCode SeekID(QueueHandle qhandle, UUID id, int timeoutseconds, CursorHandle cursorID) { ErrorCode ret = ErrorCode.EC_NOERROR; SEEK_ID_PARAMS parms = new SEEK_ID_PARAMS(); parms.queueID = qhandle; parms.cursorID = cursorID; parms.reciptID = id; parms.timeoutseconds = timeoutseconds; try { output.Write(Safmq.CMD_SEEK_ID); parms.Write(output); output.Flush(); ret = getResponseCode(); } catch (Exception) { ret = ErrorCode.EC_NETWORKERROR; } return ret; }
/** * <summary> * Retrieves the message identified by <c>id</c> in the message's * recipt id, set prior to the message having been enqueued (See: * <c>Enqueue(QueueMessage)</c>. The results are placed in the object * <c>msg</c>. * </summary> * * <remarks> * <para>Note: Message responsders will typically place the message id of the original * message in the recipt id of the message being returned. This round-trip * message identification is provided by SAFMQ as a method for coordinated two-way * communications.</para> * * <para>Note: Retrieved messages are removed from the queue.</para> * </remarks> * * <param name="qhandle"> A handle to a queue previously opened by a call to OpenQueue(string)</param> * <param name="retrievebody"> A flag indicating whether the body of the message should be retrieved</param> * <param name="id"> The UUID of the message to be retrieved.</param> * <param name="timeoutseconds"> * The number of seconds to wait before returning, a value of zero (0) will * cause the method to return immediately if no messages are present on the queue, * a value of (-1) will cause the method to wait until a message is placed on the queue.</param> * <param name="msg"> Receives the contents of the message.</param> * * <returns>Upon success a value of <c>ErrorCode.EC_NOERROR</c>, otherwise * errors such as but not limited to could occur: <br/> * <table border="0" cellpadding="3" cellspacing="0"> * <tr><td><c>ErrorCode.EC_NETWORKERROR</c></td> * <td>A networking error has occurred and the conneciton * is nolonger valid. * </td></tr> * <tr><td><c>ErrorCode.EC_NOMOREMESSAGES</c></td> * <td>The queue is empty and no more messages are * available. * </td></tr> * <tr><td><c>ErrorCode.EC_ALREADYCLOSED</c></td> * <td>The queue reference is not valid as it has * been closed. * </td></tr> * <tr><td><c>ErrorCode.EC_NOTAUTHORIZED</c></td> * <td>The user is not authorized to Read messages from this * queue. * </td></tr> * <tr><td><c>ErrorCode.EC_NOTOPEN</c></td> * <td>The queue specified has not been opened by this connection. * </td></tr> * <tr><td><c>ErrorCode.EC_TIMEDOUT</c></td> * <td>The operation timed out before a message became available. * </td></tr> * </table> * </returns> * * <seealso cref="Enqueue(QueueHandle, QueueMessage)"/> * <seealso cref="OpenQueue(string, QueueHandle)"/> */ public ErrorCode RetrieveID(QueueHandle qhandle, bool retrievebody, UUID id, int timeoutseconds, QueueMessage msg) { ErrorCode ret = ErrorCode.EC_NOERROR; RETRIEVE_ID_PEEK_ID_PARAMS parms = new RETRIEVE_ID_PEEK_ID_PARAMS(); parms.queueID = qhandle; parms.retrievebody = (byte)(retrievebody?1:0); parms.reciptID = id; parms.timeoutseconds = timeoutseconds; try { output.Write(Safmq.CMD_RETRIEVE_ID); parms.Write(output);output.Flush(); ret = getResponseCode(); if (ret == ErrorCode.EC_NOERROR) { msg.Read(input,retrievebody); ret = ackRetrieveCursor(qhandle,msg); } } catch (IOException) { ret = ErrorCode.EC_NETWORKERROR; } return ret; }
/** * <summary> * Package protected member to read the mesage from a DataOutput stream. * </summary> * * <param name="input"> The stream from which the data is to be read</param> * <param name="retrievebody"> A flag indicating the body of the message should * be retrieved.</param> * * * <exception cref="Exception"> In the case that the stream experiences an error * while reading data.</exception> */ internal void Read(BinaryReader input, bool retrievebody) { // Make sure that if this object is being reused we don't over write the UUID (messageID = new UUID()).Read(input); messageClass = (MessageClassEnum)input.ReadByte(); messagePriority = (MessagePriorityEnum)input.ReadByte(); byte[] tmp = input.ReadBytes(Safmq.MSGLBL_LENGTH); label = new string(Encoding.UTF8.GetChars(tmp, 0, ioutil.length(tmp))); timeStamp = input.ReadInt32(); timeToLiveSeconds = input.ReadInt32(); ttlErrorWanted = input.ReadByte(); tmp = input.ReadBytes(Safmq.QNAME_LENGTH); this.responseQueueName = new string(Encoding.UTF8.GetChars(tmp, 0, ioutil.length(tmp))); // Make sure that if this object is being reused we don't over write the UUID (reciptID = new UUID()).Read(input); bodyType = (BodyTypeEnum)input.ReadByte(); bodySize = input.ReadInt32(); if (bodySize > 0) body = new MemoryStream(input.ReadBytes(bodySize)); }
internal ENQUEUE_RESPONSE_DATA(UUID id, int ts) { msgID = id; timestamp = ts; }