/* | |
* | |
* Licensed to the Apache Software Foundation (ASF) under one | |
* or more contributor license agreements. See the NOTICE file | |
* distributed with this work for additional information | |
* regarding copyright ownership. The ASF licenses this file | |
* to you under the Apache License, Version 2.0 (the | |
* "License"); you may not use this file except in compliance | |
* with the License. You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, | |
* software distributed under the License is distributed on an | |
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
* KIND, either express or implied. See the License for the | |
* specific language governing permissions and limitations | |
* under the License. | |
* | |
*/ | |
using System; | |
using System.Collections.Generic; | |
using Org.Apache.Qpid.Messaging; | |
namespace Org.Apache.Qpid.Messaging.SessionReceiver | |
{ | |
/// <summary> | |
/// ISessionReceiver interface defines the callback for users to supply. | |
/// Once established this callback will receive all messages for all | |
/// receivers defined by the current session. | |
/// Users are expected not to 'fetch' or 'get' messages by any other means. | |
/// Users must acknowledge() the Session's messages either in the callback | |
/// function or by some other scheme. | |
/// </summary> | |
public interface ISessionReceiver | |
{ | |
void SessionReceiver(Receiver receiver, Message message); | |
void SessionException(Exception exception); | |
} | |
/// <summary> | |
/// EventEngine - wait for messages from the underlying C++ code. | |
/// When available get them and deliver them via callback to our | |
/// client through the ISessionReceiver interface. | |
/// This class consumes the thread that calls the Run() function. | |
/// </summary> | |
internal class EventEngine | |
{ | |
private Session session; | |
private ISessionReceiver callback; | |
private bool keepRunning; | |
public EventEngine(Session theSession, ISessionReceiver thecallback) | |
{ | |
this.session = theSession; | |
this.callback = thecallback; | |
} | |
/// <summary> | |
/// Function to call Session's nextReceiver, discover messages, | |
/// and to deliver messages through the callback. | |
/// </summary> | |
public void Open() | |
{ | |
Receiver rcvr; | |
Message msg; | |
try | |
{ | |
keepRunning = true; | |
while (keepRunning) | |
{ | |
rcvr = session.NextReceiver(DurationConstants.SECOND); | |
if (null != rcvr) | |
{ | |
if (keepRunning) | |
{ | |
msg = rcvr.Fetch(DurationConstants.SECOND); | |
this.callback.SessionReceiver(rcvr, msg); | |
} | |
} | |
//else | |
// receive timed out | |
// EventEngine exits the nextReceiver() function periodically | |
// in order to test the keepRunning flag | |
} | |
} | |
catch (Exception e) | |
{ | |
this.callback.SessionException(e); | |
} | |
// Private thread is now exiting. | |
} | |
/// <summary> | |
/// Function to stop the EventEngine. Private thread will exit within | |
/// one second. | |
/// </summary> | |
public void Close() | |
{ | |
keepRunning = false; | |
} | |
} | |
/// <summary> | |
/// server is the class that users instantiate to connect a SessionReceiver | |
/// callback to the stream of received messages received on a Session. | |
/// </summary> | |
public class CallbackServer | |
{ | |
private EventEngine ee; | |
/// <summary> | |
/// Constructor for the server. | |
/// </summary> | |
/// <param name="session">The Session whose messages are collected.</param> | |
/// <param name="callback">The user function call with each message.</param> | |
/// | |
public CallbackServer(Session session, ISessionReceiver callback) | |
{ | |
ee = new EventEngine(session, callback); | |
new System.Threading.Thread( | |
new System.Threading.ThreadStart(ee.Open)).Start(); | |
} | |
/// <summary> | |
/// Function to stop the server. | |
/// </summary> | |
public void Close() | |
{ | |
ee.Close(); | |
} | |
} | |
} |