Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
CAP
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
tsai
CAP
Commits
81bf77c6
Commit
81bf77c6
authored
Apr 26, 2019
by
Savorboard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fixed consumer re-register transport bug. (#329)
parent
de04d99c
Changes
12
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
131 additions
and
27 deletions
+131
-27
Directory.Build.props
src/Directory.Build.props
+1
-1
AzureServiceBusConsumerClient.cs
...Core.CAP.AzureServiceBus/AzureServiceBusConsumerClient.cs
+0
-1
AzureServiceBusConsumerClientFactory.cs
...P.AzureServiceBus/AzureServiceBusConsumerClientFactory.cs
+9
-2
KafkaConsumerClient.cs
src/DotNetCore.CAP.Kafka/KafkaConsumerClient.cs
+2
-5
KafkaConsumerClientFactory.cs
src/DotNetCore.CAP.Kafka/KafkaConsumerClientFactory.cs
+8
-1
RabbitMQConsumerClientFactory.cs
src/DotNetCore.CAP.RabbitMQ/RabbitMQConsumerClientFactory.cs
+8
-2
BrokerConnectionException.cs
src/DotNetCore.CAP/BrokerConnectionException.cs
+13
-0
CAP.ServiceCollectionExtensions.cs
src/DotNetCore.CAP/CAP.ServiceCollectionExtensions.cs
+4
-1
IConsumerRegister.Default.cs
src/DotNetCore.CAP/IConsumerRegister.Default.cs
+46
-13
IConsumerRegister.cs
src/DotNetCore.CAP/IConsumerRegister.cs
+4
-1
IProcessingServer.Cap.cs
src/DotNetCore.CAP/Processor/IProcessingServer.Cap.cs
+1
-0
IProcessor.TransportCheck.cs
src/DotNetCore.CAP/Processor/IProcessor.TransportCheck.cs
+35
-0
No files found.
Directory.Build.props
→
src/
Directory.Build.props
View file @
81bf77c6
<Project>
<Import Project="build\version.props" />
<Import Project="
..\
build\version.props" />
<PropertyGroup Label="Package">
<Product>CAP</Product>
...
...
src/DotNetCore.CAP.AzureServiceBus/AzureServiceBusConsumerClient.cs
View file @
81bf77c6
...
...
@@ -71,7 +71,6 @@ namespace DotNetCore.CAP.AzureServiceBus
public
void
Listening
(
TimeSpan
timeout
,
CancellationToken
cancellationToken
)
{
_consumerClient
.
RegisterMessageHandler
(
OnConsumerReceived
,
new
MessageHandlerOptions
(
OnExceptionReceived
)
{
...
...
src/DotNetCore.CAP.AzureServiceBus/AzureServiceBusConsumerClientFactory.cs
View file @
81bf77c6
...
...
@@ -20,8 +20,15 @@ namespace DotNetCore.CAP.AzureServiceBus
public
IConsumerClient
Create
(
string
groupId
)
{
var
logger
=
_loggerFactory
.
CreateLogger
(
typeof
(
AzureServiceBusConsumerClient
));
return
new
AzureServiceBusConsumerClient
(
logger
,
groupId
,
_asbOptions
);
try
{
var
logger
=
_loggerFactory
.
CreateLogger
(
typeof
(
AzureServiceBusConsumerClient
));
return
new
AzureServiceBusConsumerClient
(
logger
,
groupId
,
_asbOptions
);
}
catch
(
System
.
Exception
e
)
{
throw
new
BrokerConnectionException
(
e
);
}
}
}
}
\ No newline at end of file
src/DotNetCore.CAP.Kafka/KafkaConsumerClient.cs
View file @
81bf77c6
...
...
@@ -21,6 +21,8 @@ namespace DotNetCore.CAP.Kafka
_groupId
=
groupId
;
_kafkaOptions
=
options
??
throw
new
ArgumentNullException
(
nameof
(
options
));
StringDeserializer
=
new
StringDeserializer
(
Encoding
.
UTF8
);
InitKafkaClient
();
}
public
IDeserializer
<
string
>
StringDeserializer
{
get
;
set
;
}
...
...
@@ -38,11 +40,6 @@ namespace DotNetCore.CAP.Kafka
throw
new
ArgumentNullException
(
nameof
(
topics
));
}
if
(
_consumerClient
==
null
)
{
InitKafkaClient
();
}
_consumerClient
.
Subscribe
(
topics
);
}
...
...
src/DotNetCore.CAP.Kafka/KafkaConsumerClientFactory.cs
View file @
81bf77c6
...
...
@@ -14,7 +14,14 @@ namespace DotNetCore.CAP.Kafka
public
IConsumerClient
Create
(
string
groupId
)
{
return
new
KafkaConsumerClient
(
groupId
,
_kafkaOptions
);
try
{
return
new
KafkaConsumerClient
(
groupId
,
_kafkaOptions
);
}
catch
(
System
.
Exception
e
)
{
throw
new
BrokerConnectionException
(
e
);
}
}
}
}
\ No newline at end of file
src/DotNetCore.CAP.RabbitMQ/RabbitMQConsumerClientFactory.cs
View file @
81bf77c6
...
...
@@ -8,7 +8,6 @@ namespace DotNetCore.CAP.RabbitMQ
private
readonly
IConnectionChannelPool
_connectionChannelPool
;
private
readonly
RabbitMQOptions
_rabbitMQOptions
;
public
RabbitMQConsumerClientFactory
(
RabbitMQOptions
rabbitMQOptions
,
IConnectionChannelPool
channelPool
)
{
_rabbitMQOptions
=
rabbitMQOptions
;
...
...
@@ -17,7 +16,14 @@ namespace DotNetCore.CAP.RabbitMQ
public
IConsumerClient
Create
(
string
groupId
)
{
return
new
RabbitMQConsumerClient
(
groupId
,
_connectionChannelPool
,
_rabbitMQOptions
);
try
{
return
new
RabbitMQConsumerClient
(
groupId
,
_connectionChannelPool
,
_rabbitMQOptions
);
}
catch
(
System
.
Exception
e
)
{
throw
new
BrokerConnectionException
(
e
);
}
}
}
}
\ No newline at end of file
src/DotNetCore.CAP/BrokerConnectionException.cs
0 → 100644
View file @
81bf77c6
using
System
;
namespace
DotNetCore.CAP
{
public
class
BrokerConnectionException
:
Exception
{
public
BrokerConnectionException
(
Exception
innerException
)
:
base
(
"Broker Unreachable"
,
innerException
)
{
}
}
}
src/DotNetCore.CAP/CAP.ServiceCollectionExtensions.cs
View file @
81bf77c6
...
...
@@ -50,12 +50,15 @@ namespace Microsoft.Extensions.DependencyInjection
services
.
TryAddSingleton
<
MethodMatcherCache
>();
//Processors
services
.
TryAddEnumerable
(
ServiceDescriptor
.
Singleton
<
IProcessingServer
,
ConsumerHandler
>());
services
.
TryAddSingleton
<
IConsumerRegister
,
ConsumerRegister
>();
services
.
TryAddEnumerable
(
ServiceDescriptor
.
Singleton
<
IProcessingServer
,
CapProcessingServer
>());
services
.
TryAddEnumerable
(
ServiceDescriptor
.
Singleton
<
IProcessingServer
,
ConsumerRegister
>());
services
.
TryAddSingleton
<
IStateChanger
,
StateChanger
>();
//Queue's message processor
services
.
TryAddSingleton
<
NeedRetryMessageProcessor
>();
services
.
TryAddSingleton
<
TransportCheckProcessor
>();
//Sender and Executors
services
.
TryAddSingleton
<
IDispatcher
,
Dispatcher
>();
...
...
src/DotNetCore.CAP/IConsumer
Handl
er.Default.cs
→
src/DotNetCore.CAP/IConsumer
Regist
er.Default.cs
View file @
81bf77c6
...
...
@@ -14,29 +14,30 @@ using Microsoft.Extensions.Logging;
namespace
DotNetCore.CAP
{
internal
class
Consumer
Handler
:
IConsumerHandl
er
internal
class
Consumer
Register
:
IConsumerRegist
er
{
private
readonly
IStorageConnection
_connection
;
private
readonly
IConsumerClientFactory
_consumerClientFactory
;
private
readonly
CancellationTokenSource
_cts
;
private
readonly
IDispatcher
_dispatcher
;
private
readonly
ILogger
_logger
;
private
readonly
TimeSpan
_pollingDelay
=
TimeSpan
.
FromSeconds
(
1
);
private
readonly
MethodMatcherCache
_selector
;
private
CancellationTokenSource
_cts
;
private
string
_serverAddress
;
private
Task
_compositeTask
;
private
bool
_disposed
;
private
static
bool
_isHealthy
=
true
;
// diagnostics listener
// ReSharper disable once InconsistentNaming
private
static
readonly
DiagnosticListener
s_diagnosticListener
=
new
DiagnosticListener
(
CapDiagnosticListenerExtensions
.
DiagnosticListenerName
);
public
Consumer
Handl
er
(
IConsumerClientFactory
consumerClientFactory
,
public
Consumer
Regist
er
(
IConsumerClientFactory
consumerClientFactory
,
IDispatcher
dispatcher
,
IStorageConnection
connection
,
ILogger
<
Consumer
Handl
er
>
logger
,
ILogger
<
Consumer
Regist
er
>
logger
,
MethodMatcherCache
selector
)
{
_selector
=
selector
;
...
...
@@ -44,26 +45,44 @@ namespace DotNetCore.CAP
_consumerClientFactory
=
consumerClientFactory
;
_dispatcher
=
dispatcher
;
_connection
=
connection
;
_cts
=
new
CancellationTokenSource
();
}
public
bool
IsHealthy
()
{
return
_isHealthy
;
}
public
void
Start
()
{
_cts
=
new
CancellationTokenSource
();
var
groupingMatches
=
_selector
.
GetCandidatesMethodsOfGroupNameGrouped
();
foreach
(
var
matchGroup
in
groupingMatches
)
{
Task
.
Factory
.
StartNew
(()
=>
{
using
(
var
client
=
_consumerClientFactory
.
Create
(
matchGroup
.
Key
))
try
{
_serverAddress
=
client
.
ServersAddress
;
using
(
var
client
=
_consumerClientFactory
.
Create
(
matchGroup
.
Key
))
{
_serverAddress
=
client
.
ServersAddress
;
RegisterMessageProcessor
(
client
);
RegisterMessageProcessor
(
client
);
client
.
Subscribe
(
matchGroup
.
Value
.
Select
(
x
=>
x
.
Attribute
.
Name
));
client
.
Subscribe
(
matchGroup
.
Value
.
Select
(
x
=>
x
.
Attribute
.
Name
));
client
.
Listening
(
_pollingDelay
,
_cts
.
Token
);
client
.
Listening
(
_pollingDelay
,
_cts
.
Token
);
}
}
catch
(
OperationCanceledException
)
{
//ignore
}
catch
(
BrokerConnectionException
e
)
{
_isHealthy
=
false
;
_logger
.
LogError
(
e
,
e
.
Message
);
}
},
_cts
.
Token
,
TaskCreationOptions
.
LongRunning
,
TaskScheduler
.
Default
);
}
...
...
@@ -71,6 +90,18 @@ namespace DotNetCore.CAP
_compositeTask
=
Task
.
CompletedTask
;
}
public
void
ReStart
(
bool
force
=
false
)
{
if
(!
IsHealthy
()
||
force
)
{
Pulse
();
_isHealthy
=
true
;
Start
();
}
}
public
void
Dispose
()
{
if
(
_disposed
)
...
...
@@ -79,9 +110,11 @@ namespace DotNetCore.CAP
}
_disposed
=
true
;
_cts
.
Cancel
();
try
{
Pulse
();
_compositeTask
?.
Wait
(
TimeSpan
.
FromSeconds
(
2
));
}
catch
(
AggregateException
ex
)
...
...
@@ -96,7 +129,7 @@ namespace DotNetCore.CAP
public
void
Pulse
()
{
//ignore
_cts
?.
Cancel
();
}
private
void
RegisterMessageProcessor
(
IConsumerClient
client
)
...
...
@@ -174,7 +207,7 @@ namespace DotNetCore.CAP
private
void
StoreMessage
(
CapReceivedMessage
receivedMessage
)
{
_connection
.
StoreReceivedMessage
(
receivedMessage
);
_connection
.
StoreReceivedMessage
(
receivedMessage
);
}
private
(
Guid
,
string
)
TracingBefore
(
string
topic
,
string
values
)
...
...
src/DotNetCore.CAP/IConsumer
Handl
er.cs
→
src/DotNetCore.CAP/IConsumer
Regist
er.cs
View file @
81bf77c6
...
...
@@ -6,7 +6,10 @@ namespace DotNetCore.CAP
/// <summary>
/// Handler received message of subscribed.
/// </summary>
public
interface
IConsumer
Handl
er
:
IProcessingServer
public
interface
IConsumer
Regist
er
:
IProcessingServer
{
bool
IsHealthy
();
void
ReStart
(
bool
force
=
false
);
}
}
\ No newline at end of file
src/DotNetCore.CAP/Processor/IProcessingServer.Cap.cs
View file @
81bf77c6
...
...
@@ -93,6 +93,7 @@ namespace DotNetCore.CAP.Processor
{
var
returnedProcessors
=
new
List
<
IProcessor
>
{
_provider
.
GetRequiredService
<
TransportCheckProcessor
>(),
_provider
.
GetRequiredService
<
NeedRetryMessageProcessor
>(),
_provider
.
GetRequiredService
<
ICollectProcessor
>()
};
...
...
src/DotNetCore.CAP/Processor/IProcessor.TransportCheck.cs
0 → 100644
View file @
81bf77c6
// Copyright (c) .NET Core Community. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
using
System
;
using
System.Threading.Tasks
;
namespace
DotNetCore.CAP.Processor
{
public
class
TransportCheckProcessor
:
IProcessor
{
private
readonly
IConsumerRegister
_register
;
private
readonly
TimeSpan
_waitingInterval
;
public
TransportCheckProcessor
(
IConsumerRegister
register
)
{
_register
=
register
;
_waitingInterval
=
TimeSpan
.
FromSeconds
(
30
);
}
public
async
Task
ProcessAsync
(
ProcessingContext
context
)
{
if
(
context
==
null
)
{
throw
new
ArgumentNullException
(
nameof
(
context
));
}
if
(!
_register
.
IsHealthy
())
{
_register
.
ReStart
();
}
await
context
.
WaitAsync
(
_waitingInterval
);
}
}
}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment