【问题标题】:Spring HttpInvoker: how to replace serviceUrl at runtime?Spring HttpInvoker:如何在运行时替换 serviceUrl?
【发布时间】:2012-04-17 04:28:34
【问题描述】:

这个问题已经讨论了几次,但我无法找到解决我们问题的解决方案。 我们有以下 HttpInvoker 服务,它从数据库中获取远程 URL:

@Service("exampleService")
public class ExampleHttpInvoker extends HttpInvokerProxyFactoryBean {

    @Resource
    private DBService service;

    @PostConstruct
    public void init() throws ConfigurationException {

       String url = service.getURL();
       this.setServiceUrl(url);
       this.setServiceInterface(RemoteInterface.class);
       this.setHttpInvokerRequestExecutor(new CommonsHttpInvokerRequestExecutor());
            afterPropertiesSet();

     } 

   }

可以在远程调用之间更改 URL。
如何在运行时替换 serviceUrl?
我们不能使用 Session 或 Request 范围,因为该服务不支持 Web。
任何帮助将不胜感激。

最好的问候, 迈克尔

【问题讨论】:

    标签: java spring remoting


    【解决方案1】:

    我并不完全清楚如何根据您的 http 请求获得正确的 DBService,所以我想您知道如何做到这一点。因此,您可以执行以下操作:

    1. 编写一个过滤器,获取正确的DBService 并将其置于 TLS 上。
    2. ExampleHttpInvoker 上的DBService 替换为DBServiceWrapper(您的类),该DBServiceWrapper 从TLS 获取正确的DBService 并调用正确的方法。
    3. 一旦请求完成,不要忘记清除过滤器中的 TLS。

    【讨论】:

    • 我的澄清:如果我能够在每次远程调用之前或在数据库修改时创建 ExampleHttpInvoker,我将能够解决我的问题。在 Spring 中可以使用 @Scope(“request”) 或 @Scope(“session”),但这些选项仅在 Web 感知 Spring ApplicationContext 的上下文中有效。我正在寻找一种方法来重新创建我的 ExampleHttpInvoker 单例。即使我会使用 TLS,我也不明白如何在 TLS 中修改 URL 后重新创建 ExampleHttpInvoker。
    • 恐怕如果你的对象是单例的,你不应该重新创建它。你的设计有问题。但是,您可以使用 spring 创建自定义范围。也许这是适合您的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 2019-03-25
    • 1970-01-01
    • 2017-11-28
    • 2020-02-21
    相关资源
    最近更新 更多