Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 查找线程安全spring控制器中队列上的请求数_Java_Spring Mvc - Fatal编程技术网

Java 查找线程安全spring控制器中队列上的请求数

Java 查找线程安全spring控制器中队列上的请求数,java,spring-mvc,Java,Spring Mvc,我使用的是一个spring控制器,它从threadsafe方法返回一个字符串。 因此,我已经使控制器也线程安全。 我想知道队列中同时有多少个请求正在调用spring控制器您可以使用Jetty的StatisticsHandler和JMX获得有关活动请求数量的信息 如果您将Jetty用作嵌入式容器(推荐的方法),则可以使用EmbeddedServletContainerCustomizer进行设置: @Bean public EmbeddedServletContainerCustomizer co

我使用的是一个spring控制器,它从threadsafe方法返回一个字符串。 因此,我已经使控制器也线程安全。
我想知道队列中同时有多少个请求正在调用spring控制器

您可以使用Jetty的StatisticsHandler和JMX获得有关活动请求数量的信息

如果您将Jetty用作嵌入式容器(推荐的方法),则可以使用EmbeddedServletContainerCustomizer进行设置:

@Bean
public EmbeddedServletContainerCustomizer containerCustomizer() {
return new EmbeddedServletContainerCustomizer() {

    @Override
    public void customize(ConfigurableEmbeddedServletContainer container) {
        ((JettyEmbeddedServletContainerFactory) container)
                .addServerCustomizers(new JettyServerCustomizer() {

            @Override
            public void customize(Server server) {
                MBeanContainer mbContainer = new MBeanContainer(
                        ManagementFactory.getPlatformMBeanServer());
                server.addEventListener(mbContainer);
                server.addBean(mbContainer);

                StatisticsHandler statisticsHandler = new   StatisticsHandler();
                statisticsHandler.setHandler(server.getHandler());
                server.setHandler(statisticsHandler);
            }
        });
    }

    };
    }
您需要在org.eclipse.jetty:jetty jmx上添加一个依赖项来访问MBeanContainer

  • 您可以尝试使用弹簧启动执行器。在端点/指标上,您应该有字段“httpsessions.active”

  • 公共类RequesInterceptor扩展HandlerInterceptor适配器{ 私有静态对象锁=新对象(); 私有静态整数计数=0

    @凌驾 公共布尔预处理(HttpServletRequest请求、HttpServletResponse响应、对象处理程序)抛出ServletException{ 同步化(锁定){ 计数++; } }

    }


  • 这是我的建议,你可以如何解决你的问题

    假设您有一个
    @控制器

    @Controller
    public class MyController {
    
        @Autowired
        private IMyService service;
    
        @RequestMapping(value = "/myPathName", method = RequestMethod.GET)
        public String home(HttpServletRequest request, Model model) {
    
            // you synchronized call
            service.callSynchronized(request, model); 
    
            return "someJsp";
        }
    
        // +edit
        @ResponseBody
        @RequestMapping(value = "/queueStatus", method = RequestMethod.GET)
        public String home(HttpServletRequest request) {
    
            // 
            return "inQueue: " + request.getAttribute("inQueue");
        }
    }
    
    现在,您可以定义一个
    拦截器
    ,并统计执行前后的请求数:

    public class RequestsInWorkInterceptor extends HandlerInterceptorAdapter {
    
        private static final Logger _logger  = LoggerFactory.getLogger(RequestsInWorkInterceptor.class);
        private final AtomicLong counter     = new AtomicLong();
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            String methodURI = request.getRequestURI();
            long current;
            if("myPathName".equals(methodURI){
                current = counter.incrementAndGet();
                _logger.debug("current {} clients in a queue", current);
            } else {
                current = counter.get(); // just get, no increment
            }
    
            // +edit: put the count in the request so you can get it in you controller
            request.setAttribute("inQueue", current);
            return super.preHandle(request, response, handler);
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            String methodURI = request.getRequestURI();
            if("myPathName".equals(methodURI){
                counter.decrementAndGet();
            }
            super.postHandle(request, response, handler, modelAndView);
        }
    }
    

    当您说“使控制器也具有线程安全性”时,您是什么意思?你是说你刚刚把所有的方法都同步了?这是个很糟糕的主意。@Abhilash没问题;)您能否建议任何外部方法来查找队列中的请求编号,比如不使用拦截器,或者使用外部方法来检查队列中的请求数。@Abhilash你到底是什么意思?比如一些外部方法,只用于检查controllerthnks@dit中队列中的请求数