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