我是构建web服务的新手,我开始使用spring boot构建web服务。我创建了以下controller类
package controller;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import model.Time;
import service.FeedService;
@RestController
public class FeedController extends ScheduledThreadPoolExecutor{
public FeedController(int corePoolSize) {
super(corePoolSize);
// TODO Auto-generated constructor stub
}
int difference;
int a;
boolean schedule;
//static as the variable is accessed across multiple threads
@Autowired
static FeedService fs;
@RequestMapping(value="/test")
public String test(){
return "test";
}
@RequestMapping(value = "/schedule", method = RequestMethod.GET)
public int ScheduleFeed(@RequestParam(value = "difference",required = false) String y) throws InterruptedException, ExecutionException{
// if(y != null){
// difference = Integer.parseInt(y);
difference = 0;
NewScheduledThreadPoolTest.mymethod(difference);
return difference;
// }else{
// return -1;
// }
}
@RequestMapping(value = "/inquireSchedule", method = RequestMethod.GET)
public ResponseEntity<Time> RequestFeed(){
if(schedule == true){
schedule = fs.setFalse();
return new ResponseEntity<Time>(HttpStatus.OK);
}
return new ResponseEntity<Time>(HttpStatus.BAD_REQUEST);
}
//schedule the task to happen after a certain number of times
static class NewScheduledThreadPoolTest {
public static void mymethod(int difference, final String... args) throws InterruptedException, ExecutionException {
// creates thread pool with 1 thread
System.out.println("hello world");
final ScheduledExecutorService schExService = Executors.newScheduledThreadPool(2);
// Object creation of runnable thread.
final Runnable ob = new NewScheduledThreadPoolTest().new myclass();
// Thread scheduling ie run it after "difference" hours before and then after every 24 hours later on
schExService.scheduleWithFixedDelay(ob, difference, 24, TimeUnit.SECONDS);
// waits for termination for 30 seconds only
schExService.awaitTermination(30, TimeUnit.SECONDS);
// shutdown now.
schExService.shutdownNow();
System.out.println("Shutdown Complete");
}
class myclass implements Runnable{
@Override
public void run() {
try{
// the mechanism to give a positive feedback to the arduino service
fs.setTrue();
System.out.println("hello world");
}catch(Exception e){
System.out.println("task failed");
e.printStackTrace();
}
}}
}
}
尝试运行我的web服务会导致它抛出以下异常:
但是,如果我移除“ScheduledThreadPoolExecutor”和构造函数,它运行良好。谁能解释一下扩展课程有什么问题吗?
注:
1)扩展类是在下面提到的文章中建议的,作为我最初问题的解决方案。最初,我的runnable在没有任何类型的通知或错误消息的情况下无法运行
http://code.nomad-labs.com/2011/12/09/mother-FK-the-scheduledexecutorservice/
不要使bean成员为静态的。它们是从多个线程引用的这一事实是不相关的;Spring的工作是确保填充了依赖项。
此外,与现场注入相比,优选施工注入;这使得这类问题的可能性大大降低。
现在我想测试我的扩展是否按预期工作。 如何编写测试来验证执行第二个方法的尝试是否会引发带有特定消息的RuntimeException?
我有一个使用、和运行的项目,使用这个版本我的测试很好,100%通过。 但现在我要迁移到,因为它与Browserstack完全集成,Behat2不支持Browserstack标志,而且集成性很差。 我已经更改了composer文件并更新了project,但当我运行测试时,它在上返回了一个异常。 查看页面对象文档,我没有看到任何关于setPageObjectFatory的内容,这是不需要的。在conf
我正在做一个项目,该项目将有许多JavaFX应用程序,这些应用程序具有相似但又足够不同的功能,因此我创建了一个抽象基类来扩展Application以处理常见的功能并指示它们需要做什么,还创建了一系列具体的类来扩展这些功能。然而,当我试图跑的时候,我得到 应用程序构造函数java.lang.Reflect.InvocationTargetException位于java.base/jdk.intern
我目前正在尝试用JDA编写一个非常基本的Discord bot,在试图将代码整齐地分为一个Main类、、和类时,我遇到了一个问题。 如果接收到事件,主类将添加EventListener来调用MessageHandler,然后如果在命令之前看到bot前缀,则分支到CommandHandler。 问题是,当它试图用调用CommandHandler时,会抛出一个NullPointerException。
我正在使用Spring In Action 3 Action学习Spring MVC,我已经实现了显示用户注册表的基本程序,一旦我们提交表单,它将使用进行验证。 这是我的Spring控制器: 这是我的Spitter类文件: 这是我的编辑。显示给用户注册的jsp文件: 要加载表单,我将访问URL为:,一旦表单被加载,我只需提交表单而无需输入任何详细信息,以便我可以检查我的表单是否得到验证。但是我得到
阅读《入门指南》和《概述》后,可以将该指南用作扩展组件和功能的概述。鼓励开发人员探索和扩展功能。 自定义扩展用户界面 Browser Actions 将图标,工具提示,徽章和弹出窗口添加到工具栏。 Commands 添加触发操作的键盘快捷键。 Context Menus 将 item 添加到 Google Chrome的上下文菜单。 Omnibox 将关键字功能添加到地址栏。 Override P