Java 从客户端动态热交换服务器运行时行为
假设我已经将日志服务部署到某个(符合jaxrs的)容器中Java 从客户端动态热交换服务器运行时行为,java,dynamic,client-server,hotswap,Java,Dynamic,Client Server,Hotswap,假设我已经将日志服务部署到某个(符合jaxrs的)容器中 @Path("/logger") public class LogService { @GET @Path("/log") public Response log(final String @QueryParam("msg") msg) { System.out.println(msg); // ... } } 如果我向承载此服务的容器发出以下请求,我希望看到消息输出到容器的stdout日志: G
@Path("/logger")
public class LogService
{
@GET
@Path("/log")
public Response log(final String @QueryParam("msg") msg)
{
System.out.println(msg);
// ...
}
}
如果我向承载此服务的容器发出以下请求,我希望看到消息输出到容器的stdout日志:
GET <host>:<port>/logger/log?msg=foo
服务被重新定义为使用此接口的实现:
public interface LoggerApi
{
void logMessage(final String msg);
}
@Path("/logger")
public class LogService
{
public static LoggerApi LOGGER = new LoggerApi()
{
void logMessage(final String msg)
{
System.out.println(msg);
}
}
@GET
@Path("/log")
public Response log(final String @QueryParam("msg") msg)
{
LOGGER.logMessage(msg);
// ...
}
}
因此,问题变成了,如何将logger的实现与服务器外部的某个客户机定义的新实现进行热交换
我的第一直觉是RMI和/或动态代理可以让我达到我想要的位置,但我不太确定安全策略的疯狂程度
基本上,我想要的是能够做到以下几点:
@Path("/config")
public class ConfigService
{
@POST
@Path("/loggerApi")
public Response setLoggerApi(final LoggerApi clientSuppliedLogger)
{
LogService.LOGGER = clientSuppliedLogger;
// ...
}
}
想法
(哦,我知道这会带来严重的安全风险,这种模式永远不应该在生产环境中使用。我的兴趣是设计一个模拟服务,其中服务的行为和副作用可以通过调用模拟服务的集成测试来定义)