javax.jms.JMSSecurityException: MQJMS2008: не удалось открыть очередь MQ - PullRequest
2 голосов
/ 13 апреля 2011

У меня есть приложение на основе JMS, в котором я работаю на Websphere 6.0, и перехожу на Websphere 7. Оба сервера Websphere поддерживаются сервером Websphere MQ 6.0.При попытке развернуть тестовый сервлет на сервере Websphere 7 появляется следующее исключение:

javax.jms.JMSSecurityException: MQJMS2008: не удалось открыть очередь MQ

Websphere6.0: RHEL 5.3

Websphere 7.0.0.15: RHEL 5.3

Websphere MQ 6.0: Windows Server 2003

Код проверки сервлета:

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 одинаково.Я в растерянности относительно того, как решить эту проблему, и Google не поможет.

Обновление 2011-04-15: Я извлек следующую ошибку из журналов:

com.ibm.mq.MQException: MQJE001: ЗавершениеКод «2», причина «2035»

Я читал об этом в нескольких местах, и я действительно не вижу, где есть разница между WAS 6 и WAS 7, чтобы этовопрос.

Я использую websphere на обоих хостах Linux от имени пользователя root.У меня есть учетная запись root, созданная на компьютере Windows с полными разрешениями для установки MQ:

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

1 Ответ

0 голосов
/ 04 ноября 2016

Я тоже получал ту же ошибку. Проверьте ваш порт, queuemanager и детали очереди. Для меня это был канал, который был неправильным.

Для других пользователей: Если у вас есть MQJMS2008, у вас нет разрешений на манипулирование этой очередью, вы должны получить вложенное исключение, которое дает вам дополнительную информацию о вашей ошибке, а также код причины MQRC и код завершения.

Для получения дополнительной информации о коде причины откройте CMD и введите mqrc

Анализ вашей ошибки, похоже, вам разрешен доступ к этой очереди, у меня есть несколько вопросов:

Вы подключаетесь через JNDI? Если вы соединяетесь с классом, который устанавливает PTP-соединение (я имею в виду не использование JNDI), вы должны предоставить MQQueueConnectionFactory канал, администратор очередей, имя очереди и имя хоста сервера, если вы хотите узнать больше о PTP-соединениях вот: http://hursleyonwmq.wordpress.com/2007/05/29/simplest-sample-applications-using-websphere-mq-jms/.

Если вы делаете это с удаленной очередью и используете MQSeries, а не WMQ в Windows, вы должны предоставить общественности все привилегии. Используйте WRKMQMQ.

Если вы можете дать вложенное исключение, я вам помогу.

...