必须实现MessageListener接口,但bean容器检测到消息时,就会调用onMessage()方法,消息将作为参数传入。这里
可以用annotation配置检测队列消息。
可用于业务处理时间较长,而无需实时向用户反馈时。如发送邮件,短信等等。
//说明这是一个消息驱动bean
@MessageDriven(activationConfig =
{
//配置消息的各种类型
//destinationType属性指定消息的类型,有两种topics(javax.jms.Topics) and queues(javax.jms.Queue)
//topics:可以有多个客户端,多对多通讯
//queues:只有一个客户端,消息被接受后就会从对列中消失
@ActivationConfigProperty(propertyName="destinationType",
propertyValue="javax.jms.Queue"),
//destination:消息路径
@ActivationConfigProperty(propertyName="destination",
propertyValue="queue/messagebean")
})
public class PrintBean implements MessageListener {
public void onMessage(Message msg) {
try {
TextMessage tmsg = (TextMessage) msg;
this.print(tmsg.getText());
} catch (Exception e){
e.printStackTrace();
}
}
private void print(String content){
System.out.println(content);
}
}
---test---
public class Client
{
public static void main(String[] args) throws Exception
{
QueueConnection cnn = null;
QueueSender sender = null;
QueueSession session = null;
InitialContext ctx = new InitialContext();
QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("ConnectionFactory");
cnn = factory.createQueueConnection();
session = cnn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
Queue queue = (Queue) ctx.lookup("queue/messagebean");
TextMessage msg = session.createTextMessage("hello, this is a message driven bean");
sender = session.createSender(queue);
sender.send(msg);
System.out.println("消息已经发出");
}
}
消息驱动bean工作步骤:
a. 初识化上下文
InitialContext ctx = new InitialContext(props);
b. 根据上下文查找连接工厂(有两种TopicConnectFactory/ QueueConnectionFactory)
QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("ConnectionFactory");
c. 从连接工厂得到一个连接
cnn = factory.createQueueConnection();
d. 通过连接建立一个会话
session = cnn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
e. 查找destination
Queue queue = (Queue) ctx.lookup("queue/messagebean");
f. 创建(TopicPublisher/QueueSender)和(TopicSubscriber/QueueReceiver).
TextMessage msg = session.createTextMessage("hello, this is a message driven bean");
sender = session.createSender(queue);
sender.send(msg);