jbossCache在Tomcat中部署时出现javax.naming.NamingException: Context is read only

作者:lizongbo 发表于:11:41. 星期五, 十一月 2nd, 2007
版权声明:可以任意转载,转载时请务必以超链接形式标明文章和作者信息及本版权声明

出错信息为:

[code]
2007-11-02 11:33:41,471 ERROR [org.jboss.cache.transaction.DummyTransactionManager] - <binding of DummyTransactionManager failed>
javax.naming.NamingException: Context is read only
at org.apache.naming.NamingContext.checkWritable(NamingContext.java:903)

at org.apache.naming.NamingContext.bind(NamingContext.java:831)
at org.apache.naming.NamingContext.bind(NamingContext.java:171)
at org.apache.naming.NamingContext.bind(NamingContext.java:187)
at org.apache.naming.SelectorContext.bind(SelectorContext.java:171)
at javax.naming.InitialContext.bind(InitialContext.java:359)
at org.jboss.cache.transaction.DummyTransactionManager.getInstance(DummyTransactionManager.java:42)
at org.jboss.cache.transaction.GenericTransactionManagerLookup

.getTransactionManager (GenericTransactionManagerLookup.java:92)
at org.jboss.cache.CacheImpl.createTransactionManager(CacheImpl.java:660)
at org.jboss.cache.CacheImpl.internalStart(CacheImpl.java:726)
at org.jboss.cache.CacheImpl.start(CacheImpl.java:708)
at org.jboss.cache.DefaultCacheFactory.createCache(DefaultCacheFactory.java:79)
[/code]
这是因为我们通常是使用了JbossCache 自带的配置文件样本来进行配置的。
配置文件中默认是这样配置的:
<attribute name=”TransactionManagerLookupClass”>org.jboss.cache.transaction.GenericTransactionManagerLookup
</attribute>

而通过查看 org.jboss.cache.transaction.DummyTransactionManager.java的代码可以发现,
在创建TransactionManager的时候执行了一个Context。bind绑定操作。
出错信息用 log.error写入日志里:

代码为:[code]
public static DummyTransactionManager getInstance()
{
if (instance == null)
{
instance = new DummyTransactionManager();
try
{
Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.cache.transaction.DummyContextFactory");
Context ctx = new InitialContext(p);
ctx.bind("java:/TransactionManager", instance);
ctx.bind("UserTransaction", new DummyUserTransaction(instance));
}
catch (NamingException e)
{
log.error("binding of DummyTransactionManager failed", e);
}
}
return instance;
}
[/code]

jboss官方网站有相关讨论:

http://jboss.org/?module=bb&op=viewtopic&t=98997

解决办法也很简单,就是将 TransactionManagerLookupClass指定为自己实现的MyTransactionManagerLookup

MyTransactionManagerLookup。java 代码如下 :
[code]

package com.lizongbo.jbosscache;

import org.jboss.cache.transaction.TransactionManagerLookup;
import javax.transaction.TransactionManager;
import org.jboss.cache.transaction.BatchModeTransactionManager;

public class MyTransactionManagerLookup implements TransactionManagerLookup {
public TransactionManager getTransactionManager() throws Exception {
return new BatchModeTransactionManager();
}

}
[/code]

修改后的配置文件为:

<!–
Configure the TransactionManager
–>
<attribute name=”TransactionManagerLookupClass”>com.lizongbo.jbosscache.MyTransactionManagerLookup</attribute>

Tags: cache, Context, JbossCache, JNDI, Tomcat, TransactionManager

Related posts

标签: , , , , ,

recent related 10 searches :

这篇文章发布于 2007年11月2日,星期五,11:41,归类于 Java, JbossCache, cache。 您可以跟踪这篇文章的评论通过 RSS 2.0 feed。 您可以留下评论,或者从您的站点trackback

留下回复