1

我正在编写一个对 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 incompatible with javax.jms.ConnectionFactory. ”的地方。我不知道为什么会得到它在这里,但不在上面。我什至尝试用' javax.jms 显式声明所有对象。' 前缀,但我仍然收到相同的错误。

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

4

2 回答 2

0

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

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

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

于 2012-11-06T21:51:46.690 回答
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");
于 2018-08-02T17:45:41.513 回答