我们尝试使用Smallrye反应消息发布和订阅MQTT协议。通过以下简单代码,我们设法将消息实际发布到特定主题/渠道中
import io.smallrye.mutiny.Multi;
import org.eclipse.microprofile.reactive.messaging.Outgoing;
import javax.enterprise.context.ApplicationScoped;
import java.time.Duration;
@ApplicationScoped
public class Publish {
@Outgoing("pao")
public Multi<String> generate() {
return Multi.createFrom().ticks().every(Duration.ofSeconds(1))
.map(x -> "A Message in here");
}
}
我们想要做的是在需要动态主题的情况下调用generate()
方法,用户将在其中定义它。那是我们的问题,但随后我们从github中的repo找到了这些类。套件名称io.smallrye.reactive.messaging.mqtt
例如,我们发现有一个类说它对MQTT代理(Mosquitto服务器已启动)进行发布调用。
在该语句中SendingMqttMessage<String> message = new SendingMqttMessage<String>("myTopic","A message in here",0,false);
我们在SendingMqttMessage<String>
下得到一个红色下划线,表示'SendingMqttMessage(java.lang.String,java.lang.String,io.netty.handler.codec.mqtt.MqttQoS,boolean)'不公开在“ io.smallrye.reactive.messaging.mqtt.SendingMqttMessage”中。无法从外部软件包访问
更新(发布完成)
最后,向mqtt代理(一个mosquitto服务器)发出了发布请求,所有这些都由用户配置了一个动态主题。我们发现以前的SendingMqttMessage
类根本不应该使用。而且我们发现我们还需要并发射器实际发出带有动态主题的发布请求。
@Inject
@Channel("panatha")
Emitter<String> emitter;
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response createUser(Device device) {
System.out.println("New Publish request: message->"+device.getMessage()+" & topic->"+device.getTopic());
emitter.send(MqttMessage.of(device.getTopic(), device.getMessage()));
return Response.ok().status(Response.Status.CREATED).build();
}
现在,我们需要了解有关动态订阅主题的信息。