Rag*_*eer 4 spring spring-boot
尝试设置一个简单的Web应用程序调度程序.所以这是我的配置:
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework</groupId>
<artifactId>scheduler</artifactId>
<version>0.1.0</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>1.1.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>1.1.7.RELEASE</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.enterprise</groupId>
<artifactId>cdi-api</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<properties>
<start-class>hello.Application</start-class>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>hello.Application</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-releases</id>
<name>Spring Releases</name>
<url>http://repo.spring.io/libs-release</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-releases</id>
<name>Spring Releases</name>
<url>http://repo.spring.io/libs-release</url>
</pluginRepository>
</pluginRepositories>
</project>
Run Code Online (Sandbox Code Playgroud)
我的课程如下所示
@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application implements WebApplicationInitializer {
public static void main(String[] args) throws Exception {
SpringApplication.run(ScheduledTasks.class);
}
public void onStartup(ServletContext arg0) throws ServletException {
SpringApplication.run(ScheduledTasks.class);
}
@Bean
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
factory.setPort(8081);
factory.setSessionTimeout(50, TimeUnit.MINUTES);
return factory;
}
}
@EnableScheduling
public class ScheduledTasks {
@Scheduled(fixedRate = 500)
public void reportCurrentTime() {
System.out.println("Testing successful ");
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试启动容器时,我看到了异常
ERROR 2592 --- [ost-startStop-1] o.s.boot.SpringApplication : Application startup failed
...
...
Caused by: org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.getEmbeddedServletContainerFactory(EmbeddedWebApplicationContext.java:174)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:147)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:121)
... 20 more
Run Code Online (Sandbox Code Playgroud)
我试图遵循Spring Boot Testing:由于缺少EmbeddedServletContainerFactory bean而无法启动EmbeddedWebApplicationContext但是徒劳无功.
请提出,谢谢
你只是在运行ScheduledTasks:
SpringApplication.run(ScheduledTasks.class);
Run Code Online (Sandbox Code Playgroud)
什么时候应该运行:
SpringApplication.run(Application.class);
Run Code Online (Sandbox Code Playgroud)
运行ScheduledTasks意味着Spring Boot不知道配置Application.至关重要的是,它意味着它没有看到@EnableAutoConfiguration哪个是自动配置的开关,并且因为您在类路径上有Tomcat,所以创建了嵌入式Tomcat实例.
我会通过移动解决这个问题@EnableScheduling,从注释ScheduledTasks到Application,运行Application.class而不是ScheduledTasks.class,并标注ScheduledTasks有@Component:
Application.class:
@Configuration
@EnableAutoConfiguration
@ComponentScan
@EnableScheduling
public class Application implements WebApplicationInitializer {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class);
}
// …
}
Run Code Online (Sandbox Code Playgroud)
ScheduledTasks.class:
@Component
public class ScheduledTasks {
@Scheduled(fixedRate = 500)
public void reportCurrentTime() {
System.out.println("Testing successful ");
}
}
Run Code Online (Sandbox Code Playgroud)
移动@EnableScheduling意味着它在配置类上,它所属的位置.运行Application.class意味着Spring Boot可以看到其所有配置,包括启用组件扫描和启用自动配置.注释ScheduledTasks与@Component装置,它的由组件扫描发现及其@Scheduled检测方法.
这应该可以解决问题.我也会纠正你的pom,这样你就不会使用Spring Boot的混合版本(你现在有1.1.6和1.1.7)并摆脱你的EmbeddedServletContainerFactorybean,转而配置端口和会话超时使用application.propertiesin src/main/resources:
application.properties:
server.port = 8081
server.session-timeout = 3000
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
33683 次 |
| 最近记录: |