JMS详解Word文档下载推荐.docx
《JMS详解Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《JMS详解Word文档下载推荐.docx(42页珍藏版)》请在冰豆网上搜索。
ConnectionFactoryconnectionFactory=(ConnectionFactory)
ctx.lookup("
JNDI_NAME"
);
如果应用程序与服务器不在同一个虚拟机时
Hashtableenv=newHashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,"
com.apusic.naming.jndi.CNContextFactory"
env.put(Context.PROVIDER_URL,"
iiop:
//hostname:
4888"
//取决于地址和端口
newInitialContext(env);
JNDI_NAME"
∙Destinations
Destinations是指消息发送客户端的消息目标和消息接收客户端的消息来源,它也是预先在jms.xml定义好的。
对于PTP类型,Destinations对应的类型为Queue,对于Pub/Sub类型,Destinations对应的类型为Topic。
获取方式:
DestinationmyDest=(Destination)ctx.lookup("
testTopic"
QueuemyQueue=(Queue)ctx.lookup("
testQueue"
或者:
//通过下面这种方式创建出来的Queue,代表一个远程AMQ服务器上的队列,@符号之前
//是队列的名称,@符号之后是服务器路由名。
发送消息到该队列时,会将消息路由到@符号之后
//指定的服务器,并将消息放进@符号之前指定的队列。
QueuemessageQueue=queueSession.createQueue("
testQueue@ServerRouterName"
∙Connections
为客户端和消息服务器建立的一个连接,它可以创建Session,并且可以创建多个Session(稍后介绍)。
获取方法:
Connectionconnection=connectionFactory.createConnection();
当使用完连接的时候,你需要关闭连接,否则该连接会一直保持。
关闭连接的时候它同时会关闭该连接产生的Session。
connection.close();
连接创建好后,一般先调用start()方法。
∙Sessions
Sessions是单线程的,用来创建消息发送者和消息接受者的上下文。
Sessions同时还可以执行MessageListeners
Sessionsession=connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
Sessionsession=connection.createSession(false,Session.CLIENT_ACKNOWLEDGE);
Sessionsession=connection.createSession(false,Session.DUPS_OK_ACKNOWLEDGE);
三种应答模式的差别,请参照AMQ相关概念中的应答模式。
∙MessageProducers
messageproducer是由Session创建的一个对象,它是用来向Destinations发送信息的。
MessageProducerproducer=session.createProducer(myDest);
MessageProducerproducer=session.createProducer(myTopic);
QueueSendersender=queueSession.createSender(messageQueue);
也可以创建时不指定Destinations,发送时再指定。
创建好后,可以继续创建消息,然后调用发送方法发送消息。
TextMessagemessage=session.createTextMessage();
message.setText(msg_text);
producer.send(message);
当发送时指定Destinations,你的使用方法如下:
MessageProduceranon_prod=session.createProducer(null);
anon_prod.send(myQueue,message);
∙MessageConsumers
messageconsumer是指从destination接收消息的对象
MessageConsumerconsumer=session.createConsumer(myQueue);
MessageConsumerconsumer=session.createConsumer(myTopic);
你还能使用Session.createDurableSubscriber创建一个持久的Topic注册对象。
它和普通的Topic注册对象的区别是不管当前是否在线,均能收到对应Destination的全部信息
StringsubName="
MySub"
;
MessageConsumertopicSubscriber=session.createDurableSubscriber(myTopic,subName);
停止持久的Topic注册对象使用以下方法。
topicSubscriber.close();
session.unsubscribe("
使用Consumer前应该先调用connection.start()方法
connection.start();
Messagem=consumer.receive();
//或者
Messagem=consumer.receive(3000);
//3秒后超时
∙MessageListeners
这是为异步调用设计的一种方式。
它是把消息监听器注册到consumer中,然后消息监听器实现一个onMesseag()方法,当消息到达是,会调用消息监听器的onMesseag()方法。
ListenermyListener=newListener();
consumer.setMessageListener(myListener);
∙MessageSelectors
AMQ允许消息选择性的接收,语法符合SQL92。
例如:
客户只收取消息属性NewsType为Sports和Opinion的消息。
NewsType='
Sports'
ORNewsType='
Opinion'
然后再创建Consumer时指定Selectors。
例如
createConsumer(Destinationdestination,StringmessageSelector)
createConsumer(Destinationdestination,StringmessageSelector,booleanNoLocal)
createDurableSubscriber(Topictopic,Stringname,StringmessageSelector,booleannoLocal)
把其中的messageSelector参数变成NewsType='
即可。
6.3.
客户端方式使用JMS
6.3.1.
开发JMSClient的步骤
一般来说,一个JMS应用是几个JMS客户端交换消息,开发JMS客户端应用由以下几步构成:
∙用JNDI寻找得到ConnectionFactory对象;
∙用JNDI寻找或者Session的CreateQueue(CreateTopic)方法得到目标队列或主题对象,即Destination对象;
∙用ConnectionFactory创建Connection对象;
∙用Connection对象创建一个或多个JMSSession;
∙用Session和Destination创建MessageProducer和MessageConsumer;
∙通知Connection开始传递消息。
6.3.2.
PTP模型应用
PTP模型主要包含消息的发送和接收,下面我们举例说明:
∙发送消息
1.首先编辑发送节点的config/jms.xml文件,加上以下一段配置:
...
<
connection-factory>
<
description>
Thedefaultqueueconnectionfactory<
/description>
display-name>
QueueConnectionFactory<
/display-name>
jndi-name>
jms/QueueConnectionFactory<
/jndi-name>
/connection-factory>
(如果同名的connection-factory已经存在,就不用再创建)
同时还要编辑消息的目的节点的config/jms.xml文件,加上以下一段配置:
queueclustered="
false"
>
queue-name>
testQueue<
/queue-name>
/queue>
(如果同名的queue已经存在,就不用再创建)
2.启动AMQ
由于AMQ目前对配置文件的读取是在启动阶段,所以需要重新启动服务器。
3.编写发送消息客户端代码:
Send.java
importjavax.jms.*;
importjavax.naming.*;
importjava.io.*;
importjava.util.*;
importjava.rmi.RemoteException;
/**
*Title:
JMS
*Description:
JMSTest
*Copyright:
Copyright(c)2003
*Company:
Apusic
*@authorApusic
*@version1.0
*/
publicclassSend{
StringqueueName="
//消息的目的队列的队列名
StringrouterName="
RouterB"
//消息的目的节点的路由名
QueueConnectionFactoryqueueConnectionFactory=null;
Queuequeue=null;
QueueConnectionqueueConnection=null;
QueueSessionqueueSession=null;
QueueSenderqueueSender=null;
TextMessagemessage=null;
publicstaticvoidmain(String[]args)throwsException{
InitialContextic=getInitialContext();
Sendsender=newSend();
sender.init(ic);
sender.sendMessage();
sender.close();
}
publicvoidinit(InitialContextctx)throwsException{
queueConnectionFactory=(QueueConnectionFactory)ctx.lookup("
jms/QueueConnectionFactory"
queueConnection=queueConnectionFactory.createQueueConnection();
publicvoidsendMessage()throwsJMSException,RemoteException{
queueSession=queueConnection.createQueueSession(false,Session.AUTO_ACKNOWLEDGE);
//队列由:
"
队列名"
+"
@"
目的节点路由名"
在网络中唯一标识,通过该方式创建的队列
//将代表远程节点上的某个队列
queue=queueSession.createQueue(queueName+"
+routerName);
queueSender=queueSession.createSender(queue);
queueSender.setDeliveryMode(DeliveryMode.PERSISTENT);
message=queueSession.createTextMessage();
message.setText("
TheMessagefromtestQueue"
queueSender.send(message);
publicvoidclose()throwsJMSException{
if(queueConnection!
=null)
queueConnection.close();
privatestaticInitialContextgetInitialContext()throwsNamingException{
Hashtableenv=newHashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,"
env.put(Context.PROVIDER_URL,"
//localhost:
return(newInitialContext(env));
}
∙接收消息
该部分建立在发送消息时jms.xml已经配置好connection-factory,queue的前提下在目的节点编写接收消息客户端代码:
Receive.java
publicclassReceive{
QueueReceiverqueueReceiver=null;
Receivereceiver=newReceive();
receiver.init(ic);
receiver.TBreceiveMessage();
//你可以在此处调用YBreceiveMessage
receiver.close();
//采用以下的lookup方法找回来的队列是本地节点的队列
queue=(Queue)ctx.lookup(queueName);
//假如想收取远程节点的队列上的消息时,采用以下的createQueue方法创建一个远程的队列。
在网络中唯一标识。
//通过该方式创建的队列将代表远程节点上的某个队列,收取消息时将直接收取该节点的该队列上的消息。
//queue=queueSession.createQueue(queueName+"
publicvoidTBreceiveMessage()throwsNamingException,JMSException,RemoteException{
queueReceiver=queueSession.createReceiver(queue);
queueConnection.start();
for(;
){
message=(TextMessage)queueReceiver.receive();
System.out.println("
Readingmessage:
"
+message.getText());
if(message.getText().equals("
quit"
))
break;
publicvoidYBreceiveMessage()throwsNamingException,JMSException,RemoteException,IOException{
//registermytextListenerwhichcomesfromMessageListener
TextMessageListenertextListener=newTextMessageListener();
queueReceiver.setMessageListener(textListener);
Toendprogram,enterQorq,then"
InputStreamReaderreader=newInputStreamReader(System.in);
charanswer='
\0'
while(!
((answer=='
q'
)||(answer=='
Q'
)))
answer=(char)reader.read();
if(queueReceiver!
queueReceiver.close();
if(queueSession!
queueSession.close();
env.put(Context.INITIAL_CONTEXT_FACTORY,
//localh