2

我的程序遇到错误:

“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。有时它会再次出现。

如果有人能够帮助解决我面临的问题,我将不胜感激。

谢谢

4

2 回答 2

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,您关闭InitialContextEJBClientContext

关闭EJBClientContext

EJBClientContext.getCurrent().close();
于 2016-06-08T14:54:06.103 回答
0

有一个已知的 JBoss 错误(EAP 6、AS 7),过快地打开和关闭太多InitialContext实例会导致以下错误:

错误:无法为上下文 EJBReceiverContext 打开通道

代替:

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;
}

close()记住在不再需要上下文时调用。

于 2018-03-15T21:06:27.643 回答