消息中间件一般有两种传递模型:点对点模型(PTP)和发布-订阅模型(Pub/Sub)。
1. 点对点模型(PTP)
点对点模型用于消息生产者和消息消费者之间点到点的通信。消息生产者将消息发动到由某个名字标识的特定消费者。这个名字实际上对应于消息服务中的一个队列(Queue),在消息传动给消费者之前它被存储在这个队列中。队列可以是持久的,以保证在消息服务出现故障时仍然能够传递消息。
P2P模式的测试
在jboss中部署下面的 消息驱动bean
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
//默认是无状态的session bean
@MessageDriven(
activationConfig={
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue" ),
@ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/myqueue")
}
)
public class QueueMessageBean implements MessageListener {
//1.Text
//2.Map
//3.Object
//4.steam
//5.byte
public void onMessage(Message msg) {
TextMessage txtMsg=(TextMessage)msg;
String s="";
try {
s = txtMsg.getText();
} catch (JMSException e) {
e.printStackTrace();
}
System.out.println("QueueMessageBean接收到了消息:"+s);
}
}
客户端的测试类
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSession;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class Test {
public static void main(String[] args) throws NamingException, JMSException {
InitialContext context;
context = new InitialContext();
//获得QueueConnectionFactory
QueueConnectionFactory factory =(QueueConnectionFactory)context.lookup("QueueConnectionFactory");
//创建QueueConnection
QueueConnection conn=factory.createQueueConnection();
//创建会话
//p1:与事务有关 true:表示最后提交 false:表示自动提交
//p2:表示接收方向消息中间件发送确认通知,我们这里采用自动通知类型
QueueSession session=conn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
//取得destination
Queue queue=(Queue)context.lookup("queue/myqueue");
//消息生产者
MessageProducer sender=session.createProducer(queue);
//定义消息
Message msg=session.createTextMessage("消息来了");
//发送消息
sender.send(queue, msg);
session.close();
conn.close();
}
}