11using System ;
22using System . Collections . Generic ;
3- using System . Data ;
43using System . Threading . Tasks ;
54using Dapper ;
65using DotNetCore . CAP . Infrastructure ;
@@ -43,15 +42,11 @@ public async Task<CapPublishedMessage> GetPublishedMessageAsync(int id)
4342 public Task < IFetchedMessage > FetchNextMessageAsync ( )
4443 {
4544 var sql = $@ "
46- SELECT `MessageId`,`MessageType` FROM `{ _prefix } .queue` LIMIT 1 FOR UPDATE;
47- DELETE FROM `{ _prefix } .queue` LIMIT 1;" ;
45+ UPDATE `{ _prefix } .queue` SET `ProcessId`=@ProcessId WHERE `ProcessId` IS NULL LIMIT 1;
46+ SELECT `MessageId`,`MessageType` FROM `{ _prefix } .queue` WHERE `ProcessId`=@ProcessId;
47+ DELETE FROM `{ _prefix } .queue` WHERE `ProcessId`=@ProcessId" ;
4848
49- // The following `sql` can improve performance, but repeated consumption occurs in multiple instances
50- //var sql = $@"
51- //SELECT @MId:=`MessageId` as MessageId, @MType:=`MessageType` as MessageType FROM `{_prefix}.queue` LIMIT 1;
52- //DELETE FROM `{_prefix}.queue` where `MessageId` = @MId AND `MessageType`=@MType;";
53-
54- return FetchNextMessageCoreAsync ( sql ) ;
49+ return FetchNextMessageCoreAsync ( sql , new { ProcessId = Guid . NewGuid ( ) . ToString ( ) } ) ;
5550 }
5651
5752 public async Task < CapPublishedMessage > GetNextPublishedMessageToBeEnqueuedAsync ( )
@@ -122,11 +117,6 @@ public async Task<IEnumerable<CapReceivedMessage>> GetFailedReceivedMessages()
122117 }
123118 }
124119
125-
126- public void Dispose ( )
127- {
128- }
129-
130120 public bool ChangePublishedState ( int messageId , string state )
131121 {
132122 var sql =
@@ -151,44 +141,20 @@ public bool ChangeReceivedState(int messageId, string state)
151141
152142 private async Task < IFetchedMessage > FetchNextMessageCoreAsync ( string sql , object args = null )
153143 {
154- //here don't use `using` to dispose
155- var connection = new MySqlConnection ( Options . ConnectionString ) ;
156- await connection . OpenAsync ( ) ;
157- var transaction = connection . BeginTransaction ( IsolationLevel . ReadCommitted ) ;
158- FetchedMessage fetchedMessage = null ;
159- try
160- {
161- //fetchedMessage = await connection.QuerySingleOrDefaultAsync<FetchedMessage>(sql, args, transaction);
162- // An anomaly with unknown causes, sometimes QuerySingleOrDefaultAsync can't return expected result.
163- using ( var reader = connection . ExecuteReader ( sql , args , transaction ) )
164- {
165- while ( reader . Read ( ) )
166- {
167- fetchedMessage = new FetchedMessage
168- {
169- MessageId = ( int ) reader . GetInt64 ( 0 ) ,
170- MessageType = ( MessageType ) reader . GetInt64 ( 1 )
171- } ;
172- }
173- }
174- }
175- catch ( MySqlException )
144+ FetchedMessage fetchedMessage ;
145+ using ( var connection = new MySqlConnection ( Options . ConnectionString ) )
176146 {
177- transaction . Dispose ( ) ;
178- connection . Dispose ( ) ;
179- throw ;
147+ fetchedMessage = await connection . QuerySingleOrDefaultAsync < FetchedMessage > ( sql , args ) ;
180148 }
181149
182150 if ( fetchedMessage == null )
183- {
184- transaction . Rollback ( ) ;
185- transaction . Dispose ( ) ;
186- connection . Dispose ( ) ;
187151 return null ;
188- }
189152
190- return new MySqlFetchedMessage ( fetchedMessage . MessageId , fetchedMessage . MessageType , connection ,
191- transaction ) ;
153+ return new MySqlFetchedMessage ( fetchedMessage . MessageId , fetchedMessage . MessageType , Options . ConnectionString ) ;
154+ }
155+
156+ public void Dispose ( )
157+ {
192158 }
193159 }
194160}
0 commit comments