如何为基于Spring的@Scheduled cron作业配置时区?
背景:
我有一份工作,每天执行一次,比如说下午2点,使用Spring的@Scheduled
注释:
@Scheduled(cron = "0 0 14 * * *")
public void execute() {
// do scheduled job
}
Run Code Online (Sandbox Code Playgroud)
问题是不同服务器之间的下午2点不同,因为Spring在TimeZone.getDefault()
内部使用.而且,JavaDoc的TimeZone.getDefault()
状态表明:
获取此主机的默认TimeZone.默认TimeZone的来源可能因实施而异.
换句话说,不确定时区.它可能取决于JVM实现,服务器时区配置,服务器位置和/或其他未知因素.因此,cron作业在不同服务器上的不同时间触发,除非有办法明确设置应该使用哪个时区?
我使用的是Spring 3.2.2.
更新
截至春季4,Spring Jira问题SPR-10456已经解决.因此,@Scheduled
注释具有新的区域属性,正是出于此目的.
当服务器返回202 - Accepted
异步请求的状态代码时,为请求完成提供估计的适当方法是什么?
从HTTP规范(我添加的斜体):
202接受
该请求已被接受处理,但处理尚未完成.[...]
返回此响应的实体应该包括请求的当前状态的指示,以及指向状态监视器的指针或用户可以期望满足请求的某些估计.
以下是一些想法:
Cache-Control
吗?X-
响应标头,但X-
在RFC 6648中不推荐使用标头?X-
)特定响应标头?如果是这样,它应该如何命名?SO问题自定义HTTP标头:命名约定给出了一些想法,但在弃用之后它只回答了如何格式化HTTP标头,而不是如何命名它们.什么是正确的摇篮配置看起来像在使用该插件摇篮多模块项目spring-boot-dependencies
和spring-boot
?
我有以下项目设置:
parent
|
+ build.gradle
|
+ alpha
| |
| + build.gradle
|
+ beta
| |
| + build.gradle
Run Code Online (Sandbox Code Playgroud)
parent
模块包含常见的项目配置.alpha
模块是一个模块,我想在其中使用spring-boot-dependencies bom中指定的版本号导入依赖项,但结果是标准jar.beta
模块是一个依赖的模块,alpha
结果是一个可执行的Spring Boot jar文件(包括所有依赖项).因此,该项目既需要插件spring-boot-dependencies
也需要spring-boot
插件.为了保持Gradle文件DRY,我已经将常用模块脚本提取到父build.gradle
文件中.
尝试$ gradle build
使用下面的项目配置执行会导致:
> Plugin with id 'io.spring.dependency-management' not found.
Run Code Online (Sandbox Code Playgroud)
parent gradle.build
allprojects {
group = "com.example"
version '0.0.1-SNAPSHOT'
ext {
dependencyManagementPluginVersion = '0.5.3.RELEASE'
springBootVersion = '1.3.0.RC1'
}
apply plugin: …
Run Code Online (Sandbox Code Playgroud) dependency-management gradle spring-boot spring-boot-gradle-plugin
我有一个看起来很奇怪的问题.我有以下设置:
界面:
package com.example;
public interface SomeDependency {
}
Run Code Online (Sandbox Code Playgroud)
弹簧组件:
package com.example;
@Component
public class SomeClass {
}
Run Code Online (Sandbox Code Playgroud)
带有由EasyMock生成的模拟bean的spring test配置:
<beans ....>
<context:component-scan base-package="com.example"/>
<bean id="someInterfaceMock" class="org.easymock.EasyMock" factory-method="createMock">
<constructor-arg value="com.example.SomeDependency" />
</bean>
</beans>
Run Code Online (Sandbox Code Playgroud)
并进行单元测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/testconfig.xml")
public class SomeClassTest {
@Autowired
SomeClass someClass;
@Autowired
SomeDependency someDependency;
@Test
public void testSomeClass() throws Exception {
assertNotNull(someClass);
}
@Test
public void testSomeDependency() throws Exception {
assertNotNull(someDependency);
}
}
Run Code Online (Sandbox Code Playgroud)
项目编译并且测试通过没有任何问题,即SomeClass("真实"对象)和SomeDependency(由EasyMock生成的模拟对象)的自动装配成功.
但是,如果我将SomeClass的实现更改为:
@Component
public class SomeClass { …
Run Code Online (Sandbox Code Playgroud) 如果使用特定子目录中的文件更改,我如何才能将Jenkins管道项目的范围限制为仅构建Jenkinsfile
?
我有一个包含两个目录的Git存储库.每个目录都包含一个单独的子项目,我想用Jenkins分别构建每个子项目Jenkinsfile
.该项目具有以下文件结构:
parent
|
+- subA
| |
| + Jenkinsfile
| + more files related to sub project A
|
+- subB
|
+ Jenkinsfile
+ more files related to sub project B
Run Code Online (Sandbox Code Playgroud)
在Jenkinsfile
对subA
具有以下配置:
checkout scm: [
$class: 'GitSCM',
branches: [[name: '*/master']],
userRemoteConfigs: [[url: 'https://[path]/parent.git']],
extensions: [[
$class: 'PathRestriction', includedRegions: 'subA/.*'
]]
]
Run Code Online (Sandbox Code Playgroud)
该Jenkinsfile
为subB
相似,唯一的区别是,它已指定subB
为includedRegions
.
在Jenkins服务器中,我创建了两个管道项目并Jenkinsfile
分别指向它们.如果在文件夹中更改了文件subA
,则会触发Jenkins管道项目A,如果在文件夹中更改了文件subB
,则会触发Jenkins管道项目B,这是我所期望的.
问题是如果文件被更改,也会触发Jenkins管道项目A subB …
如果Spring Boot Web应用程序中发生异常,如何自定义响应状态代码和响应正文中的数据?
我创建了一个Web应用程序,如果由于某些错误的内部状态而发生意外情况,则会引发自定义异常.因此,触发错误的请求的响应主体看起来像:
HTTP/1.1 500 Internal Server Error
{
"timestamp": 1412685688268,
"status": 500,
"error": "Internal Server Error",
"exception": "com.example.CustomException",
"message": null,
"path": "/example"
}
Run Code Online (Sandbox Code Playgroud)
现在,我想更改状态代码并在响应正文中设置字段.在我脑海中浮现的一个解决方案是:
@ControllerAdvice
class CustomResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
ErrorMessage handleBadCredentials(CustomException e) {
return new ErrorMessage("Bad things happened");
}
}
@XmlRootElement
public class ErrorMessage(
private String error;
public ErrorMessage() {
}
public ErrorMessage(String error) {
this.error = error;
}
public String getError() {
return error;
}
public void setError(String error) {
this.error = error; …
Run Code Online (Sandbox Code Playgroud) 当元素在使用jQuery时已经消失时,是否有可能获得某种事件通知?即如果有'fadeInEvent',我会尝试类似的东西
$('elements').delegate('selector', 'fadeInEvent', function() {
alert('someId has faded in');
});
Run Code Online (Sandbox Code Playgroud)
我知道jQuery.fadeIn()有一个回调函数,例如
$('#someId').fadeIn('fast', function() {
alert('callback when someId has faded in');
});
Run Code Online (Sandbox Code Playgroud)
但如果可能的话,我宁愿使用事件解决方案.我也使用了一些原型:visible
,但它true
在淡入完成之前返回.
我有一个错误消息类:
@XmlRootElement
public class ErrorMessage {
private String message;
public ErrorMessage() {
}
public ErrorMessage(String message) {
this.message = message;
}
public String getError() {
return message;
}
public void setError(String message) {
this.message = message;
}
}
Run Code Online (Sandbox Code Playgroud)
此类已被指定为Spring MVC REST控制器中@ExceptionHandler的返回值:
@ExceptionHandler
@ResponseStatus(HttpStatus.NOT_FOUND)
@ResponseBody
ErrorMessage handleException(RuntimeException e) {
return new ErrorMessage("something went wrong");
}
Run Code Online (Sandbox Code Playgroud)
每当客户端触发RuntimeException
发出一个请求后application/json
,为Accept
报头,它接收用正确的状态码和匹配JSON体的响应:
{"error":"something went wrong"}
Run Code Online (Sandbox Code Playgroud)
或者,如果Accept
标头是application/xml
:则接收XML主体:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<errorMessage><error>something went wrong</error></errorMessage>
Run Code Online (Sandbox Code Playgroud)
现在,我想通过实现一个HandlerExceptionResolver …
如何在一个?中使用Jenkins Dynamic PluginJenkinsfile
?
我正在寻找的是一个Jenkinsfile片段:
Build with Parameters
Jenkins作业中的选项Dynamic Choice Parameters
并且用户将看到下拉列表.尝试时:
Pipeline syntax
在詹金斯编辑properties: Set job properties
为Sample step
This project is parameterized
Dynamic Choice Parameter
Name
,Choice Script
,Remote Script
等Generate Pipeline Script
我得到以下模板:
properties([
parameters([
<object of type com.seitenbau.jenkins.plugins.dynamicparameter.ChoiceParameterDefinition>
]),
pipelineTriggers([])
])
Run Code Online (Sandbox Code Playgroud)
即生成的管道脚本不包含我在5.
上面步骤中输入的数据.如何修改parameters
以便用户可以看到参数名称,选项等?
Jenkins版本:2.19.3动态参数插件版本:0.2.0
java ×5
spring ×4
rest ×3
jenkins ×2
spring-boot ×2
autowired ×1
content-type ×1
cron ×1
easymock ×1
fadein ×1
gradle ×1
h2 ×1
http-headers ×1
javascript ×1
jenkinsfile ×1
jquery ×1
scheduling ×1
spring-mvc ×1
timezone ×1