diff --git a/Redis/include/Poco/Redis/AsyncReader.h b/Redis/include/Poco/Redis/AsyncReader.h index 79ce85b37..ad99a3975 100644 --- a/Redis/include/Poco/Redis/AsyncReader.h +++ b/Redis/include/Poco/Redis/AsyncReader.h @@ -22,6 +22,7 @@ #include "Poco/Redis/Redis.h" #include "Poco/Redis/Client.h" +#include "Poco/Redis/RedisEventArgs.h" #include "Poco/Activity.h" namespace Poco { @@ -37,8 +38,10 @@ class Redis_API AsyncReader { public: - BasicEvent redisResponse; + BasicEvent redisResponse; /// Event that is called when a message is received + BasicEvent redisException; + /// Event that is called when an error occurred. AsyncReader(Client& client); /// Constructor. diff --git a/Redis/include/Poco/Redis/RedisEventArgs.h b/Redis/include/Poco/Redis/RedisEventArgs.h new file mode 100644 index 000000000..eca6c9877 --- /dev/null +++ b/Redis/include/Poco/Redis/RedisEventArgs.h @@ -0,0 +1,85 @@ +// +// RedisEventArgs.h +// +// $Id$ +// +// Library: Redis +// Package: Redis +// Module: RedisEventArgs +// +// Definition of the RedisEventArgs class. +// +// Copyright (c) 2012, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + +#ifndef Redis_RedisEventArgs_INCLUDED +#define Redis_RedisEventArgs_INCLUDED + +#include "Poco/Redis/Type.h" + +namespace Poco { +namespace Redis { + +class Redis_API RedisEventArgs +{ +public: + RedisEventArgs(RedisType::Ptr message); + /// Constructor + + RedisEventArgs(Exception* e); + /// Constructor + + ~RedisEventArgs(); + /// Destructor + + RedisType::Ptr message() const; + /// Returns the message retrieved from the Redis server. + /// This can be a NULL pointer when this event is about an exception. + + const Exception* exception() const; + /// Returns the exception if any, otherwise it returns null pointer + + void stop(); + /// When called, the AsyncReader will stop. + /// Note: The AsyncReader will always stop when this is an exception + /// event. Use this for example for pub/sub when there are no + /// subcribers anymore ... + + bool isStopped() const; + /// Returns true when the AsyncReader will stop + +private: + RedisType::Ptr _message; + + Exception* _exception; + + bool _stop; +}; + +inline RedisType::Ptr RedisEventArgs::message() const +{ + return _message; +} + +inline const Exception* RedisEventArgs::exception() const +{ + return _exception; +} + +inline bool RedisEventArgs::isStopped() const +{ + return _stop; +} + +inline void RedisEventArgs::stop() +{ + _stop = true; +} + + +}} // namespace Poco::Redis + +#endif // Redis_RedisEventArgs_INCLUDED diff --git a/Redis/src/AsyncReader.cpp b/Redis/src/AsyncReader.cpp index 2a9663629..41a3ebcba 100644 --- a/Redis/src/AsyncReader.cpp +++ b/Redis/src/AsyncReader.cpp @@ -40,16 +40,19 @@ void AsyncReader::runActivity() try { RedisType::Ptr reply = _client.readReply(); - redisResponse.notify(this, reply); + + RedisEventArgs args(reply); + redisResponse.notify(this, args); + + if ( args.isStopped() ) stop(); } - catch(TimeoutException&) - { - continue; - } - catch(Exception &) + catch(Exception& e) { + RedisEventArgs args(&e); + redisException.notify(this, args); stop(); } + if (!_activity.isStopped()) Thread::trySleep(100); } } diff --git a/Redis/src/RedisEventArgs.cpp b/Redis/src/RedisEventArgs.cpp new file mode 100644 index 000000000..4a7cd7e18 --- /dev/null +++ b/Redis/src/RedisEventArgs.cpp @@ -0,0 +1,43 @@ +// +// RedisEventArgs.cpp +// +// $Id$ +// +// Library: Redis +// Package: Redis +// Module: RedisEventArgs +// +// Implementation of the RedisEventArgs class. +// +// Copyright (c) 2012, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + +#include "Poco/Redis/RedisEventArgs.h" + +namespace Poco { +namespace Redis { + +RedisEventArgs::RedisEventArgs(RedisType::Ptr message) : + _message(message), + _exception(0), + _stop(false) +{ +} + +RedisEventArgs::RedisEventArgs(Exception* exception) : + _message(), + _exception(exception ? exception->clone() : 0), + _stop(false) +{ +} + +RedisEventArgs::~RedisEventArgs() +{ + delete _exception; +} + + +}} // namespace Poco::Redis \ No newline at end of file