javax.jms.JMSSecurityException:MQJMS2008:无法打开MQ队列

时间:2011-04-13 19:30:47

标签: java jms websphere ibm-mq

我有一个基于JMS的应用程序,我在Websphere 6.0上运行,并且正在迁移到Websphere 7.两个Websphere服务器都支持Websphere MQ 6.0服务器。尝试将测试servlet部署到Websphere 7服务器时,我收到以下异常:

javax.jms.JMSSecurityException:MQJMS2008:无法打开MQ队列

Websphere 6.0:RHEL 5.3

Websphere 7.0.0.15:RHEL 5.3

Websphere MQ 6.0:Windows Server 2003

Servlet测试代码:

public class JMSTestServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
        String MQConnectionFactory, MQQueue; 

    public JMSTestServlet() {
        super();
        // TODO Auto-generated constructor stub
        System.out.println("JMSTestServlet: loading");

        URL urlProps = getClass().getClassLoader().getResource("META-INF/startup.properties");
        Properties props = new Properties();
        try
                {
          System.out.println("JMSTestServlet: loading properties");
          props.load( urlProps.openStream() );

                    MQConnectionFactory = props.getProperty("MQConnectionFactory"); 
                    MQQueue = props.getProperty("MQQueue"); 

          System.out.println("JMSTestServlet: loading properties ... done!");

          sendMessage("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
                } catch (IOException e)
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
    }

    protected void sendMessage(String messageString) { 
        QueueConnectionFactory fact;
        QueueConnection qConn = null;
        try { 
            System.out.println("JMSTestServlet: creating context");
            Context ctx = new InitialContext();
            fact = (QueueConnectionFactory)ctx.lookup(MQConnectionFactory);
            Destination destination = (Destination)ctx.lookup(MQQueue);

            System.out.println("JMSTestServlet: creating QueueConnection");
            qConn = fact.createQueueConnection(); 
            QueueSession    qSess = qConn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
            MessageProducer prod = qSess.createProducer(destination); 


            System.out.println("JMSTestServlet: sending Message");
            TextMessage message = qSess.createTextMessage();
            message.setText(messageString);
            prod.send(message); 

            System.out.println("JMSTestServlet: done sendMessage()");
        } catch ( JMSException ex ) {
            ex.toString(); 
            ex.printStackTrace();
            ex.getLinkedException().toString();
            ex.getLinkedException().printStackTrace();
        } catch ( NamingException ex ) {
            System.out.println("JMSTestServlet: naming exception " + ex.toString());
            ex.printStackTrace();
        } catch ( Exception ex ) {
          System.out.println("JNDI API lookup failed: " +         ex.toString());
            ex.printStackTrace();           
        } finally {
            System.out.println("JMSTestServlet: cleaning up sendMessage()");

            try
            {
                if ( qConn != null ) qConn.close();
            } catch (JMSException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try { 
            String messageString = request.getParameter("message"); 
            sendMessage(messageString);
        } finally {
        }
    }

属性文件是:

MQConnectionFactory=jms/QUEUECONNFACTORY
MQQueue=jms/QUEUE 

当部署到Websphere 6时,我在远程队列中收到消息。当我部署到Websphere 7时,我得到:

[4/13/11 14:53:55:622 EDT] 0000005c ConnectionEve A   J2CA0056I: The Connection Manager received a fatal connection error from the Resource Adapter for resource JMS$QUEUECONNFACTORY$JMSManagedConnection@15. The exception is: javax.jms.JMSSecurityException: MQJMS2008: failed to open MQ queue 'QUEUE'.
[4/13/11 14:53:55:622 EDT] 0000005c ConnectionEve W   J2CA0206W: A connection error occurred.  To help determine the problem, enable the Diagnose Connection Usage option on the Connection Factory or Data Source.
[4/13/11 14:53:55:623 EDT] 0000005c ConnectionEve A   J2CA0056I: The Connection Manager received a fatal connection error from the Resource Adapter for resource jms/QUEUECONNFACTORY. The exception is: javax.jms.JMSSecurityException: MQJMS2008: failed to open MQ queue 'QUEUE'.
[4/13/11 14:53:55:625 EDT] 0000005c SystemErr     R   javax.jms.JMSSecurityException: MQJMS2008: failed to open MQ queue 'QUEUE'.

我很确定我已经在两个Websphere服务器上配置了队列和连接工厂。我对如何解决这个问题感到茫然,谷歌没有任何帮助。

更新2011-04-15: 我从日志中提取了以下错误:

  

com.ibm.mq.MQException:MQJE001:完成代码'2',原因'2035'

我已经在几个地方读过它,我真的看不出WAS 6和WAS 7之间的区别导致了这个问题。

我在两个Linux主机上以root身份运行websphere。我在Windows机器上创建了一个root帐户,具有对MQ安装的完全权限:

  

setmqaut -t qmgr -m QM_webspheremq -p root + all

2 个答案:

答案 0 :(得分:1)

自2019年1月以来,每隔四个月该帖子被“社区用户击中”,因此我会回答这个旧帖子。


首先了解一些背景

  • WAS 6.0

    • Websphere MQ v5.3中包含的MQ jar文件
    • 取决于WAS 6.0的特定版本,罐子的范围从Websphere MQ v5.3 CSD08到CSD14
  • WAS 7.0.0.15

    • 本应包括WebSphere MQ JCA资源适配器7.0.1.3版(此处的默认行为是MQ v5.3 jar的行为),但是由于存在错误,如果从WAS 7.0.0.0升级到WAS 7.0.0.15,WAS 7.0.0.0随附的WebSphere MQ JCA资源适配器7.0.0.0版将保留在原处。

区别:

  • 对于MQ v5.3 jar文件,当您调用fact.createQueueConnection();时,空白的用户ID将发送到队列管理器。如果您连接的SVRCONN通道具有空白的MCAUSER属性,则该连接将在Windows MQ队列管理器运行时所使用的用户帐户的权限下运行。换句话说,您将获得队列管理器和所有队列的完全权限(完全MQ管理员权限)。

  • 使用MQ v7.0.0.0资源适配器,当您调用fact.createQueueConnection();时,JVM进程ID将被发送到队列管理器。如果您连接的SVRCONN通道具有空白的MCAUSER属性,则Windows MQ队列管理器将尝试在JVM进程ID的授权下运行连接。根据您问题中的信息,该用户为root


摘要:

它在Websphere 6.0下工作,因为该连接以完全的MQ Admin权限运行。

在Websphere 7.0.0.15下失败,因为连接以root用户权限运行,在这种情况下,您仅向root用户提供all权限给队列管理器({ {1}})本身,但没有对qmgr的授权。

Websphere必须首先连接并查询队列管理器对象,然后才能打开任何队列。您遇到的错误是QUEUE。这意味着您确实已成功连接到队列管理器,但之后却无法连接到队列。

可以通过向javax.jms.JMSSecurityException: MQJMS2008: failed to open MQ queue 'QUEUE'.用户提供QUEUE的权限来解决此问题:

root


请注意,该问题中列出的所有软件版本现在(8.5年后)已不再受IBM支持。除非您使用某种其他方法(例如安全出口)将MCAUSER设置为非MQ管理员ID,否则也不建议使用setmqaut -t q -m QM_webspheremq -n QUEUE -p root +put +get +browse +inq +dsp频道为空白SVRCONN的频道。在当前的IBM MQ版本中,可以将TLS与在队列管理器上映射到非MQ管理员ID的客户端证书一起使用,或者在不具有cert +连接认证的TLS上使用,以验证客户端在队列管理器中发送的用户ID和密码。

答案 1 :(得分:0)

我也遇到了同样的错误。检查您的端口,队列管理器和队列详细信息。对我而言,这是不正确的通道。

对于其他用户: 当您拥有MQJMS2008时,您无权操作该队列,您必须获得一个嵌套的Exception,它为您提供有关错误的更多信息,并告诉您MQRC原因代码和终止代码。

有关原因代码的详细信息,请打开CMD并键入mqrc

分析您的错误,看起来您可以访问该队列,我有一些问题:

您使用JNDI进行连接吗?如果要连接一个使PTP连接的类(我的意思是不使用JNDI),如果您想了解有关PTP连接的更多信息,则必须为MQQueueConnectionFactory提供通道,队列管理器,队列名称和服务器的主机名。 ,这是:http://hursleyonwmq.wordpress.com/2007/05/29/simplest-sample-applications-using-websphere-mq-jms/

如果您使用远程队列执行此操作并且在Windows上使用MQSeries而不是WMQ,则必须向公众授予所有权限。 使用WRKMQMQ。

如果您可以提供嵌套异常,我会帮助您。