List/Hash data structure in Redis for messages; add jobId in annotations format

This commit is contained in:
Daniel Petri Rocha 2022-02-01 17:24:57 +01:00
parent 3c2aa14907
commit e5dec08ab9
6 changed files with 38 additions and 10 deletions

View File

@ -27,6 +27,10 @@ class StorePresentationAnnotationsRecordEvent extends AbstractPresentationWithAn
setEvent("StorePresentationAnnotationsRecordEvent") setEvent("StorePresentationAnnotationsRecordEvent")
def setJobId(jobId: String) {
eventMap.put(JOB_ID, jobId)
}
def setPresId(presId: String) { def setPresId(presId: String) {
eventMap.put(PRES_ID, presId) eventMap.put(PRES_ID, presId)
} }
@ -37,6 +41,7 @@ class StorePresentationAnnotationsRecordEvent extends AbstractPresentationWithAn
} }
object StorePresentationAnnotationsRecordEvent { object StorePresentationAnnotationsRecordEvent {
protected final val JOB_ID = "jobId"
protected final val PRES_ID = "presId" protected final val PRES_ID = "presId"
protected final val PAGES = "pages" protected final val PAGES = "pages"
} }

View File

@ -778,12 +778,13 @@ class MeetingActor(
resultingPage += 1 resultingPage += 1
} }
val jobId = RandomStringGenerator.randomAlphanumericString(16)
// 1) Send Annotations to Redis // 1) Send Annotations to Redis
var annotations = new StoredAnnotations(presId, storeAnnotationPages) var annotations = new StoredAnnotations(jobId, presId, storeAnnotationPages)
outGW.send(buildStoreAnnotationsInRedisSysMsg(annotations)) outGW.send(buildStoreAnnotationsInRedisSysMsg(annotations))
// 2) Insert Export Job in Redis // 2) Insert Export Job in Redis
val jobId = RandomStringGenerator.randomAlphanumericString(16)
val jobType = "PresentationWithAnnotationDownloadJob" val jobType = "PresentationWithAnnotationDownloadJob"
val presLocation = s"/var/bigbluebutton/${presId}" val presLocation = s"/var/bigbluebutton/${presId}"
val exportJob = new ExportJob(jobId, jobType, presId, presLocation, allPages, storeAnnotationPages, "", "") val exportJob = new ExportJob(jobId, jobType, presId, presLocation, allPages, storeAnnotationPages, "", "")
@ -823,16 +824,16 @@ class MeetingActor(
} }
val presentationUploadToken: String = PresentationPodsApp.generateToken("DEFAULT_PRESENTATION_POD", userId) val presentationUploadToken: String = PresentationPodsApp.generateToken("DEFAULT_PRESENTATION_POD", userId)
val jobId = RandomStringGenerator.randomAlphanumericString(16)
// Informs bbb-web about the token so that when we use it to upload the presentation, it is able to look it up in the list of tokens // Informs bbb-web about the token so that when we use it to upload the presentation, it is able to look it up in the list of tokens
outGW.send(buildPresentationUploadTokenSysPubMsg(parentMeetingId, userId, presentationUploadToken, currentPres.name)) outGW.send(buildPresentationUploadTokenSysPubMsg(parentMeetingId, userId, presentationUploadToken, currentPres.name))
// 1) Send Annotations to Redis // 1) Send Annotations to Redis
var annotations = new StoredAnnotations(presId, storeAnnotationPages) var annotations = new StoredAnnotations(jobId, presId, storeAnnotationPages)
outGW.send(buildStoreAnnotationsInRedisSysMsg(annotations)) outGW.send(buildStoreAnnotationsInRedisSysMsg(annotations))
// 2) Insert Export Job in Redis // 2) Insert Export Job in Redis
val jobId = RandomStringGenerator.randomAlphanumericString(16)
val jobType: String = "PresentationWithAnnotationExportJob" val jobType: String = "PresentationWithAnnotationExportJob"
val presLocation = s"/var/bigbluebutton/${presId}" val presLocation = s"/var/bigbluebutton/${presId}"
val exportJob = new ExportJob(jobId, jobType, presId, presLocation, allPages, storeAnnotationPages, parentMeetingId, presentationUploadToken) val exportJob = new ExportJob(jobId, jobType, presId, presLocation, allPages, storeAnnotationPages, parentMeetingId, presentationUploadToken)

View File

@ -114,8 +114,8 @@ class AnalyticsActor(val includeChat: Boolean) extends Actor with ActorLogging {
case m: SetPresentationDownloadableEvtMsg => logMessage(msg) case m: SetPresentationDownloadableEvtMsg => logMessage(msg)
//case m: PresentationPageConvertedSysMsg => logMessage(msg) //case m: PresentationPageConvertedSysMsg => logMessage(msg)
//case m: PresentationPageConvertedEventMsg => logMessage(msg) //case m: PresentationPageConvertedEventMsg => logMessage(msg)
case m: StoreAnnotationsInRedisSysMsg => logMessage(msg) // case m: StoreAnnotationsInRedisSysMsg => logMessage(msg)
case m: StoreExportJobInRedisSysMsg => logMessage(msg) // case m: StoreExportJobInRedisSysMsg => logMessage(msg)
case m: MakePresentationWithAnnotationDownloadReqMsg => logMessage(msg) case m: MakePresentationWithAnnotationDownloadReqMsg => logMessage(msg)
case m: ExportPresentationWithAnnotationReqMsg => logMessage(msg) case m: ExportPresentationWithAnnotationReqMsg => logMessage(msg)
case m: PresentationPageConversionStartedSysMsg => logMessage(msg) case m: PresentationPageConversionStartedSysMsg => logMessage(msg)

View File

@ -142,6 +142,7 @@ class RedisRecorderActor(
private def handleStoreAnnotationsInRedisSysMsg(msg: StoreAnnotationsInRedisSysMsg) { private def handleStoreAnnotationsInRedisSysMsg(msg: StoreAnnotationsInRedisSysMsg) {
val ev = new StorePresentationAnnotationsRecordEvent() val ev = new StorePresentationAnnotationsRecordEvent()
ev.setJobId(msg.body.annotations.jobId)
ev.setPresId(msg.body.annotations.presId) ev.setPresId(msg.body.annotations.presId)
ev.setPages(msg.body.annotations.pages) ev.setPages(msg.body.annotations.pages)

View File

@ -21,6 +21,8 @@ package org.bigbluebutton.common2.redis;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import io.lettuce.core.api.sync.BaseRedisCommands; import io.lettuce.core.api.sync.BaseRedisCommands;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -114,10 +116,28 @@ public class RedisStorageService extends RedisAwareCommunicator {
public void storePresentationAnnotations(String meetingId, Map<String, String> event, String msgType) { public void storePresentationAnnotations(String meetingId, Map<String, String> event, String msgType) {
RedisCommands<String, String> commands = connection.sync(); RedisCommands<String, String> commands = connection.sync();
Long msgid = commands.incr("global:nextRecordedMsgId");
commands.multi(); commands.multi();
commands.hmset("store" + msgType + ":" + meetingId + ":" + msgid, event);
commands.rpush("meeting:" + meetingId + ":" + "store" + msgType, Long.toString(msgid)); switch (msgType) {
case "Annotations": {
commands.hmset(event.get("jobId"), event);
break;
}
case "ExportJob": {
Gson gson = new Gson();
String exportJobAsJson = gson.toJson(event);
commands.rpush("exportJobs", exportJobAsJson.toString());
break;
}
default: {
log.error("Attempted to store PresentationAnnotations message of type: {} (expected 'Annotations' or 'ExportJob')", clientName);
break;
}
}
commands.exec(); commands.exec();
} }

View File

@ -13,6 +13,7 @@ case class PresentationPageForExport(
) )
case class StoredAnnotations( case class StoredAnnotations(
jobId: String,
presId: String, presId: String,
pages: Array[PresentationPageForExport], pages: Array[PresentationPageForExport],
) )