JMS中的信息分为头(header),属性(property)和主体(body)
消息有以下几种类型,他们都是派生自message接口
StreamMessage,MapMessage,TextMessage,ObjectMessage,BytesMessage
JMS支持两种消息传递方式,点对点(point-to-point,简称PTP)和发布/订阅)publish/subscribe,简称pub/sub)
区别是:PTP规定一条消息只能传递给一个接收方,采用javx.jms.Queue表示
pub/sub消息允许一条消息传递给多个接收方,采用javax.jms.Topic表示
这两种模型都通过扩展公用基类来实现,例如:javax.jms.Queue和javax.jms.Topic都扩展自javax.jms.Destination类
ejbtest-service.xml(将该文件发布到$JBOSS_HOME/deploy目录下,就会在jboss服务器上生成一个命名空间为queue/ejbtestQueue的消息服务
目标地址).
<?xml version="1.0" encoding="UTF-8"?>
<server>
<mbean code="org.jboss.mq.server.jmx.Queue"
name="org.mq.destination:service=Queue,name=ejbtestQueue">
<attribute name="JNDIName">queue/ejbtestQueue</attribute>
<depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
</mbean>
</server>
一:PTP(点对点的消息发送方式)
一个发送消息的类文件:
package com.itcast.driveMesBean;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSession;
import javax.jms.TextMessage;
import javax.naming.InitialContext;
public class QueueSender{
/**
* @param args
*/
public static void main(String[] args) {
try {
// TODO Auto-generated method stub
InitialContext ctx = new InitialContext();
QueueConnectionFactory factory = (QueueConnectionFactory)ctx.lookup("QueueConnectionFactory");
QueueConnection conn = factory.createQueueConnection();
//false表示不启动事务, QueueSession.AUTO_ACKNOWLEDGE自动的消息确认模式
QueueSession session = conn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
Destination destination = (Destination)ctx.lookup("queue/ejbtestQueue");
MessageProducer producter = session.createProducer(destination);
producter.send(session.createTextMessage("你好,jboss,我是高歌"));
session.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
一个消息驱动bean:
package com.itcast.driveMesBean;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
@MessageDriven(activationConfig =
{
@ActivationConfigProperty(propertyName="destinationType",
propertyValue="javax.jms.Queue"),
@ActivationConfigProperty(propertyName="destination",
propertyValue="queue/ejbtestQueue")
})
public class MessageDriverBean implements MessageListener {
public void onMessage(Message message){
TextMessage msg = (TextMessage)message;
try {
System.out.println(msg.getText());
} catch (Exception e) {
e.printStackTrace();
}
}
}
二:pub/sub(发布消息和订阅消息)
ejbtest-service.xml(将该文件发布到$JBOSS_HOME/deploy目录下,就会在jboss服务器上生成一个命名空间为queue/ejbtestQueue和
topic/ejbtestTopic,的消息服务目标地址).
<?xml version="1.0" encoding="UTF-8"?>
<server>
<mbean code="org.jboss.mq.server.jmx.Queue"
name="org.mq.destination:service=Queue,name=ejbtestQueue">
<attribute name="JNDIName">queue/ejbtestQueue</attribute>
<depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
</mbean>
<mbean code="org.jboss.mq.server.jmx.Topic"
name="org.mq.destination:service=Topic,name=ejbtestTopic">
<attribute name="JNDIName">topic/ejbtestTopic</attribute>
<depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
</mbean>
</server>
1:一个topic消息的发送类:
package com.icast.app;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicSession;
import javax.naming.InitialContext;
public class TopicSender {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
// TODO Auto-generated method stub
InitialContext ctx = new InitialContext();
TopicConnectionFactory factory = (TopicConnectionFactory)ctx.lookup("TopicConnectionFactory");
TopicConnection conn = factory.createTopicConnection();
//false表示不启动事务, QueueSession.AUTO_ACKNOWLEDGE自动的消息确认模式
TopicSession session = conn.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE);
Destination destination = (Destination)ctx.lookup("topic/ejbtestTopic");
MessageProducer producter = session.createProducer(destination);
producter.send(session.createTextMessage("你好,jboss,我是高歌,来自topic应用"));
session.close();
conn.close();
System.out.println("消息发送完毕!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
2:两个接受topic信息的类:
package com.itcast.driveMesBean;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
@MessageDriven(activationConfig =
{
@ActivationConfigProperty(propertyName="destinationType",
propertyValue="javax.jms.Topic"),
@ActivationConfigProperty(propertyName="destination",
propertyValue="topic/ejbtestTopic")
})
public class TopicMsgDriverBean implements MessageListener{
public void onMessage(Message message){
TextMessage msg = (TextMessage)message;
try {
System.out.println(this.getClass() +msg.getText());
} catch (Exception e) {
e.printStackTrace();
}
}
}
另一个接受topic信息的类:
package com.itcast.driveMesBean;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
@MessageDriven(activationConfig =
{
@ActivationConfigProperty(propertyName="destinationType",
propertyValue="javax.jms.Topic"),
@ActivationConfigProperty(propertyName="destination",
propertyValue="topic/ejbtestTopic")
})
public class OtherTopicMsgDriverBean implements MessageListener{
public void onMessage(Message message){
TextMessage msg = (TextMessage)message;
try {
System.out.println(this.getClass() + msg.getText());
} catch (Exception e) {
e.printStackTrace();
}
}
}
总结:queue信息可以先有客户短发送,然后再部署messageDriveBean,仍然可以收到信息;
而topic就必须先部署相应的messageDriveBean,然后客户端发送的时候才可以看到信息。