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
5d7c7796
Commit
5d7c7796
authored
Nov 27, 2019
by
Savorboard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Rename class
parent
cb86c952
Changes
11
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
114 additions
and
115 deletions
+114
-115
DashboardRoutes.cs
src/DotNetCore.CAP.Dashboard/DashboardRoutes.cs
+1
-1
CAP.ServiceCollectionExtensions.cs
src/DotNetCore.CAP/CAP.ServiceCollectionExtensions.cs
+2
-2
ConsumerInvokerFactory.cs
src/DotNetCore.CAP/Internal/ConsumerInvokerFactory.cs
+3
-3
ISubscribeDispatcher.Default.cs
src/DotNetCore.CAP/Internal/ISubscribeDispatcher.Default.cs
+8
-8
ISubscribeDispatcher.cs
src/DotNetCore.CAP/Internal/ISubscribeDispatcher.cs
+3
-3
ISubscribeInvoker.Default.cs
src/DotNetCore.CAP/Internal/ISubscribeInvoker.Default.cs
+83
-83
ISubscribeInvoker.cs
src/DotNetCore.CAP/Internal/ISubscribeInvoker.cs
+2
-2
ISubscribeInvokerFactory.cs
src/DotNetCore.CAP/Internal/ISubscribeInvokerFactory.cs
+2
-2
IDispatcher.Default.cs
src/DotNetCore.CAP/Processor/IDispatcher.Default.cs
+3
-3
IProcessor.NeedRetry.cs
src/DotNetCore.CAP/Processor/IProcessor.NeedRetry.cs
+4
-4
ConsumerInvokerTest.cs
test/DotNetCore.CAP.Test/ConsumerInvokerTest.cs
+3
-4
No files found.
src/DotNetCore.CAP.Dashboard/DashboardRoutes.cs
View file @
5d7c7796
...
...
@@ -111,7 +111,7 @@ namespace DotNetCore.CAP.Dashboard
{
var
msg
=
client
.
Storage
.
GetMonitoringApi
().
GetReceivedMessageAsync
(
messageId
)
.
GetAwaiter
().
GetResult
();
client
.
RequestServices
.
GetService
<
ISubscribe
rExecutor
>().
Execute
Async
(
msg
);
client
.
RequestServices
.
GetService
<
ISubscribe
Dispatcher
>().
Dispatch
Async
(
msg
);
});
Routes
.
AddRazorPage
(
...
...
src/DotNetCore.CAP/CAP.ServiceCollectionExtensions.cs
View file @
5d7c7796
...
...
@@ -39,7 +39,7 @@ namespace Microsoft.Extensions.DependencyInjection
services
.
TryAddSingleton
<
ICapPublisher
,
CapPublisher
>();
services
.
TryAddSingleton
<
IConsumerServiceSelector
,
DefaultConsumerServiceSelector
>();
services
.
TryAddSingleton
<
I
Consumer
InvokerFactory
,
ConsumerInvokerFactory
>();
services
.
TryAddSingleton
<
I
Subscribe
InvokerFactory
,
ConsumerInvokerFactory
>();
services
.
TryAddSingleton
<
MethodMatcherCache
>();
services
.
TryAddSingleton
<
IConsumerRegister
,
ConsumerRegister
>();
...
...
@@ -60,7 +60,7 @@ namespace Microsoft.Extensions.DependencyInjection
services
.
TryAddSingleton
<
ISerializer
,
JsonUtf8Serializer
>();
// Warning: IPublishMessageSender need to inject at extension project.
services
.
TryAddSingleton
<
ISubscribe
rExecutor
,
DefaultSubscriberExecuto
r
>();
services
.
TryAddSingleton
<
ISubscribe
Dispatcher
,
DefaultSubscribeDispatche
r
>();
//Options and extension service
var
options
=
new
CapOptions
();
...
...
src/DotNetCore.CAP/Internal/ConsumerInvokerFactory.cs
View file @
5d7c7796
...
...
@@ -6,7 +6,7 @@ using Microsoft.Extensions.Logging;
namespace
DotNetCore.CAP.Internal
{
internal
class
ConsumerInvokerFactory
:
I
Consumer
InvokerFactory
internal
class
ConsumerInvokerFactory
:
I
Subscribe
InvokerFactory
{
private
readonly
ILoggerFactory
_loggerFactory
;
private
readonly
IServiceProvider
_serviceProvider
;
...
...
@@ -19,9 +19,9 @@ namespace DotNetCore.CAP.Internal
_serviceProvider
=
serviceProvider
;
}
public
I
Consumer
Invoker
CreateInvoker
()
public
I
Subscribe
Invoker
CreateInvoker
()
{
return
new
Default
Consumer
Invoker
(
_loggerFactory
,
_serviceProvider
);
return
new
Default
Subscribe
Invoker
(
_loggerFactory
,
_serviceProvider
);
}
}
}
\ No newline at end of file
src/DotNetCore.CAP/Internal/ISubscribe
rExecuto
r.Default.cs
→
src/DotNetCore.CAP/Internal/ISubscribe
Dispatche
r.Default.cs
View file @
5d7c7796
...
...
@@ -17,7 +17,7 @@ using Microsoft.Extensions.Options;
namespace
DotNetCore.CAP.Internal
{
internal
class
DefaultSubscribe
rExecutor
:
ISubscriberExecuto
r
internal
class
DefaultSubscribe
Dispatcher
:
ISubscribeDispatche
r
{
private
readonly
IDataStorage
_dataStorage
;
private
readonly
ILogger
_logger
;
...
...
@@ -29,8 +29,8 @@ namespace DotNetCore.CAP.Internal
private
static
readonly
DiagnosticListener
s_diagnosticListener
=
new
DiagnosticListener
(
CapDiagnosticListenerNames
.
DiagnosticListenerName
);
public
DefaultSubscribe
rExecuto
r
(
ILogger
<
DefaultSubscribe
rExecuto
r
>
logger
,
public
DefaultSubscribe
Dispatche
r
(
ILogger
<
DefaultSubscribe
Dispatche
r
>
logger
,
IOptions
<
CapOptions
>
options
,
IServiceProvider
provider
)
{
...
...
@@ -39,12 +39,12 @@ namespace DotNetCore.CAP.Internal
_options
=
options
.
Value
;
_dataStorage
=
_provider
.
GetService
<
IDataStorage
>();
Invoker
=
_provider
.
GetService
<
I
Consumer
InvokerFactory
>().
CreateInvoker
();
Invoker
=
_provider
.
GetService
<
I
Subscribe
InvokerFactory
>().
CreateInvoker
();
}
private
I
Consumer
Invoker
Invoker
{
get
;
}
private
I
Subscribe
Invoker
Invoker
{
get
;
}
public
Task
<
OperateResult
>
Execute
Async
(
MediumMessage
message
,
CancellationToken
cancellationToken
)
public
Task
<
OperateResult
>
Dispatch
Async
(
MediumMessage
message
,
CancellationToken
cancellationToken
)
{
var
selector
=
_provider
.
GetService
<
MethodMatcherCache
>();
if
(!
selector
.
TryGetTopicExecutor
(
message
.
Origin
.
GetName
(),
message
.
Origin
.
GetGroup
(),
out
var
executor
))
...
...
@@ -58,10 +58,10 @@ namespace DotNetCore.CAP.Internal
return
Task
.
FromResult
(
OperateResult
.
Failed
(
new
SubscriberNotFoundException
(
error
)));
}
return
Execute
Async
(
message
,
executor
,
cancellationToken
);
return
Dispatch
Async
(
message
,
executor
,
cancellationToken
);
}
public
async
Task
<
OperateResult
>
Execute
Async
(
MediumMessage
message
,
ConsumerExecutorDescriptor
descriptor
,
CancellationToken
cancellationToken
)
public
async
Task
<
OperateResult
>
Dispatch
Async
(
MediumMessage
message
,
ConsumerExecutorDescriptor
descriptor
,
CancellationToken
cancellationToken
)
{
bool
retry
;
OperateResult
result
;
...
...
src/DotNetCore.CAP/Internal/ISubscribe
rExecuto
r.cs
→
src/DotNetCore.CAP/Internal/ISubscribe
Dispatche
r.cs
View file @
5d7c7796
...
...
@@ -10,10 +10,10 @@ namespace DotNetCore.CAP.Internal
/// <summary>
/// Consumer executor
/// </summary>
public
interface
ISubscribe
rExecuto
r
public
interface
ISubscribe
Dispatche
r
{
Task
<
OperateResult
>
Execute
Async
(
MediumMessage
message
,
CancellationToken
cancellationToken
=
default
);
Task
<
OperateResult
>
Dispatch
Async
(
MediumMessage
message
,
CancellationToken
cancellationToken
=
default
);
Task
<
OperateResult
>
Execute
Async
(
MediumMessage
message
,
ConsumerExecutorDescriptor
descriptor
,
CancellationToken
cancellationToken
=
default
);
Task
<
OperateResult
>
Dispatch
Async
(
MediumMessage
message
,
ConsumerExecutorDescriptor
descriptor
,
CancellationToken
cancellationToken
=
default
);
}
}
\ No newline at end of file
src/DotNetCore.CAP/Internal/I
Consumer
Invoker.Default.cs
→
src/DotNetCore.CAP/Internal/I
Subscribe
Invoker.Default.cs
View file @
5d7c7796
// 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.Linq
;
using
System.Threading
;
using
System.Threading.Tasks
;
using
DotNetCore.CAP.Messages
;
using
Microsoft.Extensions.DependencyInjection
;
using
Microsoft.Extensions.Internal
;
using
Microsoft.Extensions.Logging
;
namespace
DotNetCore.CAP.Internal
{
internal
class
Default
ConsumerInvoker
:
IConsumerInvoker
{
private
readonly
ILogger
_logger
;
private
readonly
IServiceProvider
_serviceProvider
;
public
Default
ConsumerInvoker
(
ILoggerFactory
loggerFactory
,
IServiceProvider
serviceProvider
)
{
_serviceProvider
=
serviceProvider
;
_logger
=
loggerFactory
.
CreateLogger
<
Default
ConsumerInvoker
>();
}
public
async
Task
<
ConsumerExecutedResult
>
InvokeAsync
(
ConsumerContext
context
,
CancellationToken
cancellationToken
=
default
)
{
cancellationToken
.
ThrowIfCancellationRequested
();
_logger
.
LogDebug
(
"Executing subscriber method : {0}"
,
context
.
ConsumerDescriptor
.
MethodInfo
.
Name
);
var
executor
=
ObjectMethodExecutor
.
Create
(
context
.
ConsumerDescriptor
.
MethodInfo
,
context
.
ConsumerDescriptor
.
ImplTypeInfo
);
using
(
var
scope
=
_serviceProvider
.
CreateScope
())
{
var
provider
=
scope
.
ServiceProvider
;
var
srvType
=
context
.
ConsumerDescriptor
.
ServiceTypeInfo
?.
AsType
();
var
implType
=
context
.
ConsumerDescriptor
.
ImplTypeInfo
.
AsType
();
object
obj
=
null
;
if
(
srvType
!=
null
)
{
obj
=
provider
.
GetServices
(
srvType
).
FirstOrDefault
(
o
=>
o
.
GetType
()
==
implType
);
}
if
(
obj
==
null
)
{
obj
=
ActivatorUtilities
.
GetServiceOrCreateInstance
(
provider
,
implType
);
}
var
message
=
context
.
DeliverMessage
;
var
parameterDescriptors
=
context
.
ConsumerDescriptor
.
Parameters
;
var
executeParameters
=
new
object
[
parameterDescriptors
.
Count
];
for
(
var
i
=
0
;
i
<
parameterDescriptors
.
Count
;
i
++)
{
if
(
parameterDescriptors
[
i
].
IsFromCap
)
{
executeParameters
[
i
]
=
new
CapHeader
(
message
.
Headers
);
}
else
{
executeParameters
[
i
]
=
message
.
Value
;
}
}
var
resultObj
=
await
ExecuteWithParameterAsync
(
executor
,
obj
,
executeParameters
);
return
new
ConsumerExecutedResult
(
resultObj
,
message
.
GetId
(),
message
.
GetCallbackName
());
}
}
private
async
Task
<
object
>
ExecuteWithParameterAsync
(
ObjectMethodExecutor
executor
,
object
@class
,
object
[]
parameter
)
{
if
(
executor
.
IsMethodAsync
)
{
return
await
executor
.
ExecuteAsync
(
@class
,
parameter
);
}
return
executor
.
Execute
(
@class
,
parameter
);
}
}
// 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.Linq
;
using
System.Threading
;
using
System.Threading.Tasks
;
using
DotNetCore.CAP.Messages
;
using
Microsoft.Extensions.DependencyInjection
;
using
Microsoft.Extensions.Internal
;
using
Microsoft.Extensions.Logging
;
namespace
DotNetCore.CAP.Internal
{
internal
class
Default
SubscribeInvoker
:
ISubscribeInvoker
{
private
readonly
ILogger
_logger
;
private
readonly
IServiceProvider
_serviceProvider
;
public
Default
SubscribeInvoker
(
ILoggerFactory
loggerFactory
,
IServiceProvider
serviceProvider
)
{
_serviceProvider
=
serviceProvider
;
_logger
=
loggerFactory
.
CreateLogger
<
Default
SubscribeInvoker
>();
}
public
async
Task
<
ConsumerExecutedResult
>
InvokeAsync
(
ConsumerContext
context
,
CancellationToken
cancellationToken
=
default
)
{
cancellationToken
.
ThrowIfCancellationRequested
();
_logger
.
LogDebug
(
"Executing subscriber method : {0}"
,
context
.
ConsumerDescriptor
.
MethodInfo
.
Name
);
var
executor
=
ObjectMethodExecutor
.
Create
(
context
.
ConsumerDescriptor
.
MethodInfo
,
context
.
ConsumerDescriptor
.
ImplTypeInfo
);
using
(
var
scope
=
_serviceProvider
.
CreateScope
())
{
var
provider
=
scope
.
ServiceProvider
;
var
srvType
=
context
.
ConsumerDescriptor
.
ServiceTypeInfo
?.
AsType
();
var
implType
=
context
.
ConsumerDescriptor
.
ImplTypeInfo
.
AsType
();
object
obj
=
null
;
if
(
srvType
!=
null
)
{
obj
=
provider
.
GetServices
(
srvType
).
FirstOrDefault
(
o
=>
o
.
GetType
()
==
implType
);
}
if
(
obj
==
null
)
{
obj
=
ActivatorUtilities
.
GetServiceOrCreateInstance
(
provider
,
implType
);
}
var
message
=
context
.
DeliverMessage
;
var
parameterDescriptors
=
context
.
ConsumerDescriptor
.
Parameters
;
var
executeParameters
=
new
object
[
parameterDescriptors
.
Count
];
for
(
var
i
=
0
;
i
<
parameterDescriptors
.
Count
;
i
++)
{
if
(
parameterDescriptors
[
i
].
IsFromCap
)
{
executeParameters
[
i
]
=
new
CapHeader
(
message
.
Headers
);
}
else
{
executeParameters
[
i
]
=
message
.
Value
;
}
}
var
resultObj
=
await
ExecuteWithParameterAsync
(
executor
,
obj
,
executeParameters
);
return
new
ConsumerExecutedResult
(
resultObj
,
message
.
GetId
(),
message
.
GetCallbackName
());
}
}
private
async
Task
<
object
>
ExecuteWithParameterAsync
(
ObjectMethodExecutor
executor
,
object
@class
,
object
[]
parameter
)
{
if
(
executor
.
IsMethodAsync
)
{
return
await
executor
.
ExecuteAsync
(
@class
,
parameter
);
}
return
executor
.
Execute
(
@class
,
parameter
);
}
}
}
\ No newline at end of file
src/DotNetCore.CAP/Internal/I
Consumer
Invoker.cs
→
src/DotNetCore.CAP/Internal/I
Subscribe
Invoker.cs
View file @
5d7c7796
...
...
@@ -9,10 +9,10 @@ namespace DotNetCore.CAP.Internal
/// <summary>
/// Perform user definition method of consumers.
/// </summary>
internal
interface
I
Consumer
Invoker
internal
interface
I
Subscribe
Invoker
{
/// <summary>
/// Invoke
consumer method whit
consumer context.
/// Invoke
subscribe method with the
consumer context.
/// </summary>
/// <param name="context">consumer execute context</param>
/// <param name="cancellationToken">The object of <see cref="CancellationToken"/>.</param>
...
...
src/DotNetCore.CAP/Internal/I
Consumer
InvokerFactory.cs
→
src/DotNetCore.CAP/Internal/I
Subscribe
InvokerFactory.cs
View file @
5d7c7796
...
...
@@ -3,8 +3,8 @@
namespace
DotNetCore.CAP.Internal
{
internal
interface
I
Consumer
InvokerFactory
internal
interface
I
Subscribe
InvokerFactory
{
I
Consumer
Invoker
CreateInvoker
();
I
Subscribe
Invoker
CreateInvoker
();
}
}
\ No newline at end of file
src/DotNetCore.CAP/Processor/IDispatcher.Default.cs
View file @
5d7c7796
...
...
@@ -16,7 +16,7 @@ namespace DotNetCore.CAP.Processor
{
private
readonly
CancellationTokenSource
_cts
=
new
CancellationTokenSource
();
private
readonly
IMessageSender
_sender
;
private
readonly
ISubscribe
rExecuto
r
_executor
;
private
readonly
ISubscribe
Dispatche
r
_executor
;
private
readonly
ILogger
<
Dispatcher
>
_logger
;
private
readonly
BlockingCollection
<
MediumMessage
>
_publishedMessageQueue
=
...
...
@@ -27,7 +27,7 @@ namespace DotNetCore.CAP.Processor
public
Dispatcher
(
ILogger
<
Dispatcher
>
logger
,
IMessageSender
sender
,
ISubscribe
rExecuto
r
executor
)
ISubscribe
Dispatche
r
executor
)
{
_logger
=
logger
;
_sender
=
sender
;
...
...
@@ -90,7 +90,7 @@ namespace DotNetCore.CAP.Processor
{
foreach
(
var
message
in
_receivedMessageQueue
.
GetConsumingEnumerable
(
_cts
.
Token
))
{
_executor
.
Execute
Async
(
message
.
Item1
,
message
.
Item2
,
_cts
.
Token
);
_executor
.
Dispatch
Async
(
message
.
Item1
,
message
.
Item2
,
_cts
.
Token
);
}
}
catch
(
OperationCanceledException
)
...
...
src/DotNetCore.CAP/Processor/IProcessor.NeedRetry.cs
View file @
5d7c7796
...
...
@@ -18,17 +18,17 @@ namespace DotNetCore.CAP.Processor
private
readonly
TimeSpan
_delay
=
TimeSpan
.
FromSeconds
(
1
);
private
readonly
ILogger
<
MessageNeedToRetryProcessor
>
_logger
;
private
readonly
IMessageSender
_messageSender
;
private
readonly
ISubscribe
rExecutor
_subscriberExecuto
r
;
private
readonly
ISubscribe
Dispatcher
_subscribeDispatche
r
;
private
readonly
TimeSpan
_waitingInterval
;
public
MessageNeedToRetryProcessor
(
IOptions
<
CapOptions
>
options
,
ILogger
<
MessageNeedToRetryProcessor
>
logger
,
ISubscribe
rExecutor
subscriberExecuto
r
,
ISubscribe
Dispatcher
subscribeDispatche
r
,
IMessageSender
messageSender
)
{
_logger
=
logger
;
_subscribe
rExecutor
=
subscriberExecuto
r
;
_subscribe
Dispatcher
=
subscribeDispatche
r
;
_messageSender
=
messageSender
;
_waitingInterval
=
TimeSpan
.
FromSeconds
(
options
.
Value
.
FailedRetryInterval
);
}
...
...
@@ -69,7 +69,7 @@ namespace DotNetCore.CAP.Processor
foreach
(
var
message
in
messages
)
{
await
_subscribe
rExecutor
.
Execute
Async
(
message
);
await
_subscribe
Dispatcher
.
Dispatch
Async
(
message
);
await
context
.
WaitAsync
(
_delay
);
}
...
...
test/DotNetCore.CAP.Test/ConsumerInvokerTest.cs
View file @
5d7c7796
...
...
@@ -17,12 +17,11 @@ namespace DotNetCore.CAP.Test
{
var
serviceCollection
=
new
ServiceCollection
();
serviceCollection
.
AddLogging
();
serviceCollection
.
AddSingleton
<
IConsumerInvoker
,
DefaultConsumerInvoker
>();
serviceCollection
.
AddTransient
<
FakeSubscriber
>();
serviceCollection
.
AddSingleton
<
ISubscribeInvoker
,
DefaultSubscribeInvoker
>();
_serviceProvider
=
serviceCollection
.
BuildServiceProvider
();
}
private
I
ConsumerInvoker
ConsumerInvoker
=>
_serviceProvider
.
GetService
<
IConsumer
Invoker
>();
private
I
SubscribeInvoker
SubscribeInvoker
=>
_serviceProvider
.
GetService
<
ISubscribe
Invoker
>();
[
Fact
]
public
async
Task
InvokeTest
()
...
...
@@ -40,7 +39,7 @@ namespace DotNetCore.CAP.Test
var
message
=
new
Message
(
header
,
null
);
var
context
=
new
ConsumerContext
(
descriptor
,
message
);
var
ret
=
await
Consumer
Invoker
.
InvokeAsync
(
context
);
var
ret
=
await
Subscribe
Invoker
.
InvokeAsync
(
context
);
Assert
.
Equal
(
int
.
MaxValue
,
ret
.
Result
);
}
}
...
...
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