【发布时间】:2014-02-20 09:26:04
【问题描述】:
我正在尝试为 JMS 队列创建 POC。我使用 spring mvc 控制器作为 jms 的客户端。尝试将异步侦听器添加到 MessageConsumer 对象(代码 sn-p)时出现以下错误。我在某处读到只能将侦听器添加到 MDB(消息驱动 bean)中,这是真的吗?
设置:为 JMS 使用 websphere 服务器总线。为 conn factory、destinations 等添加了 jndi,以便同步操作一切正常。但是,对于异步,这是行不通的。
使用this 设置JMS
[1/28/14 14:38:12:570 CST] 0000005d SystemErr R javax.jms.IllegalStateException: CWSIA0084E: The method MessageConsu
mer.setMessageListener is not permitted in this container.
[1/28/14 14:38:12:572 CST] 0000005d SystemErr R at com.ibm.ws.sib.api.jms.impl.JmsMsgConsumerImpl._setMessageListen
er(JmsMsgConsumerImpl.java:660)
[1/28/14 14:38:12:573 CST] 0000005d SystemErr R at com.ibm.ws.sib.api.jms.impl.JmsMsgConsumerImpl.setMessageListene
r(JmsMsgConsumerImpl.java:609)
代码:
public void connect(String hostName, String portNumber,
String connectionFactoryString, String consumerJNDIName)
throws Exception {
Hashtable env = new Hashtable();
env.put(Context.PROVIDER_URL, "iiop://" + hostName + ":" + portNumber
+ "");
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.ibm.websphere.naming.WsnInitialContextFactory");
InitialContext initialContext = new InitialContext(env);
ConnectionFactory connectionFactory = (ConnectionFactory) initialContext
.lookup(connectionFactoryString);
connection = connectionFactory.createConnection();
connection.start();
// create destination - JMSQueue
Destination destinationReceiver = (Destination) initialContext
.lookup(consumerJNDIName);
consumerSession = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
consumer = consumerSession.createConsumer(destinationReceiver);
consumer.setMessageListener(new MessageListener() { **// ERROR here**
public void onMessage(Message msg) {
try {
System.out.println("received: " + ((TextMessage) msg).getText());
} catch (JMSException ex) {
ex.printStackTrace();
}
}
});
}
【问题讨论】:
-
您的 WebSphere Application Server 版本是多少?
-
这是什么意思 - “对于异步,这不起作用”? JMS 本身就是异步协议。您实施的示例并不正确。需要从 JMS Queue 消费消息吗?
标签: java jakarta-ee asynchronous jms websphere