当前位置: 首页 > 知识库问答 >
问题:

Spring Integr手动将消息发布到频道

赖杰
2023-03-14

我正在学习如何使用Java Spring框架,并开始尝试Spring集成。我试图使用Spring集成将我的应用程序连接到MQTT代理以发布和订阅消息,但我很难找到将消息手动发布到出站通道的方法。如果可能的话,我想专门使用java代码中的符号来构建它,而不是使用定义bean和其他相关配置的xml文件。

在每个示例中,我都看到手动发布消息的解决方案似乎是使用MessagingGateway接口,然后使用SpringApplicationBuilder获取ConfigurableApplicationContext,以在主方法中获取对网关接口的引用。然后使用该引用发布消息。是否可以将AutoWired用于接口?在我的尝试中,我只得到了一个空指针。

我的目标是构建一个游戏,在其中我订阅一个主题以获取游戏消息,然后每当用户准备好进行下一步操作时,就向该主题发布一条新消息。

更新:这是我一直在看的关于如何设置出站通道的示例之一:https://docs.spring.io/spring-integration/reference/html" target="_blank">html/mqtt.html

Gary Russel回答后更新2:

这是我在查看了一些示例后编写的示例代码,这些示例在运行Gateway时为网关使用@AutoWired时会得到一个null指针。控制器中的sendToMqtt。Java语言这里我想要实现的是在控制器处理GET请求时手动发送mqtt消息。

应用Java语言

@SpringBootApplication
public class Application {

    public static void main(String[] args){
        SpringApplication.run(Application.class, args);
    }
}

控制器。Java语言

@RestController
@RequestMapping("/publishMessage")
public class Controller {

    @Autowired
    static Gateway gateway;

    @RequestMapping(method = RequestMethod.GET)
    public int request(){
        gateway.sendToMqtt("Test Message!");
        return 0;
    }
}

MqttPublisher。Java语言

@EnableIntegration
@Configuration
public class MqttPublisher {
    @Bean
    public MqttPahoClientFactory mqttClientFactory(){
        DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
        factory.setServerURIs("tcp://localhost:1883");
        return factory;
    }

    @Bean
    @ServiceActivator(inputChannel = "mqttOutboundChannel")
    public MessageHandler mqttOutbound(){
        MqttPahoMessageHandler messageHandler =
                new MqttPahoMessageHandler("clientPublisher", mqttClientFactory());
        messageHandler.setAsync(true);
        messageHandler.setDefaultTopic("topic");
        return messageHandler;
    }

    @Bean
    public MessageChannel mqttOutboundChannel(){
        return new DirectChannel();
    }

    @MessagingGateway(defaultRequestChannel = "mqttOutboundChannel")
    public interface Gateway {

        void sendToMqtt(String data);
    }
}

更新:

不确定这是否是正确的日志记录,但这是我从添加中得到的:

logging.level.org.springframework.web=Debug
logging.level.org.hibernate=Error

应用程序。属性。

https://hastebin.com/cuvonufeco.hs

共有1个答案

扈高逸
2023-03-14

使用消息网关或只需向通道发送消息。

编辑

@SpringBootApplication
public class So47846492Application {

    public static void main(String[] args) {
        SpringApplication.run(So47846492Application.class, args).close();
    }

    @Bean
    public ApplicationRunner runner(MyGate gate) {
        return args -> {
            gate.send("someTopic", "foo");
            Thread.sleep(5_000);
        };
    }

    @Bean
    @ServiceActivator(inputChannel = "toMqtt")
    public MqttPahoMessageHandler mqtt() {
        MqttPahoMessageHandler handler = new MqttPahoMessageHandler("tcp://localhost:1883", "foo",
                clientFactory());
        handler.setDefaultTopic("myTopic");
        handler.setQosExpressionString("1");
        return handler;
    }

    @Bean
    public MqttPahoClientFactory clientFactory() {
        DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
        factory.setUserName("guest");
        factory.setPassword("guest");
        return factory;
    }

    @Bean
    public MqttPahoMessageDrivenChannelAdapter mqttIn() {
        MqttPahoMessageDrivenChannelAdapter adapter =
                new MqttPahoMessageDrivenChannelAdapter("tcp://localhost:1883", "bar", "someTopic");
        adapter.setOutputChannelName("fromMqtt");
        return adapter;
    }

    @ServiceActivator(inputChannel = "fromMqtt")
    public void in(String in) {
        System.out.println(in);
    }

    @MessagingGateway(defaultRequestChannel = "toMqtt")
    public interface MyGate {

        void send(@Header(MqttHeaders.TOPIC) String topic, String out);

    }

}
 类似资料:
  • 本文向大家介绍Python如何将消息发布到RabbitMQ,包括了Python如何将消息发布到RabbitMQ的使用技巧和注意事项,需要的朋友参考一下 示例 从导入库开始。 接下来,我们需要打开与RabbitMQ服务器的连接。 之后,我们需要建立一个频道。每个连接可以有多个通道,通常在执行多线程任务时,建议(但不是必需)每个线程一个。 建立频道后,我们就可以开始准备信息了。 现在,我们可以通过简单

  • 物联网有很多设备,通过这条指令可以向某个特定的物联网设备发送特定的消息内容。 请求方式: "|4|1|3|topic|message|" 参数: topic 设置订阅的topic,获取设备topic可参考教程 message 发布消息的内容 返回值: "|4|1|3|1|\r" 消息发送成功 "|4|1|3|2|\r" 消息发送失败 Arduino样例: softSerial.print("|4|

  • 我创建了一个开源项目,希望将其发布到maven central,以便用户只需在POM中引用它就可以使用该库。例如: 我找到了几个在线教程,但其中一些已经过时,一些建议自动化整个过程,从而公开复杂化它。 例如,一篇教程建议为github帐户创建SSH键,并让maven在推送到maven Central时自动创建一个git标记。虽然这是有用的,但没有必要开始。 另一个例子,试图直接通过maven发布它

  • 问题内容: 如何要求机器人将消息发送到与机器人接收命令不同的另一个通道(特定通道)? 假设bot 在channel中接收到消息,并且如果操作完成,则bot发送到channel 。 代码: 代码: 问题答案: 答案很简单:

  • 我通过自定义管理的KMS密钥有一个加密的SQS队列和SNS主题。目前,我正在使用下面链接中所述的类似类型的SQS策略,它可以正常工作SQS策略 但是如果我使用下面的SQS策略,它就不起作用了。出于安全原因,我不想将主体设置为“*”。有人能解释一下为什么会发生这种情况吗

  • 我是新Kubernetes。我在一个pod中实现了一个网络服务器,并为该pod设置了一个Nodeport服务。我想发送一个POST请求与自定义消息(在json中)到一个pod后,它已经被创建并准备好使用。我想使用go客户端库。你能告诉我怎么做吗?图书馆的哪个部分来帮忙?谢谢。