diff --git a/extensions/smallrye-reactive-messaging/deployment/src/main/resources/dev-ui/qwc-smallrye-reactive-messaging-channels.js b/extensions/smallrye-reactive-messaging/deployment/src/main/resources/dev-ui/qwc-smallrye-reactive-messaging-channels.js
index f382cbdf19ce2..2f7abd6e6fcd5 100644
--- a/extensions/smallrye-reactive-messaging/deployment/src/main/resources/dev-ui/qwc-smallrye-reactive-messaging-channels.js
+++ b/extensions/smallrye-reactive-messaging/deployment/src/main/resources/dev-ui/qwc-smallrye-reactive-messaging-channels.js
@@ -61,7 +61,7 @@ export class QwcSmallryeReactiveMessagingChannels extends LitElement {
>
@@ -95,9 +95,19 @@ export class QwcSmallryeReactiveMessagingChannels extends LitElement {
}
_channelPublisherRenderer(channel) {
- const publisher = channel.publisher;
- if (publisher) {
- return this._renderComponent(publisher);
+ const publishers = channel.publishers;
+ if (publishers) {
+ if (publishers.length === 1) {
+ return this._renderComponent(publishers[0]);
+ } else if (publishers.length > 1) {
+ return html`
+
+ ${publishers.map(item => html`- ${this._renderComponent(item)}
`)}
+
+ `;
+ } else {
+ return html`No publishers`
+ }
}
}
diff --git a/extensions/smallrye-reactive-messaging/runtime/src/main/java/io/quarkus/smallrye/reactivemessaging/runtime/devui/DevReactiveMessagingInfos.java b/extensions/smallrye-reactive-messaging/runtime/src/main/java/io/quarkus/smallrye/reactivemessaging/runtime/devui/DevReactiveMessagingInfos.java
index 6f79ad41b86e1..3fc7884e69be0 100644
--- a/extensions/smallrye-reactive-messaging/runtime/src/main/java/io/quarkus/smallrye/reactivemessaging/runtime/devui/DevReactiveMessagingInfos.java
+++ b/extensions/smallrye-reactive-messaging/runtime/src/main/java/io/quarkus/smallrye/reactivemessaging/runtime/devui/DevReactiveMessagingInfos.java
@@ -34,21 +34,24 @@ public List get() {
.get();
// collect all channels
- Map publishers = new HashMap<>();
+ Map> publishers = new HashMap<>();
Map> consumers = new HashMap<>();
Function> fun = e -> new ArrayList<>();
// Unfortunately, there is no easy way to obtain the connectors metadata
Connectors connectors = container.instance(Connectors.class).get();
- publishers.putAll(connectors.outgoingConnectors);
+ for (Entry entry : connectors.outgoingConnectors.entrySet()) {
+ publishers.computeIfAbsent(entry.getKey(), fun)
+ .add(entry.getValue());
+ }
for (Entry entry : connectors.incomingConnectors.entrySet()) {
consumers.computeIfAbsent(entry.getKey(), fun)
.add(entry.getValue());
}
for (EmitterConfiguration emitter : context.getEmitterConfigurations()) {
- publishers.put(emitter.name(),
- new Component(ComponentType.EMITTER,
+ publishers.computeIfAbsent(emitter.name(), fun)
+ .add(new Component(ComponentType.EMITTER,
emitter.broadcast() ? "@Broadcast "
: "" + asCode(DevConsoleRecorder.EMITTERS.get(emitter.name()))));
}
@@ -58,23 +61,27 @@ public List get() {
asCode(DevConsoleRecorder.CHANNELS.get(channel.channelName))));
}
for (MediatorConfiguration mediator : context.getMediatorConfigurations()) {
- boolean isProcessor = !mediator.getIncoming().isEmpty() && mediator.getOutgoing() != null;
+ boolean isProcessor = !mediator.getIncoming().isEmpty() && !mediator.getOutgoings().isEmpty();
if (isProcessor) {
- publishers.put(mediator.getOutgoing(),
- new Component(ComponentType.PROCESSOR, asMethod(mediator.methodAsString())));
+ for (String outgoing : mediator.getOutgoings()) {
+ publishers.computeIfAbsent(outgoing, fun)
+ .add(new Component(ComponentType.PROCESSOR, asMethod(mediator.methodAsString())));
+ }
for (String incoming : mediator.getIncoming()) {
consumers.computeIfAbsent(incoming, fun)
.add(new Component(ComponentType.PROCESSOR,
asMethod(mediator.methodAsString())));
}
- } else if (mediator.getOutgoing() != null) {
- StringBuilder builder = new StringBuilder();
- builder.append(asMethod(mediator.methodAsString()));
- if (mediator.getBroadcast()) {
- builder.append("[broadcast: true]");
+ } else if (!mediator.getOutgoings().isEmpty()) {
+ for (String outgoing : mediator.getOutgoings()) {
+ StringBuilder builder = new StringBuilder();
+ builder.append(asMethod(mediator.methodAsString()));
+ if (mediator.getBroadcast()) {
+ builder.append("[broadcast: true]");
+ }
+ publishers.computeIfAbsent(outgoing, fun)
+ .add(new Component(ComponentType.PUBLISHER, builder.toString()));
}
- publishers.put(mediator.getOutgoing(),
- new Component(ComponentType.PUBLISHER, builder.toString()));
} else if (!mediator.getIncoming().isEmpty()) {
for (String incoming : mediator.getIncoming()) {
consumers.computeIfAbsent(incoming, fun)
@@ -113,12 +120,12 @@ public List getChannels() {
public static class DevChannelInfo implements Comparable {
private final String name;
- private final Component publisher;
+ private final List publishers;
private final List consumers;
- public DevChannelInfo(String name, Component publisher, List consumers) {
+ public DevChannelInfo(String name, List publishers, List consumers) {
this.name = name;
- this.publisher = publisher;
+ this.publishers = publishers != null ? publishers : Collections.emptyList();
this.consumers = consumers != null ? consumers : Collections.emptyList();
}
@@ -126,8 +133,8 @@ public String getName() {
return name;
}
- public Component getPublisher() {
- return publisher;
+ public List getPublishers() {
+ return publishers;
}
public List getConsumers() {
@@ -136,17 +143,11 @@ public List getConsumers() {
@Override
public int compareTo(DevChannelInfo other) {
- if (publisher != other.publisher) {
- if (other.publisher == null) {
- return -1;
- }
- if (publisher == null) {
- return 1;
- }
- // publisher connectors first
- if (publisher.type != other.publisher.type) {
- return publisher.type == ComponentType.CONNECTOR ? -1 : 1;
- }
+ // publisher connectors last
+ long publisherConnectors = publishers.stream().filter(Component::isConnector).count();
+ long otherPublisherConnectors = other.publishers.stream().filter(Component::isConnector).count();
+ if (publisherConnectors != otherPublisherConnectors) {
+ return Long.compare(otherPublisherConnectors, publisherConnectors);
}
// consumer connectors last
long consumerConnectors = consumers.stream().filter(Component::isConnector).count();
@@ -154,10 +155,6 @@ public int compareTo(DevChannelInfo other) {
if (consumerConnectors != otherConsumersConnectors) {
return Long.compare(otherConsumersConnectors, consumerConnectors);
}
- if (publisher != other.publisher && publisher.type == ComponentType.CONNECTOR
- && other.publisher.type != ComponentType.CONNECTOR) {
- return 1;
- }
// alphabetically
return name.compareTo(other.name);
}
diff --git a/extensions/smallrye-reactive-messaging/runtime/src/main/java/io/quarkus/smallrye/reactivemessaging/runtime/devui/ReactiveMessagingJsonRpcService.java b/extensions/smallrye-reactive-messaging/runtime/src/main/java/io/quarkus/smallrye/reactivemessaging/runtime/devui/ReactiveMessagingJsonRpcService.java
index 3e83d74354348..57554fb7e1785 100644
--- a/extensions/smallrye-reactive-messaging/runtime/src/main/java/io/quarkus/smallrye/reactivemessaging/runtime/devui/ReactiveMessagingJsonRpcService.java
+++ b/extensions/smallrye-reactive-messaging/runtime/src/main/java/io/quarkus/smallrye/reactivemessaging/runtime/devui/ReactiveMessagingJsonRpcService.java
@@ -24,7 +24,7 @@ public JsonArray getInfo() {
private JsonObject toJson(DevReactiveMessagingInfos.DevChannelInfo channel) {
JsonObject json = new JsonObject();
json.put("name", channel.getName());
- json.put("publisher", toJson(channel.getPublisher()));
+ json.put("publishers", toJson(channel.getPublishers()));
json.put("consumers", toJson(channel.getConsumers()));
return json;
}
diff --git a/integration-tests/devmode/src/test/java/io/quarkus/test/devui/DevUIReactiveMessagingJsonRPCTest.java b/integration-tests/devmode/src/test/java/io/quarkus/test/devui/DevUIReactiveMessagingJsonRPCTest.java
index 14a743cdac556..c96ccd7b1ffc7 100644
--- a/integration-tests/devmode/src/test/java/io/quarkus/test/devui/DevUIReactiveMessagingJsonRPCTest.java
+++ b/integration-tests/devmode/src/test/java/io/quarkus/test/devui/DevUIReactiveMessagingJsonRPCTest.java
@@ -43,9 +43,9 @@ public void testProcessor() throws Exception {
consumerExists = typeAndDescriptionExist(consumers, "CHANNEL",
"io.quarkus.test.devui.MyProcessor#channel
");
}
- JsonNode publisher = channel.get("publisher");
- if (publisher != null) {
- publisherExists = typeAndDescriptionExist(publisher, "PROCESSOR",
+ JsonNode publishers = channel.get("publishers");
+ if (publishers != null) {
+ publisherExists = typeAndDescriptionExist(publishers, "PROCESSOR",
"io.quarkus.test.devui.MyProcessor#process()
");
}
}