Spring Integeration学习

本文介绍了Spring Integration的三个核心概念:Message、Channel和EndPoint,同时通过实例展示了HttpInboundGateway和HttpOutboundGateway的应用场景,包括如何配置拦截器进行鉴权及日志记录,以及如何使用Transformer对消息参数进行转换。

Spring Integeration涉及的概念很多,最重要的有三点:Message、Channel、EndPoint

1、Message

Message是Spring Integration最基本的概念之一。Message是对系统内各节点间交互内容封装的对象。可以把Spring Integration比作一系列的管道,那么Message就是管道中流动的水。

Message对象包含两部分,消息头(header)和负载(payload)。消息头包含消息Id、时间戳、优先级等信息。负载中放什么都可以,这里是真正要交互的数据。

Message 接口定义:

public interface Message<T> {

      T getPayload();

      MessageHeadersgetHeaders();

}

2、Channel

Channel也是Spring Integration中最基本的概念之一。Channel就好像一个管子,生产者生产一个Message放到Channel,消费者从Channel消费一个Message,所以Channel可以对Message组件解耦,并且可以提供一个方便的拦截功能和监控功能

MessageChannel 接口定义

public interface MessageChannel {

     boolean send(Message message);

        boolean send(Messagemessage, long timeout);

}

3、EndPoint

Message Endpoint是指处理Message的端点,在Channel中不能处理消息。对消息的处理只能在这里完成。这里不需要修改你的代码,只需要做一些配置声明即可完成预取操作。


Spring Integeration实践

a、Spring Integration中Http相关的概念有Http Inbound Gateway、Http Outbound Gateway。可以把http Inboundgateway 看作是服务端组件,Http OutboundGateway看作客户端组件。

服务器端:

Http Inbound-gateway用来接受/receiveGateway的POST请求或GET请求,并连接到一个receiveChannel通道,通道关联到一个service-activator,service-activator对应一个empolyeeSearchService服务类的hello方法。配置如下:

<int-http:inbound-gateway

         request-channel="receiveChannel" 

 name="/receiveGateway" 

 supported-methods="POST,GET"/> 

<int:channelid="receiveChannel"/>     

<int:service-activator

         input-channel="receiveChannel"

         ref="employeeSearchService"

        method="hello""/>

1. 拦截器应用

拦截器作用在Channel上,可以实现编解码、加密解密、鉴权、日志、监控等操作。我们的实例中也可以在Channel上设置拦截器,配置如下:

<int:channelid="inputChannel">

         <int:interceptors>

                 <refbean="myChannelInterceptor"/>

                 <refbean="mysecondChannelInterceptor"/>

          </int:interceptors>

  </int:channel>

<beanid="myChannelInterceptor"

                           class="com.service.myChannelInterceptor"/>

拦截器代码实现如下:

public class myChannelInterceptor implements ChannelInterceptor {

  @Override

  public Message<?>postReceive(Message<?> msg, MessageChannel channel) {

         return msg;

  }

  @Override

  public Message<?> preSend(Message<?>msg, MessageChannel channel) {

         MultiValueMap map =  (MultiValueMap)message.getPayload();

             LinkedList list =(LinkedList)map.get("employeeId");

             String id = (String)list.get(0);

             if (id.equals("errUser")) {

                    throw new MessagingException("useris error!");

             }     

         return msg;

  }

1. Transformer应用

当请求参数与Service实例输入的参数不一致时,我们需要使用Transformer对输入的参数作转换。转换器需要关联一个输入Channel和输出的Channel。配置如下:

<int:transformer

             ref="employeeSearchService"

             method="transforParam"

             input-channel="inputChannel" 

             output-channel="inputChannel_transformed"/>

上述配置中实现转换的是”employeeSearchService”Bean的transforParam方法。方法声明中要加标注@Transformer。方法的代码如下:

@Transformer

publicMessage<MyParam> transforParam(Message<?>  inMessage)  {

      MultiValueMap map = (MultiValueMap)inMessage.getPayload();

      LinkedList list = (LinkedList)map.get("employeeId");

      String id = (String)list.get(0);

      String name = (String)map.get("name");

      MyParam param = new MyParam();

      param.setName(name);

      param.setId(id);

      Message<MyParam>message =

                 newGenericMessage<MyParam>(param,inMessage.getHeaders());

         return message;

}









编写Spring Boot集成测试用例可以通过多种方式实现,主要目标是确保应用程序的不同组件能够协同工作。以下是一些常见的方法和步骤: ### 使用`@SpringBootTest`注解 `@SpringBootTest`注解用于启动完整的Spring应用上下文,适合进行端到端的集成测试。它会加载整个应用程序的配置,并启动一个嵌入式的Web服务器。 ```java import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.web.server.LocalServerPort; import org.springframework.test.web.reactive.server.WebTestClient; @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) public class MyIntegrationTest { @LocalServerPort private int port; private WebTestClient webTestClient; @Test public void testEndpoint() { webTestClient.get().uri("/api/test") .exchange() .expectStatus().isOk() .expectBody(String.class).isEqualTo("Hello World"); } } ``` ### 使用`@DataJpaTest`注解 `@DataJpaTest`注解用于仅加载JPA相关的配置,适合测试数据库相关的功能。它不会启动Web服务器,但会配置数据源和JPA实体管理器。 ```java import org.junit.jupiter.api.Test; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager; @DataJpaTest public class MyDataJpaTest { @Autowired private TestEntityManager entityManager; @Autowired private MyRepository myRepository; @Test public void testFindById() { MyEntity entity = new MyEntity("Test"); entityManager.persist(entity); entityManager.flush(); MyEntity found = myRepository.findById(entity.getId()).orElse(null); assertNotNull(found); assertEquals("Test", found.getName()); } } ``` ### 使用`@WebMvcTest`注解 `@WebMvcTest`注解用于仅加载Web层的配置,适合测试控制器逻辑。它不会启动完整的应用上下文,而是仅加载与Web相关的部分。 ```java import org.junit.jupiter.api.Test; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.test.web.servlet.MockMvc; @WebMvcTest(MyController.class) public class MyWebMvcTest { @Autowired private MockMvc mockMvc; @Test public void testController() throws Exception { mockMvc.perform(get("/api/test")) .andExpect(status().isOk()) .andExpect(content().string("Hello World")); } } ``` ### 使用`@MockBean`和`@SpyBean` `@MockBean`和`@SpyBean`可以用来创建和注入模拟对象,以便在测试中控制某些依赖的行为。 ```java import org.junit.jupiter.api.Test; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest public class MyMockBeanTest { @MockBean private MyService myService; @Test public void testService() { when(myService.doSomething()).thenReturn("Mocked Result"); String result = myService.doSomething(); assertEquals("Mocked Result", result); } } ``` ### 使用`@DirtiesContext` `@DirtiesContext`注解用于标记测试类或方法,表示在测试完成后需要重新加载应用上下文。这对于测试修改了上下文状态的场景非常有用。 ```java import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.annotation.DirtiesContext; @SpringBootTest @DirtiesContext public class MyDirtiesContextTest { @Test public void testContextReload() { // 测试逻辑 } } ``` ### 总结 Spring Boot提供了多种注解和工具来编写集成测试用例,开发者可以根据具体的测试需求选择合适的方法。通过这些测试,可以确保应用程序的不同组件能够正确地协同工作[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值