我试图在关闭 Tomcat 时关闭线程。
具体来说,我正在尝试关闭 log4j 看门狗(用于文件更改),并且我正在尝试关闭使用我的 Web 应用程序中的类的执行程序。
关闭时,我在 Catalina.out 中看到异常。
对于 Log4J,我看到:
信息:非法访问:此 Web 应用程序实例已停止
。无法加载 org.apache.log4j.helpers.NullEnumeration。
最终的后续堆栈跟踪是由出于
调试目的抛出的错误以及尝试终止
导致非法访问的线程引起的,并且没有功能影响。Throwable
发生:java.lang.IllegalStateException
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1587)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1546)
at org.apache .log4j.Category.getAllAppenders(Category.java:413)
在 org.apache.log4j.Category.closeNestedAppenders(Category.java:226)
在 org.apache.log4j.Hierarchy.shutdown(Hierarchy.java:467)
在 org.apache.log4j.LogManager.shutdown(LogManager.java:267) )
在 com.listeners.myListener$1.run(myListener.java:232)
线程“Thread-14”中的异常 java.lang.NoClassDefFoundError:
org.apache.log4j.helpers.NullEnumeration
在 org.apache.log4j.Category.getAllAppenders (Category.java:413)
at org.apache.log4j.Category.closeNestedAppenders(Category.java:226)
at org.apache.log4j.Hierarchy.shutdown(Hierarchy.java:467)
at org.apache.log4j.LogManager。关机(LogManager.java:267)
对于执行者部分:
信息:非法访问:此 Web 应用程序实例已停止
。无法加载 com.my.class.SomeClass。最终的
后续堆栈跟踪是由出于调试
目的抛出的错误以及尝试终止导致
非法访问的线程引起的,并且没有功能影响。Throwable发生:
java.lang.IllegalStateException
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1587)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1546)
at Exception in thread “线程 13” java.lang.NoClassDefFoundError:
com.my.class.SomeClass
我做的是ServletContextListener在contextDestroyed我加入关闭挂钩如下:
public void contextDestroyed(ServletContextEvent …Run Code Online (Sandbox Code Playgroud) 我在Tomcat中有一个使用log4j进行日志记录的Web应用程序.
如果在Web应用程序运行时删除日志文件,则不会重新创建文件?
如何配置log4j以在删除时重新创建文件而无需重新启动Tomcat?
我不明白Java如何选择最常使用的密码Server Hello.
我有一个Tomcat 5配置,我在SSL连接器中设置了 ciphers=TLS_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_256_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, etc
服务器,即Java支持TLS_RSA_WITH_AES_128_CBC_SHA,Server Hello作为客户端支持的首选.但这并不是最安全的,并不是首选的http://docs.huihoo.com/java/javase/7/technotes/guides/security/SunProviders.html#SunJSSEProvider列出的TLS_RSA_WITH_AES_256_CBC_SHA首选项.
然后我认为是server.xml属性中的顺序产生了差异,我把另一个密码first(TLS_DHE_RSA_WITH_AES_256_CBC_SHA)放在我Client Hello支持的地方.但这也没有被选中,而是TLS_RSA_WITH_AES_128_CBC_SHA再次被选中.
那么JSSE如何选择偏好的密码呢?这是在某处记录的吗?我无法弄清楚这里发生了什么.
我正在阅读关于双重检查锁定的信息Effective Java.代码执行以下操作:
private volatile FieldType field;
FieldType getField() {
FieldType result = field;
if (result == null) { // First check (no locking)
synchronized(this) {
result = field;
if (result == null) // Second check (with locking)
field = result = computeFieldValue();
}
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
它说使用result似乎不需要但实际上确保field只在已经初始化的常见情况下只读取一次.
但我不明白这一点.与if(field == null)直接做什么有什么区别?我不明白为什么if (result == null)会有所不同,更不用说如上所述了.
java concurrency multithreading synchronization effective-java
我试图阅读同步队列的实现
对我来说并不是那么简单.它似乎使用链接列表,其中每个节点都与一个线程相关联.
核心部分使用旋转循环等待将任务放入队列中.
我想知道为什么使用旋转循环代替类似的东西wait/notify?
现在,由于这个恒定的自旋循环,其中一个核心消失了,对吧?
我试图理解这一点,并粗略地了解同步队列的设计
更新令
我不安的是服务员线程如何启动/停止.
java concurrency multithreading nonblocking java.util.concurrent
我正在研究如何根据每个句子的长度对文件进行排序,我从这个答案中看到了这个片段
perl -ne 'push @a, $_ } { print sort { length $a <=> length $b } @a' input
^ ^
Run Code Online (Sandbox Code Playgroud)
我测试了它并且它有效,但我不知道它是如何工作的!据我所知,语法错误.它有一个开放的右支架和一个我已标记的非封闭右支架.
我真的很难弄清楚如何在bash中运行这样的perl命令
可以请一些人解释这个片段吗?
我以前从未使用过 memcached,并且对以下基本问题感到困惑。
Memcached 是缓存吧?我假设我们缓存数据库中的数据以便更快地访问。那么当DB更新时谁负责更新缓存呢?我们的代码是,当数据库更新时,memcached 是否“理解”?
我有一个"遗留"代码,我想重构.
代码基本上是对服务器的远程调用并获得回复.然后根据回复执行相应的.
代码骨架示例:
public Object processResponse(String responseType, Object response) {
if(responseType.equals(CLIENT_REGISTERED)) {
//code
//code ...
}
else if (responseType.equals(CLIENT_ABORTED)) {
//code
//code....
}
else if (responseType.equals(DATA_SPLIT)) {
//code
//code...
}
etc
Run Code Online (Sandbox Code Playgroud)
问题是有许多if/else分支,并且每个内部的代码都不是微不足道的.
因此很难维护.
我想知道这个最好的模式是什么?
我有一个想法是创建一个方法名称与responseType相同的单个对象,然后在processResponse内部使用反射调用与responseType同名的方法.
这将清理processResponse,但它会将代码移动到具有许多/多种方法的单个对象,我认为反射会导致性能问题.
是否有一个很好的设计方法/模式来清理它?
我正在阅读Pagh和Rodle的杜鹃哈希,我无法理解这一段的含义:
可能会发生此过程循环,如图1(b)所示.因此,迭代次数受第2.3节中规定的值"MaxLoop"的限制.如果达到了这个迭代次数,我们将使用新的哈希函数重新表达表中的键,并再次尝试使用无嵌套键.没有必要为重新分配分配新表:我们可能只是通过表来删除并执行通常的插入过程,所有键都发现不在表中的预期位置.
使用新的哈希函数意味着什么?
在插入算法中,调整表的大小.我们是否应该以某种方式使用散列函数的"池"?我们如何创建这个池?
我试图找出没有探查器的内存中哈希图的大小。所以我做了以下事情:
HashMap<Integer, String> map = new HashMap<Integer, String>();
long start = System.currentTimeMillis();
lotsOfGC();
long freeMemoryBeforeConstruction = Runtime.getRuntime().freeMemory();
System.out.println("memory before = " + freeMemoryBeforeConstruction);
for(int i = 0; i < numbers.length; i++) {
String value = "value"+ i;
map.put(i, value);
}
long end = System.currentTimeMillis();
lotsOfGC();
long freeMemoryAfterConstruction = Runtime.getRuntime().freeMemory();
System.out.println("memory after= " + freeMemoryAfterConstruction );
Run Code Online (Sandbox Code Playgroud)
lotsOfGC只是在哪里:
static void lotsOfGC() {
for (int i = 0; i < 20; i++) {
System.gc();
try {
Thread.sleep(100);
} catch (InterruptedException e) { …Run Code Online (Sandbox Code Playgroud) java ×6
tomcat ×3
concurrency ×2
linux ×2
log4j ×2
algorithm ×1
bash ×1
caching ×1
dictionary ×1
hash ×1
hashtable ×1
jsse ×1
logging ×1
memcached ×1
memory ×1
nonblocking ×1
oop ×1
performance ×1
perl ×1
profiler ×1
refactoring ×1
security ×1
servlets ×1
ssl ×1