jms中将服务器端部署在jboss服务器中启动时会遇到这样一个问题,就是提示myqueue notbound,这也是我们部署类似jms的实例过程中很常见的一个问题。
实例代码如下:
客户端代码如下:
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.TextMessage;
import javax.naming.InitialContext;
public class MyQueueMDBBeanClient {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
InitialContext context = new InitialContext();
//获取QueueConnectionFactory对象
QueueConnectionFactory factory =(QueueConnectionFactory)context.lookup("ConnectionFactory");
//创建QueueConnection
QueueConnection connection = factory.createQueueConnection();
//创建Queuesession对象
QueueSession session = connection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
//获取Destination对象
Queue queue = (Queue)context.lookup("queue/myqueue");
//创建文本消息
TextMessage msg = session.createTextMessage("世界,您好");
//创建发送者
QueueSender sender = session.createSender(queue);
//发送消息
sender.send(msg);
//关闭会话
session.close();
connection.close();
System.out.println("消息已发送");
}
}
服务器端代码如下:
import javax.ejb.MessageDriven;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
import javax.ejb.ActivationConfigProperty;
@MessageDriven(
activationConfig = {
@ActivationConfigProperty(propertyName="destinationType",propertyValue="javax.jms.Queue"),
@ActivationConfigProperty(propertyName="destination",propertyValue="queue/myqueue")
}
)
public class MyQueueMDBBean implements MessageListener {
public void onMessage(Message msg) {
try{
TextMessage textMessage = (TextMessage)msg;
System.out.println("MyQueueMDBBean被调用了【" +textMessage.getText() +"】");
}catch(JMSException e){
e.printStackTrace();
}
}
}
这个问题主要是jboss升级版本之后不再认可这种写法了,所以我们需要在JBoss根目录\server\default\deploy下的mail-service.xml文件中加入如下内容:
<mbeancode="org.jboss.mq.server.jmx.Queue"name="jboss.org.destination:server=Queue,name=myqueue" >
<attributename="JNDIName" >queue/myqueue</attribute>
<dependsoptional-attribute-name = "DestinationManager" >jboss.mq:service=DestinationManager </depends>
< /mbean>
以上解决方案并不是唯一的解决方案,所以不要认为是必须要有这个xml文件,网上还有人用第二种解决方案,就是:在annotation里把destination的 "jms/" 改成 "queue/.根本原因是在实例中jms destination 的JNDI写的是"jms/xxxx",而jboss已经不识别这种写法了,我们改为queue后jboss就自动识别了,就省得去改xml文件了.不过我没有实验成功,这个有待继续考证一下.