-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #106 from ImperialCollegeLondon/messages-in-user-s…
…ession Store Kafka messages in user session
- Loading branch information
Showing
8 changed files
with
105 additions
and
65 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
"""Django management module.""" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
"""Django management command to populate Kafka messages into application database.""" | ||
|
||
from argparse import ArgumentParser | ||
from typing import Any | ||
|
||
from django.conf import settings | ||
from django.contrib.sessions.backends.db import SessionStore | ||
from django.contrib.sessions.models import Session | ||
from django.core.management.base import BaseCommand | ||
from django.db import transaction | ||
from druncschema.broadcast_pb2 import BroadcastMessage | ||
from kafka import KafkaConsumer | ||
|
||
|
||
class Command(BaseCommand): | ||
"""Consumes messages from Kafka and stores them in active user sessions.""" | ||
|
||
help = __doc__ | ||
|
||
def add_arguments(self, parser: ArgumentParser) -> None: | ||
"""Add commandline options.""" | ||
parser.add_argument("--debug", action="store_true") | ||
|
||
def handle(self, debug: bool = False, **kwargs: Any) -> None: # type: ignore[misc] | ||
"""Command business logic.""" | ||
consumer = KafkaConsumer(bootstrap_servers=[settings.KAFKA_ADDRESS]) | ||
consumer.subscribe(pattern="control.*.process_manager") | ||
# TODO: determine why the below doesn't work | ||
# consumer.subscribe(pattern="control.no_session.process_manager") | ||
|
||
self.stdout.write("Listening for messages from Kafka.") | ||
while True: | ||
for messages in consumer.poll(timeout_ms=500).values(): | ||
message_bodies = [] | ||
for message in messages: | ||
if debug: | ||
self.stdout.write(f"Message received: {message}") | ||
self.stdout.flush() | ||
bm = BroadcastMessage() | ||
bm.ParseFromString(message.value) | ||
message_bodies.append(bm.data.value.decode("utf-8")) | ||
|
||
if message_bodies: | ||
with transaction.atomic(): | ||
# atomic here to prevent race condition with messages being | ||
# popped by the web application | ||
sessions = Session.objects.all() | ||
for session in sessions: | ||
store = SessionStore(session_key=session.session_key) | ||
store.setdefault("messages", []).extend(message_bodies) | ||
store.save() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters