基于Oracle高级队列的JMS开发
基于Oracle高级队列的JMS开发
Oracle AQ
? 主要特点:
– 支持多种语言的客户端:
? Java、C#、C、C++、PHP、Python、JavaScript、Flash、……– 支持多种协议:
? OpenWire、REST、Stomp、WS Notification、XMPP、AMQP。
– 可与多种企业平台集成。
– 支持消息分组、虚拟目的地、通配符等高级功能。
开发基于JMS的应用
? 依赖
– JavaEE: javax.jms.*
– Oracle AQ
? 开发JMS客户端
– JMS 消息发送方
– JMS 消息接收方
JMS API 编程模型
开发消息发送端(PTP模型)
1.创建连接工厂
2.创建JMS客户端到JMS Provider的连接
3.启动连接
4.创建会话
5.创建Queue类型的消息队列,指定消息目的地。
6.从会话中创建到指定目的地的消息生产者。
7.设置消息传递模式。
8.创建并发送消息。
9.关闭会话和连接。
1. 创建连接工厂
import javax.jms.ConnectionFactory
import oracle.jms.AQjmsFactory
import oracle.jms.AQjmsTopicConnectionFactoryAQjmsConnectionFactory aqFactory ;
aqFactory=(AQjmsTopicConnectionFactory)AQjmsFactory.getTopicConnectionFactory(host,sid,port,protocol)2. 创建到JMSProvider的连接
import javax.jms.Connection
import java.sql.Connection
Connection dbConnection;
Connection aqConnection = aqFactory.createConnection(dbConnection)3. 启动连接
aqConnection.start()
4. 创建会话
import javax.jms.TopicSession
import oracle.jms.AQjmsSession
Session aqSession = aqConnection.createTopicSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE)
Session createTopicSession(boolean transacted,int acknowledgeMode)
throws JMSException
5. 创建Topic类型的消息队列
import javax.jms.Topic
Topic topic = aqSession.getTopic(schemaName,aqName);Topic getTopic(String schemaName,String aqName)throws JMSException
6. 创建到指定目的地的消息生产者
import oracle.jms.AQjmsTopicPublisher
import javax.jms.TopicPublisher
AQjmsTopicPublisher topicPublisher =(AQjmsTopicPublisher) aqSession.createPublisher(topic)7. 设置消息传递模式
topicPublisher.setDeliveryMode(DeliveryMode.NON_PERSISTENT);void setDeliveryMode(int deliveryMode)
throws JMSException
8. 创建并发送消息
import javax.jms.Message
import oracle.jms.AQjmsAdtMessage
Message message =(AQjmsAdtMessage)aqSession.createAQjmsAdtMessage(object);topicPublisher.publish(message);
9. 关闭会话和连接
aqSession.close();
aqConnection.close();
开发消息接收端
1.创建连接工厂
2.创建JMS客户端到JMS Provider的连接
3.启动连接
4.创建会话
5.创建Topic类型的消息队列,指定消息源。
6.从会话中创建消息消费者。
7.接收消息(两种方式)
– 直接接收。
– 设置消息监听器。
8.关闭会话和连接。
6. 从会话中创建消息消费者
import javax.jms.TopicSubscriber
import oracle.jms.AQjmsTopicSubscriber
AQjmsTopicSubscriber topicSubscriber =aqSession.getDurableSubscriber(topic,aqName,ora)7.接收消息
Message message =(AQjmsAdtMessage)topicSubscriber.receive();7. 设置消息监听器
public class AQMessageListener implements MessageListener{@Override
public void onMessage(Message msg) {
AQjmsAdtMessage Msg = (AQjmsAdtMessage) msg;try {
System.out.println("接收到的消息是:" + Msg.get??????????());} catch (JMSException e) {
e.printStackTrace();
}
}
}
topicSubscriber.setMessageListener(newAQMessageListener());