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

有没有一种方法可以根据请求的优先级,在java rest服务中一次只执行一个请求?

蓝飞
2023-03-14

我有一个带有RESTAPI的Java服务。从客户端一次可以发送多个请求,我希望通过API在服务器端一次实现一个请求。问题是我需要在服务器端对请求进行优先级排序。换句话说,如果一次发送10个请求,我需要使用优先级队列一次对所有10个请求设置优先级,并根据优先级选择一个请求。可以从同一个客户端或多个客户端发送请求。

@POST
@Path("/execute")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response execute(String body){
    /// 
    do_something();
}

private void do_something(){
    /// method body
}

现在,在上面的代码中,一次可以为一个请求执行这个do\u something()

有什么解决办法吗?我见过一些多线程解决方案,但它们都没有帮助,因为我的要求是为请求分配优先级。

共有1个答案

端木弘方
2023-03-14

那么使用异步REST API呢?

  • 当呼叫到达时,将正文和异步响应放在优先级队列中
  • 从队列中进行单后台线程轮询以执行do\u something
  • 完成“do\u something”后,完成响应

像这样:

private PriorityQueue<Pair<String, AsyncResponse>> queue = 
  new PriorityQueue(size, comparator);

@POST
@Path("/execute")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public void run(String body, @Suspended AsyncResponse response){
    /// 
    queue.offer(Pair.of(body, response));
}

private void do_something(){
    /// method body
}

// background thread...
{
   new Thread(() -> {
     while(true) {
       Pair<String, AsyncResponse> p = queue.poll();
       Response r = do_something(p.left());
       p.right().resume(r);
     }
   }).start();
}

比较器需要能够根据请求主体的优先级比较Pair对象。或者您可以创建自己的类来实现可比。

 类似资料:
  • 问题内容: 我刚刚开始使用nodejs。我想知道是否有一种方法只能在应用程序中“一次”请求文件。我正在使用一个类框架来在我的JS项目中获取经典的OOPS。每个“类”都包含在其自己的JS文件中。我想“要求”每个文件中的类框架,以便它们可以独立运行,但希望框架的初始化代码仅执行一次。 我可以使用一个标志来自己实现,但是内置的方法会很好。搜索“ require一次”使我想到所有与PHP有关的问题。 问题

  • 我正在写一个抛硬币程序。基本上,用户被问到他们想玩多少游戏。然后,while循环运行这个游戏,它要求用户输入几个由空格(头部或尾部ex.H.H.H.T.H)分隔的硬币掷出。然后,程序将用户输入字符串转换为数组,for循环遍历数组并检查heads(大写H),并将其存储在heads变量中。分数的计算方法是将数组中的个数乘以数组的长度,再乘以100得到一个百分比。如果得分为50%或以上,则该玩家获胜。如

  • 问题内容: 我有一个javascript函数,其中有两个$ .post请求。两个$ .post请求都应该执行。但是有时候,第二个$ .post请求却没有执行。这可能是什么原因? 问题答案: 是$ .ajax()结构的缩写形式。我通常更喜欢使用该结构,因为: 比较容易发现我是否错过了任何事情 我可以更轻松地添加其他参数,例如 当刚接触ajax时,我发现对这种结构进行故障排除要容易得多 在您的情况下,

  • 问题内容: 我有这个API: 但是in始终返回null。我可以将@GET更改为@POST,并且可以使用,但是我并没有真正执行创建或更新操作,因此使用post似乎很奇怪。 有没有办法通过球衣的GET请求获得身体? 问题答案: TL; DR 正确的解决方案是使用POST。 “我可以将@GET更改为@POST,并且可以,但是我并没有真正执行创建或更新操作,因此使用post似乎很奇怪” 为什么这么奇怪?P

  • 我有一个文档,它包含一个数组,如下所示。这是第一份文件。 我需要在聚合框架中用nestedData数组中的_id查找(连接)到另一个集合。

  • 问题内容: 我正在处理具有大量惰性数据加载的应用程序。我想根据“优先级”参数对HTTP请求进行优先级排序。 这就是使用它的概念。 我在考虑使用$ http拦截器。像这样: 但是我不能在这里退还诺言。有任何想法吗? 问题答案: 您可以通过使用的timeout属性来做到这一点,并使用和回调分别保存和执行每个请求。 脚步: 延迟地在回调过程中注入服务,这将是获得服务的唯一方法,因为在工厂函数中注入服务会