【问题标题】:Need Jersey2 technique to enable or disable services during runtime需要 Jersey2 技术在运行时启用或禁用服务
【发布时间】:2017-04-26 03:01:29
【问题描述】:

我正在寻找一种在运行时(例如,通过属性文件或部署描述符)配置我的基于 Jersey 的应用程序中的哪些服务可用的方法,即,以便管理员可以启用或禁用服务容器级别。

我们的应用目前公开了 15 个不同的端点。它有 1 个用 @ApplicationPath 注释的应用程序和 3 个用 @Path 注释的类,在这 3 个类中有 15 种不同的方法,用通常的 @Path/@/@Produces 注释。 我的应用程序有几种不同的技术来读取其运行时配置,例如设置连接到数据库资源,查看属性文件的更改等。我想要做的是添加一些配置值,以便管理员可以在 Jersey 级别启用/禁用 3 个类或这些类中的任何单个端点。有人可以建议最好的方法吗? 更进一步,我们希望在运行时控制此配置,因此如果配置发生更改,我们可以更新球衣配置以启用/禁用更改的服务,而无需重新启动我们的容器(在本例中为 Tomcat)。 任何建议不胜感激!谢谢!

【问题讨论】:

    标签: java jersey jax-rs


    【解决方案1】:

    我不知道这是否可以在 Jersey 本地实现,但我能想到的一件事是只使用 Jersey 预匹配过滤器来确定端点是否被禁用。您可以使用也可以充当侦听器的服务并相应地更新禁用的端点。如果端点被禁用,则返回 404。

    @Provider
    @PreMatching
    public class DisabledEndpointsFilter implements ContainerRequestFilter {
    
        @Inject
        private ConfigurationService configuration;
    
    
        @Override
        public void filter(ContainerRequestContext request) throws IOException {
            final List<String> disabledEndpoints = this.configuration.getDisabledEndpoints();
            final String path = stripLeadingSlash(request.getUriInfo().getPath());
    
            for (String endpoint: disabledEndpoints) {
                endpoint = stripLeadingSlash(endpoint);
                if (path.startsWith(endpoint)) {
                    request.abortWith(Response.status(404).build());
                    return;
                }
            }
        }
    }
    

    我正在玩这个,并建立了一个有效的 POC。您可以查看Github Repo

    【讨论】:

    • 我喜欢这样!它很简单,不是黑客。我还没有探索过泽西的这个功能,谢谢你的帮助!
    【解决方案2】:

    我建议为此使用 apache camel。使用 camel,您可以控制 http 请求,并结合嵌入式码头服务器作为代理。

    http://camel.apache.org/jetty.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-08
      相关资源
      最近更新 更多