summaryrefslogtreecommitdiffstats
path: root/src/main/java/derms/net/rmulticast/Announce.java
diff options
context:
space:
mode:
authorSam Anthony <sam@samanthony.xyz>2024-11-15 17:03:21 -0500
committerSam Anthony <sam@samanthony.xyz>2024-11-15 17:03:21 -0500
commit050942608e70d01e5833fe5d0e5019071f95c68b (patch)
tree0e4c285c4290def09877a9e5378861a03d0ee088 /src/main/java/derms/net/rmulticast/Announce.java
parent5a7cc1873ade99634726042d97a9d91d382867ad (diff)
downloadsoen423-050942608e70d01e5833fe5d0e5019071f95c68b.zip
reliable multicast: announce presence to group
Diffstat (limited to 'src/main/java/derms/net/rmulticast/Announce.java')
-rw-r--r--src/main/java/derms/net/rmulticast/Announce.java47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/main/java/derms/net/rmulticast/Announce.java b/src/main/java/derms/net/rmulticast/Announce.java
new file mode 100644
index 0000000..08d817d
--- /dev/null
+++ b/src/main/java/derms/net/rmulticast/Announce.java
@@ -0,0 +1,47 @@
+package derms.net.rmulticast;
+
+import derms.net.ConcurrentMulticastSocket;
+import derms.net.Packet;
+
+import java.io.IOException;
+import java.net.DatagramPacket;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.time.Duration;
+import java.util.logging.Logger;
+
+/**
+ * Periodically announce the presence of the local process to the group.
+ * Allows processes to populate their set of group members, even if not
+ * all members would normally send messages to the group.
+ */
+class Announce implements Runnable {
+ private static final Duration period = Duration.ofSeconds(30);
+
+ private final DatagramPacket pkt;
+ private final ConcurrentMulticastSocket outSock;
+ private final Logger log;
+
+ Announce(InetSocketAddress group, InetAddress laddr, ConcurrentMulticastSocket outSock) throws IOException {
+ AnnounceMessage msg = new AnnounceMessage(laddr);
+ this.pkt = Packet.encode(msg, group);
+ this.outSock = outSock;
+ this.log = Logger.getLogger(this.getClass().getName());
+ }
+
+ @Override
+ public void run() {
+ try {
+ for (;;) {
+ try {
+ Wait.forDuration(period);
+ outSock.send(pkt);
+ } catch (IOException e) {
+ log.warning(e.getMessage());
+ }
+ }
+ } catch (InterruptedException e) {
+ log.info("Announce thread interrupted: " + e.getMessage());
+ }
+ }
+}