在MQ应用程序中接收异常:com.ibm.mq.jms.MQQueue与javax.jms.ConnectionFactory不兼容

时间:2012-11-06 17:50:12

标签: java-ee jms ibm-mq

我正在编写一个在WebSphere MQ队列上执行某些操作的应用程序。该方法特别将消息从一个队列移动到另一个队列。我遇到以下代码没有问题:

Context ctx = new InitialContext();
ConnectionFactory retrieveConnectionFactory = (ConnectionFactory) ctx.lookup(jndiPrefix + "/" + qcfName);
retrieveConnection = retrieveConnectionFactory.createConnection();
Queue source = (Queue) ctx.lookup(jndiPrefix + "/" + sourceQueue);
retrieveConnection.start();
retrieveSession = retrieveConnection.createSession(true, Session.AUTO_ACKNOWLEDGE);
String queueSearchSpec = buildSearchSpec(searchSpec);
consumer = retrieveSession.createConsumer(source, queueSearchSpec);

do {
    qMessage = consumer.receiveNoWait();
    if (qMessage != null) {
        messages.add(qMessage);
        numberOfMessages++;
    }
} while (qMessage != null);

但是,稍后,我正在做一些非常相似的事情,除了我收到一个施法异常:

ConnectionFactory putConnectionFactory = (ConnectionFactory) ctx.lookup(jndiPrefix + "/" + destinationQueue);           
// this is where the exception is occurring-- Error: com.ibm.mq.jms.MQQueue incompatible with javax.jms.ConnectionFactory
putConnection = putConnectionFactory.createConnection();
Queue destination = (Queue) ctx.lookup(jndiPrefix + "/" + destinationQueue);
putConnection.start();
putSession = putConnection.createSession(true, Session.AUTO_ACKNOWLEDGE);
MessageProducer producer = putSession.createProducer(destination);
for(int i = 0; i < messages.size(); i++)
{
    producer.send(messages.get(i));
}

请注意上面摘录第二行中的注释:这是我收到异常消息“ com.ibm.mq.jms.MQQueue与javax.jms.ConnectionFactory不兼容的地方。 “我不知道为什么我会在这里得到它,但不是在上面。我甚至尝试使用' javax.jms。'前缀明确声明所有对象,但我仍然收到相同的错误。

我在WebSphere Application Server v7.0上运行我的应用程序。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

我这个愚蠢的错误。在这一行:

ConnectionFactory putConnectionFactory = (ConnectionFactory) ctx.lookup(jndiPrefix + "/" + destinationQueue);

ctx.lookup中的第二个变量应该是队列连接工厂, qcfName ,就像上面的代码一样。我已经包含 destinationQueue ,它指的是邮件将被移动到的队列。

答案 1 :(得分:0)

要将消息发送到Websphere MQ,您需要顺序执行两次上下文查找。

1-用于获取队列连接工厂。

ConnectionFactory factory = (ConnectionFactory) context.lookup("java:comp/env/jms/myQCF");

2-用于获取队列本身。

Queue queue =(Queue)context.lookup("java:comp/env/jms/myQ");