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

Spring集成

单于高逸
2023-03-14

我是spring集成和缓存新手,想知道如何将从出站网关接收到的对象添加到缓存中。无法确定所需的配置。

从以下配置,我从rest api收到的对象正在被记录:

INFO:com.domain.IpAddress@74589991

我计划使用ehcache/caffiene,任何提示都会有帮助。

<int:channel id="requestChannel"/>
<int:channel id="outboundChannel"/> 
<int:channel id="replyChannel"/>
<int:channel id="autoCompleteJsonResponseChannel"/>

<int:gateway id="restResponseService" default-request-channel="requestChannel" service-interface="com.domain.service.RestResponseService" />

<int-http:outbound-gateway id="out" request-channel="requestChannel"
    http-method="GET"
    url="https://api.ipify.org/?format=json"
    expected-response-type="java.lang.String"   
reply-channel="autoCompleteJsonResponseChannel"
/>

<int:json-to-object-transformer
input-channel="autoCompleteJsonResponseChannel"
type="com.domain.IpAddress"
output-channel="outboundChannel" /> 

<int:logging-channel-adapter id="outboundChannel" level="INFO"/>

编辑2:

现在,我按照建议更改了出站网关:

<int-http:outbound-gateway id="out" request-channel="requestChannel"
    http-method="GET"
    url="https://api.ipify.org/?format=json"
    expected-response-type="java.lang.String"
    reply-channel="autoCompleteJsonResponseChannel">
    <int-http:request-handler-advice-chain>
       <cache:advice>
           <cache:caching cache="myCache">
               <cache:cacheable method="getCurrentIpAddress" />
           </cache:caching>
       </cache:advice>
    </int-http:request-handler-advice-chain>
</int-http:outbound-gateway>

并将ehache配置定义如下:

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager" >
        <property name="cacheManager" ref="ehcache" />
    </bean>
    <!-- Ehcache library setup -->
    <bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" >
        <property name="configLocation" value="classpath:ehcache.xml" />
        <property name="shared" value="true"/>      
    </bean>

在我的服务类中,定义了可缓存的方法:

package com.domain.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import com.domain.IpAddress;
import com.domain.RestResponse;

@Service("restResponseService")
public class RestResponseServiceImpl implements RestResponseService{

    @Autowired
    private IpAddress ipAddress;
    @Cacheable("myCache")
    public IpAddress getCurrentIpAddress(String name) {
        // TODO Auto-generated method stub
        return ipAddress;
    }

    @CacheEvict(value = "myCache", allEntries = true)
    public void refreshAllResults() {
        // TODO Auto-generated method stub

    }
}

但缓存仍然不起作用。我错过了什么。

共有1个答案

阮鸿煊
2023-03-14

您可以在网关中执行以下操作:

<int-http:outbound-gateway>
    <int-http:request-handler-advice-chain>
            <cache:advice>
                <cache:caching cache="foo">
                    <cache:cacheable method="handle*Message" key="#a0.payload"/>
                </cache:caching>
            </cache:advice>
    </int-http:request-handler-advice-chain>
</int-http:outbound-gateway>

换句话说,因为Spring中的缓存完全基于AOP,所以要弄清楚请求-处理程序-建议-链可以使用任何建议实现并不复杂。在这种情况下,我们制作

 类似资料:
  • Spring提供了特殊的类DelegatingVariableResolver,以无缝方式将JSF和Spring集成在一起。 在JSF中集成Spring依赖注入(IOC)功能需要以下步骤。 第1步:添加DelegatingVariableResolver 在faces-config.xml中添加一个variable-resolver条目,指向spring类DelegatingVariableRes

  • 我创建了一个新示例,并将代码分为客户端和服务器端。 完整的代码可以在这里找到。 服务器端有3个版本。 服务器无Spring Boot应用程序,使用Spring Integration RSocket InboundGateway 服务器引导重用Spring RSocket autconfiguration,并通过serverrsocketmessagehandler创建ServerRSocketC

  • 问题内容: 我想使用Spring Batch和Spring Integration从数据库导入数据,并将它们写入文件,然后通过ftp将其传输到远程服务器。 但是我想我的问题是我不想为我的表创建域对象。我的查询是随机的,我想要一些可以读取数据并将其写入文件并进行传输的东西。 是否可以在不创建各自的域对象的情况下使用Spring Batch和Integration? 问题答案: 绝对。您可以将JDBC

  • 主要内容:AspectJ Jar 包下载我们知道,Spring AOP 是一个简化版的 AOP 实现,并没有提供完整版的 AOP 功能。通常情况下,Spring AOP 是能够满足我们日常开发过程中的大多数场景的,但在某些情况下,我们可能需要使用 Spring AOP 范围外的某些 AOP 功能。 例如 Spring AOP 仅支持执行公共(public)非静态方法的调用作为连接点,如果我们需要向受保护的(protected)或私有的(

  • 我正在尝试从JMS队列(使用ActiveMQ)读取消息。我面临的问题是,消息正在从队列中读取,但没有显示在“服务激活器”中。 非常感谢您的帮助。 我的代码如下: (1) Spring配置 (2) 服务激活器MDP: (3) 申请开始课程: 谢谢

  • 我无法解决这个问题,现在已经坚持了很长时间。我是一个spring-integration-dsl的初学者,任何帮助都将非常感谢。