我一直在寻找一个很好的例子,用于将Process输出和错误流写入日志文件.我使用apache-commons exec库来执行我的进程.下面的代码示例来演示
public static int executeCommand(CommandLine command, Logger log) throws ExecuteException, IOException {
DefaultExecutor executor = new DefaultExecutor();
executor.setExitValue(0);
PumpStreamHandler psh = new PumpStreamHandler();
executor.setStreamHandler(psh);
return executor.execute(command);
}
Run Code Online (Sandbox Code Playgroud) 我是jboss的新手,我被要求将jboss连接池机制与现有的Web应用程序结合在一起.考虑到正确编写了Web应用程序数据库层,即所有结果集,语句和连接在不需要时正确关闭,在我正确配置jboss数据源后,我必须在我的Web应用程序中进行所有代码更改.
任何人都可以指向我在Web应用程序中使用jboss数据源的教程或代码示例.
是否可以从从该对象的构造函数调用的Private方法设置最终属性的值?
public class FinalTest {
private final Object a;
//Constructor
public FinalTest() {
setA();
}
private void setA() {
a = new Object;
}
}
Run Code Online (Sandbox Code Playgroud)
对于上面的类,编译器给出了一个错误,说我不能从方法中设置'a'的值.
据我所知,它不可能从一个构造函数之外的最后一个变量的设定值,但在上述情况下,我实际上做它在构造函数中的一种方式.那么为什么不允许这样做呢?
我编写了一个接收RMI请求并执行某些操作的服务器.
对于每个请求,都会创建Log4J Logger实例.以下是用于创建Logger实例的代码段.
Logger log = Logger.getLogger("log_" + requestID);
log.setAdditivity(false);
FileAppender appender = null;
try {
PatternLayout layout = new PatternLayout("%-5p %C{1} %d{yyyy-MM-dd HH:mm:ss} : %m%n");
appender = new FileAppender(layout, logFileName, false);
} catch(Exception e) {
logger.error("Error initializing logger", e);
}
log.addAppender(appender);
log.setLevel(level);
Run Code Online (Sandbox Code Playgroud)
这里的事情很好.收到大量请求后,问题就是超时,此服务器进程的Open Files数量增加并且没有降低,从而导致进程崩溃,并显示太多打开文件的异常.
经过进一步检查,发现问题是由于在请求完成后文件描述符未被释放.我试过查看Log4J文档但是找不到任何关于如何关闭一个记录器而不影响可能在不同线程中运行的其他记录器的内容.
这里有什么想法?
直接将原始值分配给Wrapper类型和使用valueOf API有什么区别?即
Long val = 91l;
Run Code Online (Sandbox Code Playgroud)
和
Long val = Long.valueOf(91l);
Run Code Online (Sandbox Code Playgroud)
这个问题来自于我多年来一直困扰我的错误.到目前为止,我还没有能够成功地重新创建它并随机出现.我有一些对象是作为处理一些数据的一部分而生成的,这些对象有很多字段,其中一些是Long类型(Wrapper)我确信值被分配给所有变量,但在某些情况下它们只是即使在没有理由的情况下,也会出现NULL.
这个问题的相关方式是,这些Long属性的Set方法实际上采用long(primitive)类型的参数,并使用第一种方法进行分配.我不确定这是否会导致它.我已经用第二种方法修改了我的代码,并等待一些好的测试才能完成,然后才开始修复它.
我很想知道我提到的上述两种方法是否存在任何理论差异.(我通常在大多数时间使用第一个.)
我有 Java 客户端,它使用 https 连接到某些 Web 服务。客户端的要求之一是,我们应该能够从支持的密码套件列表中进行选择,然后强制客户端使用它们。
从以下页面
- https.cipherSuites 系统属性。这包含一个以逗号分隔的密码套件名称列表,用于指定要在此 HttpsURLConnection 上使用的密码套件。请参阅 SSLSocket setEnabledCipherSuites(String[]) 方法。
但是当我设置这个 JVM 属性并列出默认密码时。我得到标准启用的密码列表,与不使用此属性时相同。
我用来列出启用的密码的代码:
SSLSocketFactory factory = HttpsURLConnection.getDefaultSSLSocketFactory();
SSLSocket socket = (SSLSocket) factory.createSocket();
String[] enabledCiphers = socket.getEnabledCipherSuites();
for (String enabledCipher : enabledCiphers) {
System.out.println("Enabled Ciphers: " + enabledCipher);
}
Run Code Online (Sandbox Code Playgroud)
使用以下方法设置属性:
-Dhttps.cipherSuites=SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA,SSL_DHE_DSS_WITH_DES_CBC_SHA
Run Code Online (Sandbox Code Playgroud)
有什么建议?