导致ajax调用延迟的原因是什么?

What could be the cause of my ajax call being delayed?

本文关键字:是什么 ajax 调用 延迟 导致      更新时间:2023-09-26

我正在为一个网站提供通知服务。我希望能够实时接收通知,所以我使用Java asynresponse来实现这一点。我遇到了一个问题,在某些情况下,ajax调用的后端直到调用后20秒才运行。为了测试它,我启动了3个页面,然后尝试添加一个新的通知。如果等待的时间足够长,就不会有问题,但如果不等待,就不会更新每个页面,因为不是每个页面都在轮询。是我做错了什么导致了这个问题,还是我可以做些什么来确定是什么导致了这个问题?谢谢!

Java代码:

@Path("/demo0825/notifications")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class NotificationsResource {
@Singleton
@Startup
public static class Storage{
    public static ArrayList<AsyncResponse> arList = new ArrayList<>();
    private static final Object lock = new Object();
}
@GET
@Path("/poll")
public void pollNotifications(@Suspended AsyncResponse ar){
    Date dateobj = new Date();
    synchronized (Storage.lock) {
        Storage.arList.add(ar);
    }
}
@POST
public final Response addNotification(Notification pData) throws Exception {
    try (NotificationDataAccess dataAccess = new NotificationDataAccess()) {
        dataAccess.add(pData);
        synchronized (Storage.lock) {
            for (AsyncResponse ar : Storage.arList) {
                ar.resume(pData);
            }
            Storage.arList.clear();
        }
        return Response.ok().build();
    }
}

Javascript代码:

pollNotifications = function(){
    console.log("here");
    $.ajax({
        url: "/atrt_ent/rest/demo0825/notifications/poll",
        contentType: 'application/json',
        type: "GET",
        success: function(data){
            console.log(data);
            ...
            }
        },
        complete: function(){
            console.log("here");
            pollNotifications();
        }
    });
}
pollNotifications();

我使用chrome并显示时间戳,以便在ajax被调用时第一个console.log("here")日志,然后我可以看到java代码中带有调试语句的日期。我也在没有锁的情况下这样做了,并得到了相同的结果。

对象锁是一个static对象。因此,在pollNotifications中使用它会影响addNotificationarList ArrayList仅在synchronized块内使用。

我建议你使用Collections.synchronizedList而不是ArrayList本身。这应该没问题:public static List<AsyncResponse> arList = Collections.synchronizedList(new ArrayList<AsyncResponse>());

现在,您可以删除同步块和锁对象本身,因为JVM控制对象同步。