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

向Jersey资源提供lambda上下文

胡桐
2023-03-14

我正在使用aws无服务器java容器将Jersey服务包装到aws Lambda中。我决定使用函数别名进行“测试”和“生产”阶段,最终指向lambda函数的不同版本。

我需要在中选择一些属性。基于该别名的属性文件,基本上是因为我需要与“test”或“prod”DB对话,或者使用不同的endpoint来调用外部web服务。

为此,我需要调用Context对象的方法getInvokedFunctionArn。不幸的是,泽西岛资源默认不知道这样的上下文。

下面是示例资源:

@Path("/pet")
public class PetResource {

    @POST
    @Path("/")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.WILDCARD)
    public Response createPet() {
        // how to call getInvokedFunctionArn from Lambda context object?
        return Response.status(200).entity("{'result': 'success'}").build();
    }
}

如何使Jersey资源能够调用ARN?我可以注射吗?

lambda处理程序定义为:

public class PetLambdaHandler implements RequestStreamHandler {

    private static final ResourceConfig jerseyApplication = new ResourceConfig().register(PetResource.class)
            .register(JacksonFeature.class);

    private static final JerseyLambdaContainerHandler<AwsProxyRequest, AwsProxyResponse> handler = JerseyLambdaContainerHandler
            .getAwsProxyHandler(jerseyApplication);

    @Override
    public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
        handler.proxyStream(inputStream, outputStream, context);
    }
}

共有2个答案

袁弘方
2023-03-14

您可以使用Spring配置文件将上下文注入到泽西资源

为测试和产品配置文件定义不同的方法/对象

如果没有Spring,可以检查jersey集成

Jersey-spring4模块将充当Spring和泽西的集成桥梁。

请参阅github aws serverless java容器库中的完整示例,该容器库使用aws Lambda中的概要文件运行Spring应用程序

有两种方法可以激活Spring配置文件(由@Profile注释定义)。我们建议使用接收配置文件列表的静态初始化程序。无服务器Java容器框架负责设置配置文件并立即初始化应用程序。

public class StreamLambdaHandler implements RequestStreamHandler {
    private static SpringLambdaContainerHandler<AwsProxyRequest, AwsProxyResponse> handler;
    static {
        try {
            AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext();
            applicationContext.register(PetStoreSpringAppConfig.class);
            handler = SpringLambdaContainerHandler.getAwsProxyHandler(applicationContext, "profile-1", "profile-2");
童化
2023-03-14

您不能自动注入Lambda上下文。但是,您可以从ContainerRequest estContext对象中检索它。serverless-java-容器框架将其添加为请求属性。

您可能可以这样做(尚未测试代码):

@GET
public String testLambdaContext(@Context ContainerRequestContext containerRequest) {
   Context lambdaContext =
       (Context) containerRequest.getProperty(RequestReader.LAMBDA_CONTEXT_PROPERTY);
   return lambdaContext.getInvokedFunctionArn()
}
 类似资料:
  • 问题内容: 在Web应用程序中,我需要提供位于应用程序上下文目录外部的静态内容(图像)。整个应用程序体系结构要求我使用Tomcat来执行此操作。我以为可以从Spring的应用程序URL和目录内容之间配置映射而受益。但是AFAIK的属性仅处理上下文相关或类路径映射。因此,我想使用的是: 不起作用。因为我宁愿避免编写简单的文件传输servlet,所以如果有人可以给我一些有关基于Spring的现有解决方

  • 我想实现一个Liferay Portlet,它从一个单独的服务器下载一个~1GB的文件,并将其提供给点击链接的网站访问者。 文件必须以内存高效的方式传输(因此无需将所有内容加载到内存中),用户应在单击后不久看到下载进度(因此无需将所有内容存储到本地磁盘)。 我必须使用WebClient,因为它似乎是Liferay 7中进行Web请求的标准(将不建议使用RestTem板)。 我开始写这样的东西,灵感

  • DaoCloud 提供免费资源吗? DaoCloud 为用户提供免费的云端测试环境 部署在云平台上的应用为什么会停? 您好,DaoCloud 云端运行时资源是我们提供给用户用以开发、测试场景的云端免费资源,系统会根据资源使用情况智能回收,您可以参考具体资源回收规则:http://docs.daocloud.io/app-deploy-mgmt/cloud-limited-resources 。 若

  • 我试图提供一个静态资源(css文件)。 我已经注册了位置和处理程序 所以Tomcat的记录器显示到资源的正确映射 将URL路径[/resources/**]映射到类型为[类org.springframework.web.servlet.resource.ResourceHttpRequestHandler]的处理程序上 当浏览器呈现视图时,检查器显示404错误,试图获取静态资源。 应用初始化器。J

  • 目前,如果我们想在kubernetes中使用水平Pod自动缩放,我们需要为我们要执行的服务指定以下内容: 我有一些服务都可以使用HPA进行扩展。 我们是否可以过度提供这些服务?与这些服务一样,资源添加超出了VM可用的总资源。 考虑这样一种情况:假设POD的请求在总可用CPU范围内,但超出限制 例如: 总可用CPU为1000m核,2个吊舱,每个吊舱请求500m核,每个吊舱限制1000m核。 首先,如

  • 问题内容: 我已经编写了自己的扫描器来浏览我的JAX-RS资源,并使用来打印出方法名称和路径。问题是,当我将相同的代码迁移到2.16(将包名称从更改为)时,它将无法正常工作。 深入研究发现,这些必修课程不再公开。有人知道原因吗?以及如何将下面的代码从1.x迁移到2.x?实际上,没有有关此迁移的文档。 所有帮助表示赞赏!下面是带有1.x的代码 问题答案: 可以在包中找到适用于Jersey 2.x的新