1

We have an evirironment as follows:

CPE: 2 Servers
ICN: 2 servers
Application Server: WAS 8.5.5 Base

Both content Engine and Navigator are configured for high availability using Load Balancer. However, in case ICN 1 is connected to CPE1 and CPE1 is dwn, then Navigator is unable to connect to CPE2 even though load balancer of CPE is pointing to CPE2.

The logs are as follows:

javax.naming.NamingException: NMSV0610I: A NamingException is being thrown from a javax.naming.Context implementation. Details follow:
    Context implementation: com.ibm.ws.naming.jndicos.CNContextImpl
    Context method: lookupExt
    Context name: HDOSYS0202Node01Cell/nodes/HDOSYS0202Node01/servers/server1
    Target name: FileNet/Engine,10.39.128.66:2809/FileNet/Engine
    Other data: 
    Exception stack trace: javax.naming.NamingException: Error during resolve [Root exception is org.omg.CORBA.TRANSIENT: initial and forwarded IOR inaccessible vmcid: IBM minor code: E07 completed: No]
    at com.ibm.ws.naming.jndicos.CNContextImpl.doLookup(CNContextImpl.java:1867)
    at com.ibm.ws.naming.jndicos.CNContextImpl.doLookup(CNContextImpl.java:1776)
    at com.ibm.ws.naming.jndicos.CNContextImpl.lookupExt(CNContextImpl.java:1433)
    at com.ibm.ws.naming.jndicos.CNContextImpl.lookup(CNContextImpl.java:615)
    at com.ibm.ws.naming.util.WsnInitCtx.lookup(WsnInitCtx.java:165)
    at com.ibm.ws.naming.util.WsnInitCtx.lookup(WsnInitCtx.java:179)
    at org.apache.aries.jndi.DelegateContext.lookup(DelegateContext.java:161)
    at javax.naming.InitialContext.lookup(InitialContext.java:436)
    com.ibm.ws.ssl.channel.impl.SSLReadServiceContext$SSLReadCompletedCallback.complete(SSLReadServiceContext.java:1818)
    at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:175)
    at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
    at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
    at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138)
    at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204)
    at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775)
    at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905)
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1864)
    Caused by: org.omg.CORBA.TRANSIENT: initial and forwarded IOR inaccessible vmcid: IBM minor code: E07 completed: No

    Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:412)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:271)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:258)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:376)
    at java.net.Socket.connect(Socket.java:546)
    at com.ibm.ws.orbimpl.transport.WSTCPTransportConnection.createSocket(WSTCPTransportConnection.java:370)
    at com.ibm.CORBA.transport.TransportConnectionBase.connect(TransportConnectionBase.java:366)
    at com.ibm.ws.orbimpl.transport.WSTransport.getConnection(WSTransport.java:437)
    at com.ibm.CORBA.transport.TransportBase.getConnection(TransportBase.java:188)
    at com.ibm.rmi.iiop.TransportManager.get(TransportManager.java:100)
    at com.ibm.rmi.iiop.GIOPImpl.getConnection(GIOPImpl.java:134)
    at com.ibm.rmi.iiop.GIOPImpl.createRequest(GIOPImpl.java:178)
    at com.ibm.rmi.corba.ClientDelegate._createRequest(ClientDelegate.java:2010)
    at com.ibm.rmi.corba.ClientDelegate.createRequest(ClientDelegate.java:1186)
    at com.ibm.rmi.corba.ClientDelegate.createRequest(ClientDelegate.java:1272)

3 Answers 3

2

Content Platform Engine does not support session replication which would be required to failover. Once the connection is established, the client will bind to the specific endpoint so neither corbaloc nor a load balancing alias will help. If the nodes are not in a Cluster the peer will not be in the JNDI tree so do not know about each other. What you have is called a "stovepipe" configuration. You can load balance the front end, but each front end will talk to a specific backend, so not highly available. You could put the CE's behind a hardware load balancer (SNAT) but it would still lack fail over. CPE will run on JBOSS but ICN does not, so to be highly available you'll need to deploy to WebSphere ND or Weblogic.

0

Could you share the URI used to establish CPE connection?

When Content Platform Engine is made highly available through an application server cluster configuration the Content Platform Engine URI should have the following form (with no carriage returns):

corbaloc::node1_hostname:BOOTSTRAP_ADDRESS,:node2_hostname:BOOTSTRAP_ADDRESS/cell/clusters/your_websphere_cluster_name/FileNet/Engine

Example:

corbaloc::testnode1:9810,:testnode2:9810/cell/clusters/testwascluster/FileNet/Engine

This configuration requires the WebSphere cluster name in addition to the node names as part of the URI. The bootstrap port for a cluster configuration (by default, port 9810) is usually different from the bootstrap port on a non-cluster (standalone) configuration (by default, port 2809).

Only one URI is used regardless of SSL use. WebSphere EJB over SSL is automatically established if EJB security is enabled.

2
  • Yes. The url I used is iiop://loadbalancerhostname:2809/FileNet/Engine. But the problem in my case is that we are using WAS Base. So cluster is not supported in our case. So, we need a work around to achive high availability with WAS base only
    – amitbvsb
    Commented Jun 10, 2016 at 16:04
  • I believe you need Websphere ND and setup a cluster to achieve this. However, if you achieve with base server configuration please do let us know. Seems interesting though :)
    – sin
    Commented Jun 11, 2016 at 3:37
-2

I found a link containing code to solve the issue in my case. The only problem is how to implement this code for Content Navigator

"This may help. I have recently written an EJB print app which is used by other apps at my company to generate printable documents. I am also using an access bean on the client to remotely call my EJB. The client is a 4 server cluster, and my EJB is a 2 server cluster. I have also experienced problems with the "connection refused" exception if I stop the application server(s) running my EJB when calling without restarting the client. Here is what I've done so far to resolve the issue.

Looking at the access bean, after you create an instance, when you call your remote method (whatever that may be and in my case is renderDocuments() which i will use in my example below) the access bean does the following:"

public DocumentRenderOutputContext renderDocuments
    DocumentRequestList documentRequestList)
{
    try
    {
        instantiateEJB();
        return ejbRef().renderDocuments
            documentRequestList);
    }
    catch (NamingException ne)
    {
throw new DocumentRenderException(ne);
    }
    catch (CreateException ce)
    {
throw new DocumentRenderException(ce);
    }
    catch (RemoteException re)
    {
        THE EXCEPTION THROWN WHEN THE APP SERVER IS
        BROUGHT DOWN WITHOUT RESTARTING THE CLIENT
        WILL BE CAUGHT HERE
    }
}

If you bring down your EJB app server(s) without re-starting the client, the remote exception above will catch the "connect refused" exception.

So what i do inside the remote exception catch is the following:

try
{
    //see below for methods
    reset(); 
    return retryRenderDocuments(documentRequestList);
}
catch (NamingException ne)
{
    throw new DocumentRenderException(ne);
}
catch (CreateException ce)
{
    throw new DocumentRenderException(ce);
}
catch (RemoteException remote)
{
    throw new DocumentRenderException(re);
}

private void reset() throws NamingException
{   
    resetHomeCache();
    resetEJBRef();
}

private DocumentRenderOutputContext retryRenderDocuments
    DocumentRequestList documentRequestList)
    throws
    RemoteException,
    NamingException,
    CreateException,
    DocumentRenderException
{
    DocumentRenderOutputContext outputContext = null;

    Properties properties = new Properties();

    properties.put(
        javax.naming.Context.PROVIDER_URL,
getInit_NameServiceURLName()); //im assuming youve
properties.put(
PROPS.JNDI_CACHE_OBJECT,
PROPS.JNDI_CACHE_OBJECT_CLEARED);
InitialContext initialContext = new InitialContext(properties);

Object object = initialContext.lookup(getInit_JNDIName());

ECommercePrintHome homeRef = (ECommercePrintHome) object;

ECommercePrint printEngine = homeRef.create();

outputContext = printEngine.renderDocuments(documentRequestList);

return outputContext;
}

Ref:- http://www.theserverside.com/discussions/thread.tss?thread_id=31495

1
  • The answer you listed is not realted to ICN not filenet
    – WiredCoder
    Commented Jan 10, 2019 at 7:59

Not the answer you're looking for? Browse other questions tagged or ask your own question.