Spring Boot 和 Spring 集成。问题

问题描述 投票:0回答:1

我有一个 SpringBoot 应用程序。我有一个专用服务器,我将在其中通过 HTTP GET 请求读取数据。我为 Spring Integration 模块配置了 http-outbound-config.xml 文件。 当我运行以下代码时,一切都很好

http-出站-config.xml

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:int="http://www.springframework.org/schema/integration" xmlns:int-http="http://www.springframework.org/schema/integration/http" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/integration https://www.springframework.org/schema/integration/spring-integration.xsd http://www.springframework.org/schema/integration/http https://www.springframework.org/schema/integration/http/spring-integration-http.xsd"> <int:channel id="requestChannel"/> <int:channel id="replyChannel"> <int:queue capacity='10'/> </int:channel> <int-http:outbound-gateway id="outboundGateway" request-channel="requestChannel" url="http://server/API.jsp?id=1" http-method="GET" expected-response-type="java.lang.String" charset="UTF-8" reply-channel="replyChannel"/> </beans>
主要应用类:

package test; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ImportResource; import ru.eco.products.waste.egr.Integration; @SpringBootApplication @ImportResource("/META-INF/spring/integration/http-outbound-config.xml") public class Application { public static void main(String[] args) { Integration integration = new Integration(); integration.start(); SpringApplication.run(WasteWebClientApplication.class, args ); } }
整合类:

package test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.ImportResource; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; import org.springframework.messaging.PollableChannel; import org.springframework.messaging.support.MessageBuilder; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; @Component @Configuration public class Integration { public void start() { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:META-INF/spring/integration/http-outbound-config.xml"); context.start(); MessageChannel requestChannel = context.getBean("requestChannel", MessageChannel.class); PollableChannel replyChannel = context.getBean("replyChannel", PollableChannel.class); Message<?> message = MessageBuilder.withPayload("").build(); requestChannel.send(message); Message<?> receivedMsg = replyChannel.receive(); System.out.println("RESULT IS : " + receivedMsg.getPayload()); } }

但是,当我尝试自动装配 MessageChannel 和 PollableChannel 时,我收到一个空指针异常。

集成类(非工作示例):

package test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.ImportResource; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; import org.springframework.messaging.PollableChannel; import org.springframework.messaging.support.MessageBuilder; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; @Component @Configuration public class Integration { @Autowired @Qualifier("requestChannel") MessageChannel requestChannel; @Autowired @Qualifier("replyChannel") PollableChannel replyChannel; public void start() { Message<?> message = MessageBuilder.withPayload("").build(); requestChannel.send(message); Message<?> receivedMsg = replyChannel.receive(); System.out.println("RESULT IS : " + receivedMsg.getPayload()); } }

    问题 1:为什么自动装配不起作用?
  1. 问题2:从专用服务器获取数据并将其保存到数据库的最佳方式是什么?这样的配置可以吗?我将为响应创建一个模型类,然后通过 JPA 将其保存到数据库中。
  2. 问题3:我需要在异步模式下从服务器读取数据。如何在 Spring Boot 中实现它?所以这里的主要想法是我将从 UI 接收一个 POST 方法,并启动与 Web 服务的集成。集成完成后,我需要通知用户。
  3. 问题 4:也许 Camel 将是最好的解决方案?
堆栈:Java 11、Spring Boot、thymeleaf + bootstrap。

java spring spring-boot spring-integration spring-integration-http
1个回答
1
投票
  1. 既然你这样做了

    new Integration();

    ,你肯定不会有依赖注入,因为不涉及控制容器的反转。虽然完全不清楚为什么你需要那个 
    new ClassPathXmlApplicationContext("classpath:META-INF/spring/integration/http-outbound-config.xml")
     如果你已经做了 Spring Boot 并且正确的 
    @ImportResource

  2. 这是您已经使用 Spring Integration XML 配置的

    @ImportResource

     所做的最佳方法。然后您需要访问 
    ApplicationContext
    SpringApplication.run()
    getBean(Integration.class)
     来调用您的 
    start()
     方法。然而你完全需要忘记
    new Integratio()
    。 Spring 将为此管理一个 bean 
    Integration
    ,然后依赖注入就会起作用。

  3. 异步模式可以通过Spring Integration中的

    ExecutorChannel

    来实现。因此,当您向此通道发送消息时,逻辑将在不同的线程上处理。然而,不清楚为什么你提出这样的要求,因为你仍然会通过那个 
    replyChannel.receive()
     来阻止......尽管这应该在单独的 SO 线程中解决。

  4. Camel VS Spring Integration 问题不属于 StackOverflow 政策。

Thymeleaf 和 Bootstrap 在这个问题的上下文中具有误导性。

请考虑学习如何在此处正确提问:

https://stackoverflow.com/help/how-to-ask

还阅读一些有关依赖注入和控制反转的文档:

https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#spring-core

© www.soinside.com 2019 - 2024. All rights reserved.