проект API C++

10 views
Skip to first unread message

aka...@gmail.com

unread,
Mar 1, 2010, 7:07:01 AM3/1/10
to RabbitMQ_rus
у кого будут какие идеи?
начинаю кодирование:

the Draft of C++ API

Connection class

class AMQPConnection {
AMQPConnection();
AMQPConnection( string connectionString );
AMQPConnection( string connectionString , int channelNumber);

void Open( string connectionString );
void Open( string connectionString , int channelNumber);

void Close();

setChannel(int channelNumber);
}

const AMQPCnnDebug = "localhost:5672"

the example:
AMQPConnection * cnn = new AMQPConnection( "guest:guest@localhost:
5673/somevhost" );

default connection string is "localhost:5672"
the debug connection string AMQPCnnDebug is "guest:guest@localhost:
5673"


Exchange class

class AMQPExchange {
AMQPExchange( AMQPConnection * cnn );

void Declare(string name);
void Declare(string name, int parms);
void Declare(string name, int parms, map properties ); // *)?

void Delete(string name)
}

the parms is set of constants as AMQPDurable, AMQPAutodelete etc
the type of exchange is AMQPDirect default or AMQPFanout, or
AMQPTopic


Example:
AMQPExchange * ex = new AMQPExchange(new AMQPConnection());
ex->Declare("my_exchange");

Queue class

class AMQPQueue {
AMQPQueue(AMQPConnection * cnn);

void Declare(string name);
void Declare(string name, int parms);
void Declare(string name, int parms, map properties ); // *)?

void Delete(string name)

void Purge (string name)

}
the parms is set of constants as AMQPDurable, AMQPAutodelete etc


example:
AMQPEQueue * qu = new AMQPEQueue(new AMQPConnection());
qu->Declare("qu_mylife");

Basic class:

class AMQPBasic {
AMQPBasic(AMQPConnection * cnn);

void setProperty(string name, string value );
void setProperty(string name, int value );

void Bind (string exchangeName, string queueName );
void Bind (string exchangeName, string queueName , string key);

void Publish( string exchangeName, string message);
void Publish( string exchangeName, uchar* message);
void Publish( string exchangeName, string message, string key);
void Publish( string exchangeName, uchar* message, string key);

void Cancel( string queueName)

AMQPMessage * Get( string queueName)


void Ask( string queueName ) ????

void Reject( string queueName ) ????

void Consume( string queueName , IAMQPCallback * callbackName );

}

class AMQPMessage ????
int timestamp
int expiration
string contentType
string deliveryTag
uchar* message or string
int number // internal number message
string exchange
string key
....

IAMQPCallback is abstract class, the callbackName is derived from
IAMQPCallback.
after received each the message call the method run of derived
AMQPCallback base class.


*) properties is map of addional property, it will to resolve in
future.

Examples:

// publish message
AMQPConnection * cnn = new AMQPConnection();
AMQPExchange * ex = new AMQPExchange(cnn);
ex->Declare("my_exchange", AMQPTopic);
basic = new AMQPBasic(cnn);
basic->Bind("my_exchange", "qu_mylive", "news" );
basic->Publish("my_exchange", "12345" , "news");


// consume message
class printMessage : IAMQPCallback {
void run (uchar* message) {
std::cout << message << std::endl;
}
}

AMQPConnection * cnn = new AMQPConnection();
basic = new AMQPBasic(cnn);
printMessage * pm = new printMessage();
basic->Consume("qu_mylive", pm);

unrealise classes(it will to resolve in future): AMQPFile,
AMQPStreams etc ...

exceptions:

AMQPnoConnectException
AMQPnonAutorizeException
AMQPnotFoundException
AMQPnotAllowedException
...
AMQPerrorException (AMQPcommandInvalidException )


Max Lapshin

unread,
Mar 1, 2010, 7:16:44 AM3/1/10
to rabbit...@googlegroups.com
Идея очень простая: для каких условий предполагается использование?
Если структура программы evented, то класс должен уметь подписывать на
события какие-то коллбеки. Если структура другая, то как обрабатывать
приходящие асинхронно сообщения?

aka...@gmail.com

unread,
Mar 1, 2010, 12:08:47 PM3/1/10
to RabbitMQ_rus

Максим,

пока я вижу события на подписку - Consume
там предусмотрен кэллбэк:
// consume message
class printMessage : IAMQPCallback ;

передается как-то так:

printMessage * pm = new printMessage();
basic->Consume("qu_mylive", pm);

при каждом эвентсе (приход сообщения, приход отбоя...), будет
вызываться метод run класса printMessage
или можно сделать как-то по другому?


где еще могут быть кэллбеки?
прежде чем кодить, хочу разобраться в архитектуре.

aka...@gmail.com

unread,
Mar 1, 2010, 1:37:04 PM3/1/10
to RabbitMQ_rus
Спасибо за идею,
так будет правильнее:

{{{
class pm : AMQPEvent { ... }

basic->addEvent( AMQPReceiveMessage, pm);
        basic->Consume("qu_mylive");
}}}

Max Lapshin

unread,
Mar 1, 2010, 12:41:11 PM3/1/10
to rabbit...@googlegroups.com
А кто будет активировать коллбек?

aka...@gmail.com

unread,
Mar 1, 2010, 1:38:46 PM3/1/10
to RabbitMQ_rus

On 1 мар, 20:41, Max Lapshin <m...@maxidoors.ru> wrote:
> А кто будет активировать коллбек?

каллбэк будет активироваться в методе basic->Consume("qu_mylive");

Max Lapshin

unread,
Mar 1, 2010, 1:49:29 PM3/1/10
to rabbit...@googlegroups.com
Т.е. только пассивный режим?

Alexandre Kalendarev

unread,
Mar 1, 2010, 8:17:05 PM3/1/10
to rabbit...@googlegroups.com

1 марта 2010 г. 21:49 пользователь Max Lapshin <m...@maxidoors.ru> написал:
Т.е. только пассивный режим?

получается что так, а сделать активный режим разве получится?
в любом случае нужно отправить фрейм Basic.Consume и начинать принимать входящие фреймы
 
на событие AMQPonMessage можно повесить любое кол-во обработчиков
еще может возникнуть событие AMQPonCancel - сброс подписки.
 
а как тебе видится эта модель?
Reply all
Reply to author
Forward
0 new messages