@@ -35,23 +35,28 @@ public RedisMessageQueue(IRedisClient redis, RedisEventStoreSettings settings, s
3535
3636 public async Task PublishAsync ( IMessage message )
3737 {
38- if ( message . TimeStamp == default ( DateTimeOffset ) )
38+ await PublishAsync ( message , null ) . ConfigureAwait ( false ) ;
39+ }
40+
41+ public async Task PublishAsync ( IMessage message , int ? capacity )
42+ {
43+ if ( message . TimeStamp == default ( DateTimeOffset ) )
3944 {
4045 message . TimeStamp = DateTimeOffset . UtcNow ;
4146 }
4247
4348 var serializedEvent = JsonConvert . SerializeObject ( message , JsonSerializerSettings ) ;
4449 var messageType = message . GetType ( ) . Name ;
4550
46- await PublishAsync ( serializedEvent , message . Id , messageType ) . ConfigureAwait ( false ) ;
51+ await PublishAsync ( serializedEvent , message . Id , messageType , capacity ) . ConfigureAwait ( false ) ;
4752 }
4853
49- public async Task PublishAsync ( string serializedMessage , string messageId , string messageType )
54+ public async Task PublishAsync ( string serializedMessage , string messageId , string messageType , int ? capacity = null )
5055 {
5156 //Publish the event
5257 for ( var i = 0 ; i < _settings . TransactionRetryCount ; i ++ )
5358 {
54- var publishTran = await GeneratePublishTransaction ( serializedMessage , messageType ) . ConfigureAwait ( false ) ;
59+ var publishTran = await GeneratePublishTransaction ( serializedMessage , messageType , capacity ) . ConfigureAwait ( false ) ;
5560 if ( await publishTran . ExecuteAsync ( ) . ConfigureAwait ( false ) )
5661 {
5762 return ;
@@ -63,7 +68,8 @@ public async Task PublishAsync(string serializedMessage, string messageId, strin
6368 throw new MessagePublishFailedException ( messageId , _settings . TransactionRetryCount ) ;
6469 }
6570
66- private async Task < ITransaction > GeneratePublishTransaction ( string serializedEvent , string messageType )
71+
72+ private async Task < ITransaction > GeneratePublishTransaction ( string serializedEvent , string messageType , int ? capacity )
6773 {
6874 var eventKey = $ "{ _environment } :{ messageType } ";
6975
@@ -82,6 +88,13 @@ private async Task<ITransaction> GeneratePublishTransaction(string serializedEve
8288 foreach ( var subscriber in subscribers )
8389 {
8490 var listKey = $ "{ subscriber } :{{{eventKey}}}:PublishedEvents";
91+
92+ if ( capacity . HasValue )
93+ {
94+ var waiter = new AsyncConditionWaiter ( async ( ) => await _redis . Database . ListLengthAsync ( listKey ) < capacity ) ;
95+ await waiter . WaitForConditionAsync ( ) . ConfigureAwait ( false ) ;
96+ }
97+
8598 tran . ListLeftPushAsync ( listKey , serializedEvent ) . ConfigureAwait ( false ) ;
8699 }
87100
0 commit comments