【问题标题】:Spring Boot and Spring Integration. ProblemsSpring Boot 和 Spring 集成。问题
【发布时间】:2020-12-02 20:20:31
【问题描述】:

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

http-outbound-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());
    }
}

但是,当我尝试 Autowire 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. 问题 2:从专用服务器获取数据并将其保存到数据库的最佳方法是什么?这样的配置好吗?我将为响应创建一个模型类,然后通过 JPA 将其保存到数据库中。
  3. 问题 3:我需要在异步模式下从服务器读取数据。如何在 Spring Boot 中实现它?所以这里的主要想法是我将从 UI 接收一个 POST 方法,并启动与 Web 服务的集成。集成完成后,我需要通知用户。
  4. 问题 4:Camel 可能是这里的最佳解决方案?

堆栈:Java 11、Spring Boot、thymeleaf + bootstrap。

感谢您提前回答。

【问题讨论】:

    标签: java spring spring-boot spring-integration spring-integration-http


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

    2. 对于 Spring Integration XML 配置,您已经使用 @ImportResource 的最佳方式。然后你需要访问SpringApplication.run()getBean(Integration.class)ApplicationContext 来调用你的start() 方法。但是,您完全需要忘记new Integratio()。 Spring 将为 Integration 管理一个 bean,然后依赖注入将起作用。

    3. 可以在 Spring Integration 中使用 ExecutorChannel 来实现异步模式。因此,当您向此通道发送消息时,逻辑将在不同的线程上处理。但是不清楚为什么要提出这样的要求,因为您仍然要通过 replyChannel.receive() 进行阻止...尽管这应该在单独的 SO 线程中解决。

    4. Camel VS Spring 集成问题超出了 StackOverflow 政策范围。

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

    请考虑在 SO 上学习如何正确提问:https://stackoverflow.com/help/how-to-ask

    还阅读了一些关于依赖注入和控制反转的文档:https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#spring-core

    【讨论】:

    • 谢谢@artem-bilan
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 2015-05-29
    • 2020-01-11
    相关资源
    最近更新 更多