来自远程客户端的 websphere jms 队列访问

websphere jms queue access from remote client

背景 我是 php 和前端 Web 开发人员,在 Java 中开发一个应用程序,使用 Netbeans 从 websphere(我认为是 V8.5)JMS 队列中读取,然后向适当的 scripts/servers 发出命令。这是我在 Java 大约 10 年来的第一个专业 运行,所以请多多包涵。我的初始测试应用程序 运行 在托管 jms 队列的服务器上运行正常,但是当我尝试从远程位置(目前恰好是windows 但最后会是 linux)。我一直在与 Java 诊断 jar 问题和从 websphere 和其他地方找到明显需要的 jar 的过程中缺乏经验作斗争,但最终遇到了困难。我已经看到很多答案包含诸如 "you need the right jar files" 之类的语句,但没有说明哪些或您需要 thisone.jar 以及一个引用的所有罐子。我不知道如何找出应该是什么罐子。我读过 post 说该过程应该只适用于我库中的一些 jar。我完全卡住了...

错误 我没有运气通过的错误

 javax.naming.NamingException: Failed to initialize the ORB [Root
 exception is org.omg.CORBA.INITIALIZE: can't instantiate default ORB
 implementation com.ibm.CORBA.iiop.ORB

完整的消息内容如下

javax.naming.NamingException: Failed to initialize the ORB [Root exception is
org.omg.CORBA.INITIALIZE: can't instantiate default ORB implementation 
com.ibm.CORBA.iiop.ORB  vmcid: 0x0  minor code: 0  completed: No]   
at com.ibm.ws.naming.util.Helpers.getOrb(Helpers.java:314)     
javax.naming.NamingException: Failed to initialize the ORB [Root exception is  org.omg.CORBA.INITIALIZE: can't instantiate default ORB implementation  
com.ibm.CORBA.iiop.ORB  vmcid: 0x0  minor code: 0  completed: No]   
at com.ibm.ws.naming.util.WsnInitCtxFactory.getInitialContextInternal(WsnInitCtxFactory.java:384)   
at com.ibm.ws.naming.util.WsnInitCtx.getContext(WsnInitCtx.java:113)    
at com.ibm.ws.naming.util.WsnInitCtx.getContextIfNull(WsnInitCtx.java:428)  
at com.ibm.ws.naming.util.WsnInitCtx.lookup(WsnInitCtx.java:144)    
at javax.naming.InitialContext.lookup(InitialContext.java:411)  
at jmstool2.JmsConn.CreateFactCon(JmsConn.java:101)     
at jmstool2.JmsConn.connect(JmsConn.java:56)    
at jmstool2.Jmstool2.main(Jmstool2.java:20) 
Caused by: org.omg.CORBA.INITIALIZE: can't instantiate default ORB implementation com.ibm.CORBA.iiop.ORB  vmcid: 0x0  minor code: 0  completed: No  
at org.omg.CORBA.ORB.create_impl(ORB.java:327)  
at org.omg.CORBA.ORB.init(ORB.java:367)     
at com.ibm.ws.orb.GlobalORBFactory.init(GlobalORBFactory.java:85)   
at com.ibm.ejs.oa.EJSORBImpl.initializeORB(EJSORBImpl.java:174)     
at com.ibm.ejs.oa.EJSClientORBImpl.<init>(EJSClientORBImpl.java:97)     
at com.ibm.ejs.oa.EJSClientORBImpl.<init>(EJSClientORBImpl.java:73)     
at com.ibm.ejs.oa.EJSORB.init(EJSORB.java:386)  
at com.ibm.ws.naming.util.Helpers.getOrb(Helpers.java:305)  ... 8 more 
Caused by: java.lang.NoSuchFieldError: UNKNOWN  
at com.ibm.rmi.util.RepositoryId.createHashString(RepositoryId.java:738)    
at com.ibm.rmi.util.RepositoryId.<clinit>(RepositoryId.java:254)    
at com.ibm.rmi.iiop.CDROutputStream.<clinit>(CDROutputStream.java:1107)     
at com.ibm.rmi.corba.ORB.<init>(ORB.java:281)   at com.ibm.rmi.iiop.ORB.<init>(ORB.java:187)    at com.ibm.CORBA.iiop.ORB.<init>(ORB.java:576)  
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)    
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)     
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at java.lang.Class.newInstance(Class.java:374)
at org.omg.CORBA.ORB.create_impl(ORB.java:325)  ... 15 more

我在做什么 我已将以下 jar 添加到库中

javax.jms-1.1.jar 
com.ibm.ws.orb_8.5.0.jar 
com.ibm.ws.ejb.thinclient_8.5.0.jar 
com.ibm.was.sib.client.thin.jms_8.5.0.jar 
com.ibm.was.admin.client_8.5.0.jar 
com.ibm.ws.messagingClient.ja

我也看到需要以下jar

sibc.jms.jar
sibc.jndi.jar
sibc.orb.jar

我已经找到并添加了它们,尽管我还了解到如果您拥有我已有的瘦客户端,则不需要这些。

并且正在使用 JDK1.7

context factory: com.ibm.websphere.naming.WsnInitialContextFactory 
Provider URL: corbaloc:iiop:192.168.254.202:2809

正在创建上下文。但是无法建立队列工厂连接。我可以使用快速测试应用程序创建到 ip 地址和 post 的套接字。

代码 这是 class 文件和所有连接位。正在完成工作。

import java.util.Hashtable;
import javax.naming.*;  
import javax.jms.*;
import com.ibm.CORBA.*;
import com.ibm.ws.*; /* 
/**

 * Connection Factory Notes on IBM Websphere
 * 
 * jndi/INConnectionFactory
 * jndi/OUTConnectionFactory 
 * 
 * jndi/INQueue
 * jndi/OUTQueue
 * 
 * jndi/INActivation  
 * jndi/OUTActivation  
 * 
 * websphere server:  192.168.254.202
 * 
 * JMS queued port: 5558  unsecured (MQ)   and 5578 secure
 * JMS Security Port 5557
 * JMS Direct Port: 5559
 * SOAP: 9976
 * //other ports mentioned: 7276 (unsecured) and 7286 (secured)
 * NOTE:  A bootstrap address with no port specification defaults to port 2809
 */
public class JmsConn {
    /*int jmsQueuedPort   = 5558;
    int jmsSecrityPort  = 5557;
    int jmsDirectPort   = 5559;
    int soapPort        = 9976;*/
    int bootstrap       = 2809; //default port
    int bootstrap10     = 2810;
    int unSecPort       = 7276;
    String serverIP     = "192.168.254.202";    
    String scheme       = "corbaloc:iiop:"; //e.g. ws, ldap,iiop, corbaloc:iiop
    String contextFactory   = "com.ibm.websphere.naming.WsnInitialContextFactory";
    String queueInName      = "jndi/INQueue";
    String queueOutName     = "jndi/OUTQueue";
    String outFactory       = "jndi/OUTConnectionFactory";
    String inFactory        = "jndi/INConnectionFactory";
    InitialContext jndiContext;
    ConnectionFactory connectionFactory;
    Connection qConn;
    String providerUrl = scheme+serverIP+":"+bootstrap;
    Session qSession;
    Queue q;


    public void connect() {          
        this.CreateContext();
        this.CreateFactCon(this.outFactory);
        this.getQueue(this.queueOutName);

    }

    public void Lookup(String thingToLookup){
        try{
            System.out.println("Attempting to lookup "+thingToLookup);
        }catch(Exception ex){
            System.out.println("ERROR: Could not perform lookup of  " + thingToLookup +             
                System.lineSeparator() + ex.toString());
           // System.out.println("Lookup Result: " + this.jndiContext.lookup);
            System.exit(3);
        }

    }


    public void CreateContext(){
        try{
            System.out.println("Attempting to create connection context");
            Hashtable env = new Hashtable(); // [jh] in theory this has been superceeded 
              // and should use HashMap
            env.put(Context.INITIAL_CONTEXT_FACTORY,this.contextFactory);
            System.out.println("context factory: "+this.contextFactory);
            System.out.println("Provider URL: "+this.providerUrl);
            env.put(Context.PROVIDER_URL, providerUrl); //+":"+this.jmsDirectPort
            try{
                this.jndiContext = new InitialContext(env);
                //this.jndiContext = new InitialContext();
            }catch(NamingException e){
                System.out.println("ERROR: Could not create JNDI context: " +  
                   System.lineSeparator() + e.toString());
                System.exit(1);
            }

            System.out.println("End of CreateContext.");  

        }catch(Exception exc){
            System.out.println("ERROR in CreateContext: "+exc.toString());
            System.exit(1);

        }
    }

    public void CreateFactCon(String factory){
        try{
            System.out.println("Attmepting to create factory lookup:");
            this.connectionFactory = (ConnectionFactory)this.jndiContext.lookup(factory);


        }catch(NamingException e){
            System.out.println("ERROR: Could not create factory connection:");
            e.printStackTrace(System.err);
            System.out.println(e.toString());
            System.exit(2);
        }
        System.out.println("Lookup successfull:");

        try{
            System.out.println("Attmepting to create connection:");
            this.qConn = this.connectionFactory.createConnection();
            this.qSession = qConn.createSession(false,Session.AUTO_ACKNOWLEDGE);
        }catch(Exception e){
            e.printStackTrace(System.err);
            System.out.println(e.toString());
            System.exit(4);
        }
        System.out.println("Connection successful.");



        System.out.println("End of CreateFactoryConnection.");            
    }


    public void getQueue(String queueName){
        try{
            this.q = (Queue)this.jndiContext.lookup(queueName);
        }catch(Exception e){
             System.out.println("ERROR: Could not get Queue:");
            e.printStackTrace(System.err);
            System.out.println(e.toString());
            System.exit(2);
        }
    }
    }

更新 将 jar 文件缩减为

com.ibm.ws.orb_8.5.0.jar com.ibm.ws.wjb.thingclient_8.5.0.jar com.ibm.ws.sib.client.thin.jms_8.5.0.jar

抛出以下错误

javax.naming.NamingException: Error getting WsnNameService properties [Root exception is org.omg.CORBA.TRANSIENT: initial and forwarded IOR inaccessible  vmcid: 0x4942f000  minor code: 3591  completed: No]
    at com.ibm.ws.naming.util.WsnInitCtxFactory.mergeWsnNSProperties(WsnInitCtxFactory.java:1552)
    at com.ibm.ws.naming.util.WsnInitCtxFactory.getRootContextFromServer(WsnInitCtxFactory.java:1042)
    at com.ibm.ws.naming.util.WsnInitCtxFactory.getRootJndiContext(WsnInitCtxFactory.java:962)
    at com.ibm.ws.naming.util.WsnInitCtxFactory.getInitialContextInternal(WsnInitCtxFactory.java:614)
    at com.ibm.ws.naming.util.WsnInitCtx.getContext(WsnInitCtx.java:128)
    at com.ibm.ws.naming.util.WsnInitCtx.getContextIfNull(WsnInitCtx.java:765)
    at com.ibm.ws.naming.util.WsnInitCtx.lookup(WsnInitCtx.java:164)
    at com.ibm.ws.naming.util.WsnInitCtx.lookup(WsnInitCtx.java:179)
    at javax.naming.InitialContext.lookup(InitialContext.java:411)
    at jmstool2.JmsConn.CreateFactCon(JmsConn.java:104)
    at jmstool2.JmsConn.connect(JmsConn.java:59)
    at jmstool2.Jmstool2.main(Jmstool2.java:20)
Caused by: org.omg.CORBA.TRANSIENT: initial and forwarded IOR inaccessible  vmcid: 0x4942f000  minor code: 3591  completed: No
    at com.ibm.rmi.corba.ClientDelegate.createRequest(ClientDelegate.java:1250)
    at com.ibm.CORBA.iiop.ClientDelegate.createRequest(ClientDelegate.java:1321)
    at com.ibm.rmi.corba.ClientDelegate.createRequest(ClientDelegate.java:1146)
    at com.ibm.CORBA.iiop.ClientDelegate.createRequest(ClientDelegate.java:1287)
    at com.ibm.rmi.corba.ClientDelegate.request(ClientDelegate.java:1853)
    at com.ibm.CORBA.iiop.ClientDelegate.request(ClientDelegate.java:1243)
    at org.omg.CORBA.portable.ObjectImpl._request(ObjectImpl.java:449)
    at com.ibm.WsnBootstrap._WsnNameServiceStub.getProperties(_WsnNameServiceStub.java:38)
    at com.ibm.ws.naming.util.WsnInitCtxFactory.mergeWsnNSProperties(WsnInitCtxFactory.java:1549)
    ... 11 more
Java Result: 2

检查这个 - Installing and configuring the Thin Client for JMS with WebSphere Application Server

您现在唯一需要的罐子是:

com.ibm.ws.orb_8.5.0.jar 
com.ibm.was.sib.client.thin.jms_8.5.0.jar 
com.ibm.ws.ejb.thinclient_8.5.0.jar 

所以请从您的类路径中删除所有其他的。 并确保这些 jar 也在您的 运行 类路径中,而不仅仅是在构建期间。

对于初始上下文,请尝试以下操作:

Hastable env = new Hastable();
env.put(Context.PROVIDER_URL,"iiop://localhost:2809");  // if using default ports
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory");
InitialContext ctx = new InitialContext(env);

更新 /etc/resolv.conf 文件(在 Linux 上)并将域名添加到搜索参数中,让 OS 尝试解析主机名,添加域名, 并调用 DNS。如果 IP 地址随时间变化,您的系统将继续能够将无域主机名解析为正确的 IP 地址。

例如:主机名“jmsserver”

Content of /etc/resolv.conf:
domain          mydom.com
nameserver      192.168.1.250
search          xyz.com good.com what.ever.ca

如果 jmsserver 在 good.com 上,OS 将使用 DNS 并尝试解析 jmsserver。mydom.com,jmsserver.xyz.com,会在jmsserver.good.com上成功获取IP路由到目的地的地址。