JMS详解Word文档下载推荐.docx

上传人:b****5 文档编号:17328610 上传时间:2022-12-01 格式:DOCX 页数:42 大小:183.54KB
下载 相关 举报
JMS详解Word文档下载推荐.docx_第1页
第1页 / 共42页
JMS详解Word文档下载推荐.docx_第2页
第2页 / 共42页
JMS详解Word文档下载推荐.docx_第3页
第3页 / 共42页
JMS详解Word文档下载推荐.docx_第4页
第4页 / 共42页
JMS详解Word文档下载推荐.docx_第5页
第5页 / 共42页
点击查看更多>>
下载资源
资源描述

JMS详解Word文档下载推荐.docx

《JMS详解Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《JMS详解Word文档下载推荐.docx(42页珍藏版)》请在冰豆网上搜索。

JMS详解Word文档下载推荐.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 其它课程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1