我最近发现了一个导致NullPointerException的错误.使用标准的slf4j语句捕获并记录异常.以下简要代码:
for(Action action : actions.getActions()) {
try {
context = action.execute(context);
} catch (Exception e) {
logger.error("...", e);
break;
}
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,没什么特别的.但是,在我们拥有的所有异常日志记录语句中,只有这一个不打印堆栈跟踪.它打印的全部是消息(表示为"...")和异常类的名称(java.lang.NullPointerException).
由于异常上的堆栈跟踪是延迟加载的,我想可能存在某种指令重新排序问题,并决定在日志语句之前调用e.getStackTrace().这没有任何区别.
所以我决定在启用调试代理的情况下重新启动.但是,因为我甚至连接到这个过程,我注意到现在堆栈的痕迹正在打印.很明显,调试代理的存在导致一些额外的调试信息变得可用.
从那时起我就修复了异常的根本原因.但我想了解为什么没有调试器就无法使用堆栈跟踪.谁知道?
澄清:这不是日志记录问题.想象一下相同的try/catch子句,但在catch中,我打印的值为:
e.getStackTrace().length
Run Code Online (Sandbox Code Playgroud)
没有调试器,它打印'0',调试器打印一个正数(在这种情况下为9).
更多信息:这发生在JDK 1.6.0_13,64bit,amd64,linux 2.6.9上
我一直在使用OSGi一段时间,我遇到了各种问题的解决方案.我想重新审视其中一个,看看人们是否提出了不同的解决方案.
我与OSGi(Equinox 3.4.2)最常见的问题之一是Thread的上下文ClassLoader经常不可用.我知道这部分是一个Equinox问题,但我也遇到了Felix的问题.我遇到的主要是第三方库启动自己的Threads或ThreadPools.当这些在Bundle或DS激活期间启动时,它们最终可能没有它们的ClassLoader.如果第三方库有防止上下文ClassLoader丢失,那么没问题,但不是每个人都检查它.后来,如果所述库需要进行动态类加载,它可能会爆炸.
我已经使用了一段时间的成语如下(简要):
ClassLoader tccl = Thread.currentThread().getContextClassLoader();
try {
Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
/*
* Start threads, or establish connections, here, now
*/
} finally {
Thread.currentThread().setContextClassLoader(tccl);
}
Run Code Online (Sandbox Code Playgroud)
这个习惯用法通常最终出现在Activator或DS activate()方法中.有一些小的变化,我检查是否tccl不为空,我不会覆盖上下文类加载器.
现在,我有一些代码贴在各个地方,我知道一些第三方库可能会产生一个线程并破坏我的一天.虽然一开始它是可以管理的,但我最终在许多随机的地方都有这个,这让我感到烦恼.
还有其他人遇到这个问题,他们提出了什么解决方案?我还想知道在新的Equinox 3.5.x中是否解决了这个问题,是否有人真正看到它有效?
问候.
我构建了一个事务性的MSMQ WCF服务.我在我的操作中使用了以下属性:
[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
Run Code Online (Sandbox Code Playgroud)
我在服务中使用Nhibernate.使用Nhibernate我在会话中提交.如果我禁用Nhibernate提交,则会正确处理消息并从队列中删除.通过此提交,Nhibernate事务正确,但我的消息进入重试队列.
这是我进入Nhibernate服务跟踪的例外.
Description Handling an exception. Exception details: System.Transactions.TransactionAbortedException: The transaction has aborted. ---> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'Transaction'.
at System.Transactions.Transaction.DependentClone(DependentCloneOption cloneOption)
at System.Transactions.TransactionScope.SetCurrent(Transaction newCurrent)
at System.Transactions.TransactionScope.PushScope()
at System.Transactions.TransactionScope.Initialize(Transaction transactionToUse, TimeSpan scopeTimeout, Boolean interopModeSpecified)
at System.Transactions.TransactionScope..ctor(Transaction transactionToUse, TransactionScopeAsyncFlowOption asyncFlowOption)
at System.Transactions.TransactionScope..ctor(Transaction transactionToUse)
at NHibernate.Transaction.AdoNetWithDistributedTransactionFactory.DistributedTransactionContext.System.Transactions.IEnlistmentNotification.Prepare(PreparingEnlistment preparingEnlistment)
--- End of inner exception stack trace ---
at System.Transactions.TransactionStatePromotedAborted.PromotedTransactionOutcome(InternalTransaction tx)
at System.Transactions.TransactionStatePromotedEnded.EndCommit(InternalTransaction tx)
at System.Transactions.CommittableTransaction.Commit()
at System.ServiceModel.Dispatcher.TransactionInstanceContextFacet.Complete(Transaction transaction, Exception error)
Run Code Online (Sandbox Code Playgroud)
似乎nhibernate提交破坏了WCF上的事务.我找不到解决这个问题的方法.
任何帮助可能会受到赞赏
我有一个线程池,从队列中提供任务.通常,少量线程能够将队列保持为空.偶尔,特别大的事件突发会使队列大小在零上保持一段时间,但不会持续很长时间.
我担心的是重复的事件或携带废弃以前事件的数据.在高容量时,这样的事件可以在队列中共存很短的时间.我希望能够将这些内容混为一谈,以便减少浪费时间.
混淆这样一个队列的好方法是什么?我可以在插入时通过从头到尾迭代并寻找替换的候选者来混淆,但这似乎太暴力了.如果您有代码或库建议,请记住我使用的是Java.
我正在做一个小项目,并想知道什么可能是最好(最有效)的方式来订购一堆Stringsby:
前者是最初排序的方式.
我在考虑使用优先级队列,但我不确定是否有更有效的方法来排序Strings.
另外,我很难弄清楚如何按长度排序后按字母顺序排序.如果有人有更好的方法对这些进行排序或者知道如何在第一次排序之后进行排序,那么答案就会很好.
java ×5
c# ×1
comparator ×1
equinox ×1
logging ×1
messaging ×1
msmq ×1
nhibernate ×1
osgi ×1
performance ×1
queue ×1
rabbitmq ×1
sorting ×1
stack-trace ×1
transactions ×1
wcf ×1