Skip to content

Commit 6ab91e4

Browse files
committed
Have ShardingAdapter recursively call the underlying IMessageExtractor
close akkadotnet#7470
1 parent a1c0042 commit 6ab91e4

File tree

2 files changed

+42
-48
lines changed

2 files changed

+42
-48
lines changed

src/contrib/cluster/Akka.Cluster.Sharding.Tests/AutomaticallyHandledExtractorMessagesSpec.cs

+41-47
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,28 @@ namespace Akka.Cluster.Sharding.Tests;
1313

1414
public class AutomaticallyHandledExtractorMessagesSpec
1515
{
16+
public sealed record MyWrappedMessage(string EntityId, string Message);
17+
1618
// custom IMessageExtractor
1719
public class MyMessageExtractor : IMessageExtractor
1820
{
1921
public string? EntityId(object message) => message switch
2022
{
2123
string s => s,
24+
MyWrappedMessage wrapped => wrapped.EntityId,
2225
_ => null
2326
};
2427

25-
public object? EntityMessage(object message) => message;
28+
public object? EntityMessage(object message)
29+
{
30+
switch (message)
31+
{
32+
case MyWrappedMessage wrapped:
33+
return wrapped.Message;
34+
default:
35+
return message;
36+
}
37+
}
2638

2739
public string? ShardId(object message) => message switch
2840
{
@@ -35,65 +47,47 @@ public string ShardId(string entityId, object? messageHint = null)
3547
return entityId;
3648
}
3749
}
38-
39-
#pragma warning disable CS0618 // Type or member is obsolete
40-
private ExtractEntityId ExtractEntityId = message =>
41-
{
42-
if (message is string s)
43-
return (s, s);
44-
return Option<(string, object)>.None;
45-
};
4650

47-
private ExtractShardId ExtractShardId = message =>
48-
{
49-
if (message is string s)
50-
return s;
51-
return null!;
52-
};
53-
#pragma warning restore CS0618 // Type or member is obsolete
51+
public static readonly TheoryData<(object shardingInput, object realMsg, string entityId, string shardId)>
52+
Messages = new()
53+
{
54+
// (new ShardRegion.StartEntity("foo"), new ShardRegion.StartEntity("foo"), "foo", "foo"),
55+
(new ShardingEnvelope("bar", "baz"), "baz", "bar", "bar"), ("bar", "bar", "bar", "bar"),
56+
};
5457

55-
public static readonly TheoryData<(object shardingInput, object realMsg, string entityId, string shardId)> Messages = new()
56-
{
57-
// (new ShardRegion.StartEntity("foo"), new ShardRegion.StartEntity("foo"), "foo", "foo"),
58-
(new ShardingEnvelope("bar", "baz"), "baz", "bar", "bar"),
59-
("bar", "bar", "bar", "bar"),
60-
};
61-
6258
[Theory]
6359
[MemberData(nameof(Messages))]
64-
public void ShouldAutomaticallyHandleMessagesInCustomIMessageExtractor((object shardingInput, object realMsg, string entityId, string shardId) data)
60+
public void ShouldAutomaticallyHandleMessagesInCustomIMessageExtractor(
61+
(object shardingInput, object realMsg, string entityId, string shardId) data)
6562
{
6663
// arrange
6764
var extractor = new ExtractorAdapter(new MyMessageExtractor());
68-
65+
6966
// act
7067
var entityId = extractor.EntityId(data.shardingInput);
7168
var entityMessage = extractor.EntityMessage(data.shardingInput);
7269
var shardId = extractor.ShardId(entityId!, data.shardingInput);
73-
70+
7471
// assert
7572
entityId.Should().Be(data.entityId);
7673
entityMessage.Should().Be(data.realMsg);
7774
shardId.Should().Be(data.shardId);
7875
}
79-
80-
// NOTE: so the old delegates are hopeless and will simply not work - you HAVE to handle the messages yourself there
81-
// need to repeat of the previous test but using the deprecated delegate methods and the adapter
82-
// [Theory]
83-
// [MemberData(nameof(Messages))]
84-
// public void ShouldAutomaticallyHandleMessagesInCustomIMessageExtractorUsingDelegates((object shardingInput, object realMsg, string entityId, string shardId) data)
85-
// {
86-
// // arrange
87-
// var extractor = new ExtractorAdapter(new DeprecatedHandlerExtractorAdapter(ExtractEntityId, ExtractShardId));
88-
//
89-
// // act
90-
// var entityId = extractor.EntityId(data.shardingInput);
91-
// var entityMessage = extractor.EntityMessage(data.shardingInput);
92-
// var shardId = extractor.ShardId(entityId!, data.shardingInput);
93-
//
94-
// // assert
95-
// entityId.Should().Be(data.entityId);
96-
// entityMessage.Should().Be(data.realMsg);
97-
// shardId.Should().Be(data.shardId);
98-
// }
99-
}
76+
77+
[Fact]
78+
public void ShouldUnwrapMessageInsideShardingEnvelope()
79+
{
80+
// arrange
81+
var extractor = new ExtractorAdapter(new MyMessageExtractor());
82+
var myMessage = new MyWrappedMessage("entity1", "hello");
83+
var envelope = new ShardingEnvelope("entity1", myMessage);
84+
85+
// act
86+
var entityId = extractor.EntityId(envelope);
87+
var entityMessage = extractor.EntityMessage(envelope);
88+
89+
// assert
90+
entityId.Should().Be("entity1");
91+
entityMessage.Should().Be("hello");
92+
}
93+
}

src/contrib/cluster/Akka.Cluster.Sharding/ClusterSharding.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public ExtractorAdapter(IMessageExtractor underlying)
7676
{
7777
return message switch
7878
{
79-
ShardingEnvelope se => se.Message,
79+
ShardingEnvelope se => _underlying.EntityMessage(se.Message),
8080
_ => _underlying.EntityMessage(message)
8181
};
8282
}

0 commit comments

Comments
 (0)