JBoss返回org.jboss.remoting.ProtocolException:打开的通道太多

时间:2014-12-04 12:44:24

标签: jboss connection jndi remote-access channels

我的程序遇到错误:

  

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

如果有人能够帮助我解决我的问题,那就表示赞赏。

由于

2 个答案:

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