(control) Message queue UX improvements
This commit is contained in:
parent
67ee6f4126
commit
175bd310f5
@ -322,35 +322,54 @@ public class MessageQueueService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Get all messages related to a given message, including the given message itself */
|
||||||
public List<MessageQueueEntry> getRelatedMessages(long relatedId) {
|
public List<MessageQueueEntry> getRelatedMessages(long relatedId) {
|
||||||
|
NavigableSet<Long> newRelatedIds = new TreeSet<>();
|
||||||
|
Set<Long> addedIds = new HashSet<>();
|
||||||
|
Set<Long> queriedIds = new HashSet<>();
|
||||||
|
newRelatedIds.add(relatedId);
|
||||||
|
|
||||||
|
List<MessageQueueEntry> entries = new ArrayList<>();
|
||||||
|
|
||||||
|
// This is not a very performant way of doing this, but it's not a very common operation either
|
||||||
|
// and only available within the operator user interface.
|
||||||
try (var conn = dataSource.getConnection();
|
try (var conn = dataSource.getConnection();
|
||||||
var query = conn.prepareStatement("""
|
var ps = conn.prepareStatement("""
|
||||||
(SELECT ID, RELATED_ID, SENDER_INBOX, RECIPIENT_INBOX, FUNCTION, PAYLOAD, OWNER_INSTANCE, OWNER_TICK, STATE, CREATED_TIME, UPDATED_TIME, TTL
|
SELECT ID, RELATED_ID, SENDER_INBOX, RECIPIENT_INBOX, FUNCTION, PAYLOAD, OWNER_INSTANCE, OWNER_TICK, STATE, CREATED_TIME, UPDATED_TIME, TTL
|
||||||
FROM MESSAGE_QUEUE
|
FROM MESSAGE_QUEUE
|
||||||
WHERE RELATED_ID = ?
|
WHERE ID = ? OR RELATED_ID = ?
|
||||||
ORDER BY ID DESC
|
ORDER BY ID DESC
|
||||||
LIMIT 100)
|
|
||||||
UNION
|
|
||||||
(SELECT ID, RELATED_ID, SENDER_INBOX, RECIPIENT_INBOX, FUNCTION, PAYLOAD, OWNER_INSTANCE, OWNER_TICK, STATE, CREATED_TIME, UPDATED_TIME, TTL
|
|
||||||
FROM MESSAGE_QUEUE
|
|
||||||
WHERE ID = (SELECT RELATED_ID FROM MESSAGE_QUEUE WHERE ID=?)
|
|
||||||
ORDER BY ID DESC
|
|
||||||
LIMIT 100)
|
|
||||||
""")) {
|
""")) {
|
||||||
|
|
||||||
query.setLong(1, relatedId);
|
while (!newRelatedIds.isEmpty()) {
|
||||||
query.setLong(2, relatedId);
|
var nextId = newRelatedIds.pollFirst();
|
||||||
|
|
||||||
List<MessageQueueEntry> entries = new ArrayList<>(100);
|
if (nextId == null || !queriedIds.add(nextId))
|
||||||
var rs = query.executeQuery();
|
continue;
|
||||||
while (rs.next()) {
|
|
||||||
entries.add(newEntry(rs));
|
ps.setLong(1, nextId);
|
||||||
|
ps.setLong(2, nextId);
|
||||||
|
|
||||||
|
var rs = ps.executeQuery();
|
||||||
|
while (rs.next()) {
|
||||||
|
var entry = newEntry(rs);
|
||||||
|
|
||||||
|
if (addedIds.add(entry.id()))
|
||||||
|
entries.add(entry);
|
||||||
|
|
||||||
|
if (!queriedIds.contains(entry.id()))
|
||||||
|
newRelatedIds.add(entry.id());
|
||||||
|
if (entry.hasRelatedMessage() && !queriedIds.contains(entry.relatedId()))
|
||||||
|
newRelatedIds.add(entry.relatedId());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return entries;
|
|
||||||
}
|
}
|
||||||
catch (SQLException ex) {
|
catch (SQLException ex) {
|
||||||
throw new RuntimeException(ex);
|
throw new RuntimeException(ex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
entries.sort(Comparator.comparingLong(MessageQueueEntry::id).reversed());
|
||||||
|
return entries;
|
||||||
}
|
}
|
||||||
|
|
||||||
private MessageQueueEntry newEntry(ResultSet rs) throws SQLException {
|
private MessageQueueEntry newEntry(ResultSet rs) throws SQLException {
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
Filter
|
Filter
|
||||||
</button>
|
</button>
|
||||||
<ul class="dropdown-menu">
|
<ul class="dropdown-menu">
|
||||||
|
<li><a class="dropdown-item" href="/message-queue">Show All</a></li>
|
||||||
{{#each inboxes}}
|
{{#each inboxes}}
|
||||||
<li><a class="dropdown-item" href="/message-queue?inbox={{this}}">{{this}}</a></li>
|
<li><a class="dropdown-item" href="/message-queue?inbox={{this}}">{{this}}</a></li>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
|
Loading…
Reference in New Issue
Block a user