Skip to content

Commit 05437e3

Browse files
authored
Merge pull request #258 from scalecube/develop
New release
2 parents 46c9cc6 + 5a0f397 commit 05437e3

File tree

12 files changed

+181
-118
lines changed

12 files changed

+181
-118
lines changed

cluster-api/src/main/java/io/scalecube/cluster/ClusterConfig.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public final class ClusterConfig implements Cloneable {
3535
private MetadataEncoder metadataEncoder = MetadataEncoder.INSTANCE;
3636
private MetadataDecoder metadataDecoder = MetadataDecoder.INSTANCE;
3737

38-
private String memberId;
38+
private String memberAlias;
3939
private String memberHost;
4040
private Integer memberPort;
4141

@@ -168,19 +168,19 @@ public ClusterConfig memberHost(String memberHost) {
168168
return c;
169169
}
170170

171-
public String memberId() {
172-
return memberId;
171+
public String memberAlias() {
172+
return memberAlias;
173173
}
174174

175175
/**
176-
* Sets a memberId.
176+
* Sets a memberAlias.
177177
*
178-
* @param memberId member id
178+
* @param memberAlias member alias
179179
* @return new {@code ClusterConfig} instance
180180
*/
181-
public ClusterConfig memberId(String memberId) {
181+
public ClusterConfig memberAlias(String memberAlias) {
182182
ClusterConfig c = clone();
183-
c.memberId = memberId;
183+
c.memberAlias = memberAlias;
184184
return c;
185185
}
186186

@@ -285,7 +285,7 @@ public String toString() {
285285
.add("metadataTimeout=" + metadataTimeout)
286286
.add("metadataEncoder=" + metadataEncoder)
287287
.add("metadataDecoder=" + metadataDecoder)
288-
.add("memberId='" + memberId + "'")
288+
.add("memberAlias='" + memberAlias + "'")
289289
.add("memberHost='" + memberHost + "'")
290290
.add("memberPort=" + memberPort)
291291
.add("transportConfig=" + transportConfig)

cluster-api/src/main/java/io/scalecube/cluster/Member.java

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,41 +11,38 @@
1111
public final class Member {
1212

1313
private String id;
14+
private String alias;
1415
private Address address;
1516

1617
/** Instantiates empty member for deserialization purpose. */
1718
Member() {}
1819

1920
/**
20-
* Create instance of cluster member by given address; member id will be generated by {@link
21-
* #generateId()}.
22-
*
23-
* @param address address on which given member listens for incoming messages
24-
*/
25-
public Member(Address address) {
26-
this(generateId(), address);
27-
}
28-
29-
/**
30-
* Create instance of cluster member with given parameters.
21+
* Constructor.
3122
*
3223
* @param id member id
33-
* @param address address on which given member listens for incoming messages
24+
* @param alias member alias (optional)
25+
* @param address member address
3426
*/
35-
public Member(String id, Address address) {
36-
this.id = Objects.requireNonNull(id);
37-
this.address = Objects.requireNonNull(address);
27+
public Member(String id, String alias, Address address) {
28+
this.id = Objects.requireNonNull(id, "member id");
29+
this.alias = alias; // optional
30+
this.address = Objects.requireNonNull(address, "member address");
3831
}
3932

4033
public String id() {
4134
return id;
4235
}
4336

37+
public String alias() {
38+
return alias;
39+
}
40+
4441
public Address address() {
4542
return address;
4643
}
4744

48-
private static String generateId() {
45+
public static String generateId() {
4946
return Long.toHexString(UUID.randomUUID().getMostSignificantBits() & Long.MAX_VALUE);
5047
}
5148

@@ -68,6 +65,10 @@ public int hashCode() {
6865

6966
@Override
7067
public String toString() {
71-
return id + ":" + address.port();
68+
if (alias == null) {
69+
return id + "@" + address;
70+
} else {
71+
return alias + "/" + id + "@" + address;
72+
}
7273
}
7374
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package io.scalecube.cluster;
2+
3+
import java.lang.management.ManagementFactory;
4+
import javax.management.MBeanServer;
5+
import javax.management.ObjectInstance;
6+
import javax.management.ObjectName;
7+
import javax.management.StandardMBean;
8+
9+
public abstract class AbstractMonitorMBean {
10+
11+
/**
12+
* Registers monitor mbean.
13+
*
14+
* @param other monitor mbean instance
15+
* @return object instance
16+
* @throws Exception in case of error
17+
*/
18+
public static ObjectInstance register(AbstractMonitorMBean other) throws Exception {
19+
Object bean = other.getBeanType().cast(other);
20+
//noinspection unchecked
21+
StandardMBean standardMBean = new StandardMBean(bean, other.getBeanType());
22+
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
23+
ObjectName objectName = new ObjectName(other.getObjectName());
24+
return server.registerMBean(standardMBean, objectName);
25+
}
26+
27+
/**
28+
* Returns bean type.
29+
*
30+
* @return bean type
31+
*/
32+
protected abstract Class getBeanType();
33+
34+
/**
35+
* Returns jmx object name.
36+
*
37+
* @return object name
38+
*/
39+
protected abstract String getObjectName();
40+
}

cluster/src/main/java/io/scalecube/cluster/ClusterImpl.java

Lines changed: 52 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import io.scalecube.cluster.transport.api.TransportConfig;
1515
import io.scalecube.net.Address;
1616
import io.scalecube.transport.netty.TransportImpl;
17-
import java.lang.management.ManagementFactory;
1817
import java.util.Collection;
1918
import java.util.Collections;
2019
import java.util.Objects;
@@ -24,9 +23,6 @@
2423
import java.util.function.UnaryOperator;
2524
import java.util.stream.Collectors;
2625
import java.util.stream.Stream;
27-
import javax.management.MBeanServer;
28-
import javax.management.ObjectName;
29-
import javax.management.StandardMBean;
3026
import org.slf4j.Logger;
3127
import org.slf4j.LoggerFactory;
3228
import reactor.core.Disposable;
@@ -277,7 +273,7 @@ private Mono<Cluster> doStart0() {
277273
.then(Mono.fromRunnable(() -> metadataStore.start()))
278274
.then(Mono.fromRunnable(this::startHandler))
279275
.then((membership.start()))
280-
.then(Mono.fromCallable(() -> JmxMonitorMBean.start(this)));
276+
.then(startJmxMonitor());
281277
})
282278
.thenReturn(this);
283279
}
@@ -304,6 +300,10 @@ private void startHandler() {
304300
actionsDisposables.add(listenGossip().subscribe(handler::onGossip, this::onError));
305301
}
306302

303+
private Mono<Void> startJmxMonitor() {
304+
return Mono.fromCallable(() -> AbstractMonitorMBean.register(new JmxMonitorMBean(this))).then();
305+
}
306+
307307
private void onError(Throwable th) {
308308
LOGGER.error("Received unexpected error: ", th);
309309
}
@@ -340,11 +340,7 @@ private Member createLocalMember(int listenPort) {
340340
.map(memberHost -> Address.create(memberHost, port))
341341
.orElseGet(() -> Address.create(localAddress, listenPort));
342342

343-
if (config.memberId() != null) {
344-
return new Member(config.memberId(), memberAddress);
345-
} else {
346-
return new Member(memberAddress);
347-
}
343+
return new Member(Member.generateId(), config.memberAlias(), memberAddress);
348344
}
349345

350346
@Override
@@ -485,54 +481,82 @@ public boolean isShutdown() {
485481
return onShutdown.isDisposed();
486482
}
487483

484+
@SuppressWarnings("unused")
488485
public interface MonitorMBean {
489486

490-
Collection<String> getMemberId();
487+
Collection<String> getId();
488+
489+
String getIdAsString();
490+
491+
Collection<String> getAlias();
492+
493+
String getAliasAsString();
491494

492-
String getMemberIdAsString();
495+
Collection<String> getAddress();
496+
497+
String getAddressAsString();
493498

494499
Collection<String> getMetadata();
495500

496501
String getMetadataAsString();
497502
}
498503

499-
public static class JmxMonitorMBean implements MonitorMBean {
504+
public static class JmxMonitorMBean extends AbstractMonitorMBean implements MonitorMBean {
500505

501506
private final ClusterImpl cluster;
502507

503508
private JmxMonitorMBean(ClusterImpl cluster) {
504509
this.cluster = cluster;
505510
}
506511

507-
private static JmxMonitorMBean start(ClusterImpl cluster) throws Exception {
508-
JmxMonitorMBean monitorMBean = new JmxMonitorMBean(cluster);
509-
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
510-
StandardMBean standardMBean = new StandardMBean(monitorMBean, MonitorMBean.class);
511-
ObjectName objectName =
512-
new ObjectName("io.scalecube.cluster:name=Cluster@" + cluster.member().id());
513-
server.registerMBean(standardMBean, objectName);
514-
return monitorMBean;
512+
@Override
513+
public Collection<String> getId() {
514+
return Collections.singleton(getIdAsString());
515+
}
516+
517+
@Override
518+
public String getIdAsString() {
519+
return cluster.member().id();
515520
}
516521

517522
@Override
518-
public Collection<String> getMemberId() {
519-
return Collections.singleton(cluster.member().id());
523+
public Collection<String> getAlias() {
524+
return Collections.singleton(getAliasAsString());
520525
}
521526

522527
@Override
523-
public String getMemberIdAsString() {
524-
return getMemberId().iterator().next();
528+
public String getAliasAsString() {
529+
return cluster.member().alias();
530+
}
531+
532+
@Override
533+
public Collection<String> getAddress() {
534+
return Collections.singleton(getAddressAsString());
535+
}
536+
537+
@Override
538+
public String getAddressAsString() {
539+
return String.valueOf(cluster.member().address());
525540
}
526541

527542
@Override
528543
public Collection<String> getMetadata() {
529-
return Collections.singletonList(
530-
String.valueOf(cluster.metadataStore.metadata().map(Object::toString).orElse(null)));
544+
return Collections.singletonList(getMetadataAsString());
531545
}
532546

533547
@Override
534548
public String getMetadataAsString() {
535-
return getMetadata().iterator().next();
549+
return String.valueOf(cluster.metadataStore.metadata().map(Object::toString).orElse(null));
550+
}
551+
552+
@Override
553+
protected Class getBeanType() {
554+
return MonitorMBean.class;
555+
}
556+
557+
@Override
558+
protected String getObjectName() {
559+
return "io.scalecube.cluster:name=Cluster@" + cluster.member().id();
536560
}
537561
}
538562

0 commit comments

Comments
 (0)