Skip to content

Commit de3d3d6

Browse files
authored
Merge pull request #330 from AxonFramework/bug/327-instance-without-command-handlers
[#327] Default local `ServiceInstance` to a fixed `URI` i.o. `null`
2 parents d5ae1db + fcbf525 commit de3d3d6

File tree

2 files changed

+29
-9
lines changed

2 files changed

+29
-9
lines changed

springcloud/src/main/java/org/axonframework/extensions/springcloud/commandhandling/mode/AbstractCapabilityDiscoveryMode.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@
1818

1919
import org.axonframework.commandhandling.distributed.CommandMessageFilter;
2020
import org.axonframework.common.AxonConfigurationException;
21+
import org.springframework.cloud.client.DefaultServiceInstance;
2122
import org.springframework.cloud.client.ServiceInstance;
2223

24+
import java.net.URI;
2325
import java.util.concurrent.atomic.AtomicReference;
2426

2527
/**
@@ -42,7 +44,7 @@ public abstract class AbstractCapabilityDiscoveryMode<B extends CapabilityDiscov
4244
*/
4345
protected AbstractCapabilityDiscoveryMode(Builder<B> builder) {
4446
builder.validate();
45-
localInstance = new AtomicReference<>();
47+
localInstance = new AtomicReference<>(FixedURIServiceInstance.INSTANCE);
4648
localCapabilities = new AtomicReference<>(DefaultMemberCapabilities.INCAPABLE_MEMBER);
4749
}
4850

@@ -76,4 +78,23 @@ protected abstract static class Builder<B extends CapabilityDiscoveryMode> {
7678
*/
7779
protected abstract void validate();
7880
}
81+
82+
/**
83+
* This no-op version of the {@link DefaultServiceInstance} enforces the {@link ServiceInstance#getUri()} to a fixed
84+
* empty {@link URI}. Through this, there's always a {@code ServiceInstance} present that will never match others.
85+
* <p>
86+
* This no-op version is the default local {@code ServiceInstance}, ensuring that when
87+
* {@link #updateLocalCapabilities(ServiceInstance, int, CommandMessageFilter)} is never invoked (when an instance
88+
* has zero command handlers) it will still play nicely in the discovery mechanism.
89+
*/
90+
private static class FixedURIServiceInstance extends DefaultServiceInstance {
91+
92+
private static final ServiceInstance INSTANCE = new FixedURIServiceInstance();
93+
private static final URI FIXED_URI = URI.create("");
94+
95+
@Override
96+
public URI getUri() {
97+
return FIXED_URI;
98+
}
99+
}
79100
}

springcloud/src/test/java/org/axonframework/extensions/springcloud/commandhandling/mode/RestCapabilityDiscoveryModeTest.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ void setUp() {
6666
}
6767

6868
@Test
69-
void testGetLocalMemberCapabilitiesReturnsIncapableMemberIfLocalCapabilitiesIsNeverUpdated() {
69+
void getLocalMemberCapabilitiesReturnsIncapableMemberIfLocalCapabilitiesIsNeverUpdated() {
7070
SerializedMemberCapabilities result = ((RestCapabilityDiscoveryMode) testSubject).getLocalMemberCapabilities();
7171

7272
DefaultMemberCapabilities deserializableResult =
@@ -76,7 +76,7 @@ void testGetLocalMemberCapabilitiesReturnsIncapableMemberIfLocalCapabilitiesIsNe
7676
}
7777

7878
@Test
79-
void testGetLocalMemberCapabilitiesReturnsUpdatedLocalCapabilities() {
79+
void getLocalMemberCapabilitiesReturnsUpdatedLocalCapabilities() {
8080
testSubject.updateLocalCapabilities(localInstance, LOAD_FACTOR, COMMAND_MESSAGE_FILTER);
8181

8282
SerializedMemberCapabilities result = ((RestCapabilityDiscoveryMode) testSubject).getLocalMemberCapabilities();
@@ -88,7 +88,7 @@ void testGetLocalMemberCapabilitiesReturnsUpdatedLocalCapabilities() {
8888
}
8989

9090
@Test
91-
void testCapabilitiesReturnsLocalCapabilitiesIfLocalServiceInstanceIsUsed() {
91+
void capabilitiesReturnsLocalCapabilitiesIfLocalServiceInstanceIsUsed() {
9292
testSubject.updateLocalCapabilities(localInstance, LOAD_FACTOR, COMMAND_MESSAGE_FILTER);
9393

9494
Optional<MemberCapabilities> resultCapabilities = testSubject.capabilities(localInstance);
@@ -101,7 +101,7 @@ void testCapabilitiesReturnsLocalCapabilitiesIfLocalServiceInstanceIsUsed() {
101101
}
102102

103103
@Test
104-
void testCapabilitiesReturnsLocalCapabilitiesIfServiceInstanceUriMatches() {
104+
void capabilitiesReturnsLocalCapabilitiesIfServiceInstanceUriMatches() {
105105
URI testURI = URI.create("http://remote");
106106
when(localInstance.getUri()).thenReturn(testURI);
107107

@@ -120,9 +120,8 @@ void testCapabilitiesReturnsLocalCapabilitiesIfServiceInstanceUriMatches() {
120120
}
121121

122122
@Test
123-
void testCapabilitiesGetsCapabilitiesThroughRestTemplate() {
123+
void capabilitiesGetsCapabilitiesThroughRestTemplate() {
124124
MemberCapabilities expectedCapabilities = new DefaultMemberCapabilities(LOAD_FACTOR, COMMAND_MESSAGE_FILTER);
125-
testSubject.updateLocalCapabilities(localInstance, LOAD_FACTOR, COMMAND_MESSAGE_FILTER);
126125

127126
URI testURI = URI.create("http://remote");
128127
ServiceInstance testServiceInstance = mock(ServiceInstance.class);
@@ -158,7 +157,7 @@ void testCapabilitiesGetsCapabilitiesThroughRestTemplate() {
158157
}
159158

160159
@Test
161-
void testCapabilitiesRethrowsHttpClientErrorExceptionAsServiceInstanceClientException() {
160+
void capabilitiesRethrowsHttpClientErrorExceptionAsServiceInstanceClientException() {
162161
testSubject.updateLocalCapabilities(localInstance, LOAD_FACTOR, COMMAND_MESSAGE_FILTER);
163162

164163
when(restTemplate.exchange(
@@ -182,7 +181,7 @@ void testCapabilitiesRethrowsHttpClientErrorExceptionAsServiceInstanceClientExce
182181
}
183182

184183
@Test
185-
void testCapabilitiesReturnsIncapableMemberWhenNonHttpClientErrorExceptionIsThrown() {
184+
void capabilitiesReturnsIncapableMemberWhenNonHttpClientErrorExceptionIsThrown() {
186185
testSubject.updateLocalCapabilities(localInstance, LOAD_FACTOR, COMMAND_MESSAGE_FILTER);
187186

188187
when(restTemplate.exchange(

0 commit comments

Comments
 (0)