下面我们来看消息生产者的代码:
/** * 消息发送者 * * @author liuyan * */ public class JbossMessageSender {
/** * 发送消息 * * @throws Exception */ public void sendMessage() {
try { String Connection_Factory = "ConnectionFactory"; Context context = getInitialContext();
ConnectionFactory connectionFactory = (ConnectionFactory) context .lookup(Connection_Factory);
Destination dest = (Destination) context.lookup("jbossJMS");
Connection connection = connectionFactory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer sender = session.createProducer(dest);
sender.setDeliveryMode(DeliveryMode.PERSISTENT); sender.setTimeToLive(2000);
TextMessage textMessage = session.createTextMessage();
textMessage.setStringProperty("ConType", "txt");
textMessage.setText("hello 速速");
sender.send(textMessage);
// 等待50秒 Thread.sleep(5000); System.out.println("停顿5秒钟"); textMessage.setText("welcome to JMS"); sender.send(textMessage); session.close(); connection.close(); } catch (Exception e) { e.printStackTrace(); }
}
private Context getInitialContext() {//重复代码 …… }
/** * @param args * @throws Exception */ public static void main(String[] args) throws Exception {
JbossMessageSender jbossMessageSender = new JbossMessageSender(); jbossMessageSender.sendMessage(); }
}
|
以上是一个消息生产者的代码,流程架子和消息消费者差不多是
1):获得应用上下文
2):根据上下文获得连接工厂,此处使用的是JBoss默认的连接工厂
3):从连接工厂里面获取JMS连接Connection
4):由JMS连接获得JMS消息回话Session
5):根据消息目的,由JMS会话创建消息生产者
6):设置消息头的一些属性
7):填充消息体
8):发送消息
9):关闭JMS消息资源,session、connection
这样先执行消息消费者,苦苦等待(世间最痛苦的莫过于没有任何音讯的苦苦等待)来自目的的消息。之后再执行消息生产者看到效果如下:
消息消费者的控制台:
textMessage:delegator->JBossMessage[21259511621255168]:PERSISTENT, deliveryId=0 消息内容hello 速速 |
可以看出生产者生产了2个消息,消费者只享用了一个消息后就继续往下执行代码,执行到close()时,退出消息目的的监听了,看来这个消息消费者很知足啊:你目的没有消息,只要我活着我就永远等着,知道你目的有一个我等待的消息出现,我才往下执行代码。
下面我们不改变消息生产者,修改一下消息的消费者为异步的方式看看效果,代码如下:
/** * 异步接收P2P消息 * * @author liuyan * */ public class JbossASyncMessageReciveriver implements MessageListener {
/** * 异步接收 */ public void reciveMessage() {
try { String Connection_Factory = "ConnectionFactory";
Context context = getInitialContext();
ConnectionFactory connectionFactory = (ConnectionFactory) context .lookup(Connection_Factory);
Destination dest = (Destination) context.lookup("jbossJMS");
Connection connection = connectionFactory.createConnection(); connection.start(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); MessageConsumer reciver = session.createConsumer(dest); // 为JMS消费者绑定监听器 reciver.setMessageListener(this); // 等待50秒 Thread.sleep(50000); session.close(); connection.close(); } catch (Exception e) { e.printStackTrace(); } }
private Context getInitialContext() {//重复 …… }
/** * 实现此方法,每当监听到此目的有消息了,就执行此方法 */ @Override public void onMessage(Message message) { // TODO Auto-generated method stub TextMessage textMessage = (TextMessage) message; String messageText; try {
messageText = textMessage.getText();
System.out.println("textMessage:" + textMessage);
System.out.println("消息内容" + messageText);
} catch (JMSException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
/** * @param args */ public static void main(String[] args) {
JbossASyncMessageReciveriver jbossSyncMessageReciveriver = new JbossASyncMessageReciveriver(); jbossSyncMessageReciveriver.reciveMessage(); }
} |
异步消费需要实现MessageListener接口和它的onMessage()方法,接收到消息后在onMessage()方法中执行自己的相关逻辑。按照上例的顺序执行代码后,消费者控制台如下:
textMessage:delegator->JBossMessage[21259524079452162]:PERSISTENT, deliveryId=0 消息内容hello 速速 textMessage:delegator->JBossMessage[21259524161454083]:PERSISTENT, deliveryId=1 消息内容welcome to JMS |
消费者开启50秒后自动退出,这就是异步消费模式的效果。就是说,老娘等你(消息生产者)50秒,有消息,老娘就收着,没有!!!50秒后老娘就撤了,过了这村就没这店了啊!