我们有一个非常小的Web服务(少于1K行代码)由Jetty运行.即使在压力测试阶段,该服务也始终如一.但是,经过13天的正常运行时间后,我们在同一天的两个节点中遇到了ClassNotFoundException.
奇怪的是,找不到的类已经存在(它是启动例程的一部分,并且它不断用于以前的请求).事实上,只需重新启动流程即可解决问题.两个节点都在不同的机器中,并且彼此独立.它们不依赖于外部资源,除了一个JMS连接.
在谷歌搜索时我找不到相关信息,因为大多数报告的问题与启动Java进程时类路径中缺少的类有关,这不是我们的情况.我们怀疑可能存在内存泄漏,从某种程度上破坏了JVM内存,但是这无法解释为什么同一时间在两个节点中发生同样的问题.在过去的五天里,我们一直在进行密集的压力测试,连接JVM监视器和内存泄漏分析器,一切看起来都很好.对于此测试,我们将进程内存从2GB减少到512MB.
细节:
您能否就JVM突然"忘记"以前加载的类的存在而无法再次加载它的想法做出贡献?
Caused by: java.lang.ClassNotFoundException: com.a.b.c.SomeClass
at java.net.URLClassLoader$1.run(URLClassLoader.java:202) ~[na:1.6.0_37]
at java.security.AccessController.doPrivileged(Native Method) ~[na:1.6.0_37]
at java.net.URLClassLoader.findClass(URLClassLoader.java:190) ~[na:1.6.0_37]
at java.lang.ClassLoader.loadClass(ClassLoader.java:306) ~[na:1.6.0_37]
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) ~[na:1.6.0_37]
at java.lang.ClassLoader.loadClass(ClassLoader.java:247) ~[na:1.6.0_37]
at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:424) ~[na:na]
at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:377) ~[na:na]
at java.lang.Class.forName0(Native Method) ~[na:1.6.0_37]
at java.lang.Class.forName(Class.java:247) ~[na:1.6.0_37]
at sun.reflect.generics.factory.CoreReflectionFactory.makeNamedType(CoreReflectionFactory.java:95) ~[na:1.6.0_37]
at sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:107) ~[na:1.6.0_37]
at sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:31) ~[na:1.6.0_37]
at sun.reflect.annotation.AnnotationParser.parseSig(AnnotationParser.java:370) ~[na:1.6.0_37]
at sun.reflect.annotation.AnnotationParser.parseClassValue(AnnotationParser.java:351) ~[na:1.6.0_37]
at …
Run Code Online (Sandbox Code Playgroud) 我准备在我们的一个项目中加入Quartz.在寻找免费用户界面来帮助我们监控其执行状态(工作等)时,我们发现了这篇文章:为什么你不应该使用石英
作者说Quartz即使对于简单的任务也很复杂(我倾向于同意......)并且提到Obsidian是一个更好的选择,其中包括一个开箱即用的优秀UI.实际上,那个UI在某种程度上比我为Quartz(JWatch)找到的最好的免费替代品更好.注意:作者为黑曜石工作......
谢谢,
在Spring Boot应用程序中,我已经设置了一个带有url映射的过滤器/service1/*
.这是使用a完成的FilterRegistrationBean
.
还有一个映射到相同模式的控制器:
@RestController @RequestMapping(path = "/service1")
class Service1 {
...
Run Code Online (Sandbox Code Playgroud)
问题:
执行POST http://localhost:8080/service1/hello
按预期工作(即,过滤器涉及请求处理链,并且调用了服务控制器).但是,执行http://localhost:8080//service1/hello
(注意双斜杠)将绕过过滤器,但由于Spring MVC更宽松的路径匹配算法,无论如何都会到达控制器.
我已经读过可以自定义控制器路径匹配算法(链接:http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#mvc-config-path-matching),但是我没有找到不忽略双斜杠的选项.
同样重要的是:这种行为意味着可以绕过任何受过滤器保护的Controller(不是Spring安全性,但任何自定义过滤器),只需在URL的任何部分放置一个双斜杠即可.我的理解是否正确?你知道MVC控制器路径匹配是否可以调整,以便在路径匹配算法中不会忽略双斜杠?
执行Java REST服务性能测试我看到一个意外的模式:在每次调用中创建并返回相同值对象的方法比仅返回存储在类或对象字段中的值对象的另一个版本运行得更快.
码:
@POST @Path("inline") public Response inline(String s) {
return Response.status(Status.CREATED).build();
}
private static final Response RESP = Response.status(Status.CREATED).build();
@POST @Path("staticfield") public Response static(String s) {
return RESP;
}
private final Response resp = Response.status(Status.CREATED).build();
@POST @Path("field") public Response field(String s) {
return resp;
}
Run Code Online (Sandbox Code Playgroud)
字节代码:
性能(使用Apache AB,单线程,多次运行,结果一致):
环境:RHEL6 + JDK Oracle 1.7.0_60-b19 64位
有可能JVM使用本机代码优化了内联版本,但从未考虑优化其他两个,因为它们已经很小了吗?
我们的应用程序使用Syncfusion的DocIO库生成Word文档.基本上,我们加载模板并在其中插入特定书签中的特定文本,生成用户即时下载的Word文档.
我们面临的问题是:
根据Syncfusion的文档(很少......),使用他们的lib是不可能的.因此,我们在模板中实现了一个AutoOpen宏,当打开文档作为变通方法时,它会更新TOC.但是,这会在打开文件时导致安全警告(因为宏),这使我们的使用感到不舒服.
你们有没有想过改进这个实现?谢谢,
我们的服务有一个根据属性文件安排的进程,读取属性refreshIntervalMillis.它的值直接在Quartz触发器中注入,具有以下配置:
<bean name="trigger"
class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean "
p:repeatInterval="${refreshIntervalMillis}">
...
</bean>
Run Code Online (Sandbox Code Playgroud)
但是,安装此服务的管理员会考虑小时/天,因此为了使事情变得更容易,我们将其更改为:
p:repeatInterval="#{ 1000 * 60 * T(java.lang.Integer).valueOf(@configurationProperties['garbageLevelWatcher.refreshIntervalMinutes'])}"
注意:属性对象公开为名为"configurationProperties"的bean
是否有更简单的语法来实现相同的目标?
谢谢,
我们在我们的应用程序中使用Coda Hale指标,使用Json模块附加组件来改进暴露应用程序指标的某些REST服务的JSON输出.
最近,我们开始将指标保存到MongoDB.由于我们使用的是spring-data-mongodb,因此大大简化了保存POJO的代码.Spring的MongoDB类型映射使用通常的方法(对bean属性的内省来确定要保存和读取的内容),但是这对Code Hale对象(Timer,Counter等)不能很好地发挥作用.
如果我们可以让Spring使用已经可用于Jackson的JSON模块,那将是很棒的,因为我们将拥有保存序列化样式和维护的代码很少.
但是在阅读完文档和浏览一些Spring mongodb源文件之后,我找不到一个直接注入自定义Jackson序列化的方法.似乎自定义流程的唯一方法是创建自定义MongoTypeMapper.
有谁知道我们是否可以注入定制的杰克逊映射器,或者可以推荐替代解决方案?
谢谢
我可能不得不在短期内解决C#中的一些开发改进项目.目前,我们提供Visual Studio 2010许可证,但您可以随意使用您喜欢的任何工具.
由于我非常熟悉Eclipse(我喜欢Mylyn),我想知道这里有人是否有这两种环境的经验并且可以分享一些见解或建议.
谢谢,
在集群设置(使用JDBC数据存储)中使用Quartz 2.1.6和Spring 3.1时,我们遇到了一个问题.目前背景:
这种行为是否正常?如果是:我们如何告诉Quartz不要在每次部署时重新创建触发器数据?(或覆盖该数据,与Jobs一样)
<bean name="myJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="com.etc.MyJob" />
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"
p:waitForJobsToCompleteOnShutdown="false" lazy-init="false">
<property name="dataSource" ref="myDataSource" />
<property name="transactionManager" ref="transactionManager" />
<property name="overwriteExistingJobs" value="true" />
<property name="autoStartup" value="true" />
<property name="jobFactory">
<bean class="org.springframework.scheduling.quartz.SpringBeanJobFactory"/>
</property>
<property name="triggers">
<list>
<bean class="org.springframework.scheduling.quartz.CronTriggerFactoryBean" p:cronExpression="0 0 0 * * ?" p:misfireInstruction="2">
<property name="jobDetail" ref="myJob" />
</bean>
<bean class="org.springframework.scheduling.quartz.CronTriggerFactoryBean "
p:cronExpression="0 0 20 * * ?"
p:misfireInstruction="2">
<property name="jobDetail" ref="myJob" />
</bean>
</list>
</property>
<property name="quartzProperties">
<props>
<prop key="org.quartz.scheduler.instanceName">fsbu_scheduler</prop>
<prop …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用实例化模型中的pertype实现跟踪方面.通过这种方式,我将能够为每种类型的每个类使用一个记录器.
从我们的一些例子中我可以找到这个代码来初始化记录器:
public abstract aspect TraceAspect pertypewithin(com.something.*) {
abstract pointcut traced();
after() : staticinitialization(*) {
logger = Logger.getLogger(getWithinTypeName());
}
before() : traced() {
logger.log(...);
}
//....
}
Run Code Online (Sandbox Code Playgroud)
遗憾的是,我无法将其完全转换为@AspectJ语法(这是我控制之外的项目要求),尤其是我需要设置记录器的部分,只执行一次该代码.
这可能吗?
谢谢,
我想WebApplicationContextUtils.getRequiredWebApplicationContext(context)
在其init()
方法中对依赖于Spring的servlet代码进行单元测试.
以下是代码的一部分:
@Override
public void init() throws ServletException {
super.init();
WebApplicationContext applicationContext =
WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
this.injectedServiceBean = (SomeService) applicationContext.getBean("someBean");
}
Run Code Online (Sandbox Code Playgroud)
将适当的applicationContext.xml(测试版本)注入此文本的最佳方法是什么?
我知道Spring的@ContextConfiguration
,但是我不确定将${testClass}Test-context.xml
注释加载到servlet上下文中的上下文注入的最佳方法,以便getRequiredWebApplicationContext(...)可以返回它.
java ×8
spring ×4
c# ×2
jvm ×2
.net ×1
aspectj ×1
aspects ×1
bytecode ×1
crontrigger ×1
eclipse ×1
expression ×1
jackson ×1
mapping ×1
ms-word ×1
performance ×1
properties ×1
scheduling ×1
servlets ×1
spring-boot ×1
spring-el ×1
spring-mvc ×1
unit-testing ×1
url-mapping ×1