MDB用于异步通信,其原理与android中的Intent和IntentFilter类似
MDB实际就是个监视特定地点destination的监听器
关于消息MDB只关心 消息格式和消息目的
JMS异步,安全(确保发送成功且只发送一次消息)
JMS像JDBC一样只是一个接口,标准。有P2P和Pub/Sub两种形式
消息分为 消息头,消息属性,消息体
MDB开发流程。(和MDB通信的唯一手段是将JMS消息发送给MDB正在监听的目的)(MDB也是无状态的bean)
配置消息目标地址,文件遵守 *-service.xml 格式 如mymdb-service.xml例子如下
<?xml version="1.0" encoding="UTF-8" ?>
2。消息生产者
InitialContext jndi=new InitialContext();
Destination 目的地
destination=(Queue)jndi.lookup("queue/jsun");
QueueConnectionFactory 连接工厂
factory = (QueueConnectionFactory)jndi.lookup("ConnectionFactory");
QueueConnection P2P连接 //TopicQueueConnection为订阅/发布连接
conn = factory.createQueueConnection();
Session 会话
session=conn.createQueueSession(false,QueueSession.AUTO_ACKNOWLEDGE);
//false 表示会话不需要事务,第二个参数说明消息为自动确认模式
MessageProducer 消息生产者
pro=session.createProducer(destination);
发送
pro.send(session.createTextMessage("jsun come"));
当然会话session还可以创建别的Message对象
如 :ByteMessage MapMessage ObjectMessage(包含可以序列化的Java对象)
StreamMessage
3。消息消费者
可以是普通的java类,或者MDB(推荐)
普通java接收消息
与发送者不同的地方
MessageConsumer 消息消费者
consumer = session.createConsumer(destination);
consumer.setMessageListener(this);
//这里的this是一个实现了MessageListener接口,它有方法onMessage(Message m)
MDB开发(推荐)
因为MDB可以
1多线程并发的处理,
2简约消息代码(比如建立连接工厂),
3自动开关监听.
MDB类必须是:
a。实现MessageListener接口。
b。必须是POJO(普通JavaBean,非EJB里的bean)不可以是任何EJB Bean的子类。
c。必须是public,不可以是final和abstract。
@MessageDriven(
activationConfig={
@ActivationConfigProperty(propertyName="destinationType",
propertyValue="javax.jms.Queue"),
@ActivationConfigProperty(propertyName="destination",
propertyValue="queue/jsun")
}
)
public class XX implements MessageListener{
public void onMessage(Message m){}
}
MDB生命周期分为:不存在和已就绪
@PostConstruct
@PreDestroy