我的程序遇到错误:
" org.jboss.remoting3.ProtocolException:打开太多频道"
我已经从互联网上搜索了一些修复此错误的解决方案。不幸的是,其他人的建议对我不起作用。
以下是关于我如何调用jndi遥控器以及我使用的属性的代码。
public static void createUser(String loginID) throws Exception {
Hashtable props = new Hashtable();
try {
props.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
props.put(Context.PROVIDER_URL, "remote://" + localhost:4447);
props.put("jboss.naming.client.ejb.context", "true");
props.put(Context.SECURITY_PRINCIPAL, "userJBoss");
props.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
context = new InitialContext(props);
context.lookup("ejb:/createUserOperation/CreateUserGenerator!password.api.CreateUserService");
.....
......
LOGGER.info("DONE");
} catch (Exception e) {
LOGGER.error("ERROR");
} finally {
context.close();
}
}
由于某些原因,我无法显示该方法的所有内容。
" createUser"每次需要创建新用户时都会调用。它将被召唤数百或数千次。
每次完成执行方法时,我都会关闭连接。
假设我已经调用该方法100次,部分用户将成功创建,而部分用户将失败。
以下错误会提示我:
2014-12-04 17:23:23,026 - ERROR [Remoting "config-based-naming-client-endpoint" task-4] (org.jboss.ejb.client.remoting.RemotingConnectionEJBReceiver- Line:134) - Failed to open channel for context EJBReceiverContext{clientContext=org.jboss.ejb.client.EJBClientContext@bbaebd6, receiver=Remoting connection EJB receiver [connection=Remoting connection <78e43506>,channel=jboss.ejb,nodename=webdev01]} org.jboss.remoting3.ProtocolException: Too many channels open
一旦发生错误,它需要我重新启动我的jboss.And有时会再次出现。
如果有人能够帮助我解决我的问题,那就表示赞赏。
由于
答案 0 :(得分:0)
您正在使用上下文属性的混合。
这应该足够了
final Properties ejbProperties = new Properties();
ejbProperties.put("remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED", "false");
ejbProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
ejbProperties.put("remote.connections", "1");
ejbProperties.put("remote.connection.1.host", "localhost");
ejbProperties.put("remote.connection.1.port", "4447");
ejbProperties.put("remote.connection.1.username", "ejbuser");
ejbProperties.put("remote.connection.1.password", "ejbuser123!");
final EJBClientConfiguration ejbClientConfiguration = new PropertiesBasedEJBClientConfiguration(ejbProperties);
final ConfigBasedEJBClientContextSelector selector = new ConfigBasedEJBClientContextSelector(ejbClientConfiguration);
EJBClientContext.setSelector(selector);
final Context context = new InitialContext(ejbProperties);
// lookup
Foo proxy = context.lookup("ejb:/createUserOperation/CreateUserGenerator!password.api.CreateUserService");
使用org.jboss.ejb.client.naming
时会创建EJBClientContext
对象。
关闭context
时,您正在关闭InitialContext
而不是EJBClientContext
关闭EJBClientContext
:
EJBClientContext.getCurrent().close();
答案 1 :(得分:0)
有一个known JBoss bug(EAP 6,AS 7),过快地打开和关闭太多InitialContext个实例会导致以下错误:
错误:无法打开上下文EJBReceiverContext的通道
而不是:
Acc
尝试缓存一组属性的上下文:
final Properties properties = ...
final Context context = new InitialContext( properties );
请记住在不再需要上下文时调用private Map<Integer, InitialContext> initialContexts = new HashMap<>();
final Context context = getInitialContext(properties);
private InitialContext getInitialContext(final Properties properties) throws Exception {
final Integer hash = properties.hashCode();
InitialContext result = initialContexts.get(hash);
if (result == null) {
result = new InitialContext(properties);
initialContexts.put(hash, result);
}
return result;
}
。