JavaJava JMS教材文档格式.docx
- 文档编号:7725637
- 上传时间:2023-05-09
- 格式:DOCX
- 页数:18
- 大小:20.36KB
JavaJava JMS教材文档格式.docx
《JavaJava JMS教材文档格式.docx》由会员分享,可在线阅读,更多相关《JavaJava JMS教材文档格式.docx(18页珍藏版)》请在冰点文库上搜索。
PTP模型规定了一个消息只能有一个接收者;
Pub/Sub模型允许一个消息可以有多个接收者。
2.消息组成
消息传递系统的中心就是消息。
一条Message分为三个组成部分:
头(header)是个标准字段集,客户机和供应商都用它来标识和路由消息。
属性(property)支持把可选头字段添加到消息。
如果您的应用程序需要不使用标准头字段对消息编目和分类,您就可以添加一个属性到消息以实现这个编目和分类。
提供set<
Type>
Property(...)和get<
Property(...)方法以设置和获取各种Java类型的属性,包括Object。
JMS定义了一个供应商选择提供的标准属性集。
消息的主体(body)包含要发送给接收应用程序的内容。
每个消息接口特定于它所支持的内容类型。
JMS为不同类型的内容提供了它们各自的消息类型,但是所有消息都派生自Message接口。
StreamMessage:
包含Java基本数值流,用标准流操作来顺序的填充和读取。
MapMessage:
包含一组名/值对;
名称为string类型,而值为Java的基本类型。
TextMessage:
包含一个String。
ObjectMessage:
包含一个SerializableJava对象;
能使用JDK的集合类。
BytesMessage:
包含未解释字节流:
编码主体以匹配现存的消息格式。
XMLMessage:
包含XML内容。
扩展TextMessage,XMLMessage类型的使用,使得消息过滤非常便利。
3.消息确认模式
非事务性会话中,应用程序创建的会话有5种确认模式,而在事务性会话中,确认模式被忽略。
五种确认模式说明:
1-AUTO_ACKNOWLEDGE:
自动确认模式。
一旦接收方应用程序的方法调用从处理消息处返回,会话对象就会确认消息的接收。
2-CLIENT_ACKNOWLEDGE:
客户端确认模式。
会话对象依赖于应用程序对被接收的消息调用一个acknowledge()方法。
一旦这个方法被调用,会话会确认最后一次确认之后所有接收到的消息。
这种模式允许应用程序以一个调用来接收,处理并确认一批消息。
注意:
在管理控制台中,如果连接工厂的AcknowledgePolicy(确认方针)属性被设置为"
Previous"
(提前),但是你希望为一个给定的会话确认所有接收到的消息,那么就用最后一条消息来调用acknowledge()方法。
3-DUPS_OK_ACKNOWLEDGE:
允许副本的确认模式。
一旦接收方应用程序的方法调用从处理消息处返回,会话对象就会确认消息的接收;
而且允许重复确认。
在需要考虑资源使用时,这种模式非常有效。
如果你的应用程序无法处理重复的消息的话,你应该避免使用这种模式。
如果发送消息的初始化尝试失败,那么重复的消息可以被重新发送。
4-NO_ACKNOWLEDGE:
不确认模式。
不确认收到的消息是需要的。
消息发送给一个NO_ACKNOWLEDGE会话后,它们会被WebLogic服务器立即删除。
在这种模式下,将无法重新获得已接收的消息,而且可能导致下面的结果:
1.消息可能丢失;
和(或者)另一种情况:
2.如果发送消息的初始化尝试失败,会出现重复消息被发送的情况。
5-MULTICAST_NO_ACKNOWLEDGE:
IP组播下的不确认模式,同样无需确认。
发送给一个MULTICAST_NO_ACKNOWLEDGE会话的消息,会共享之前所述的NO_ACKNOWLEDGE确认模式一样的特征。
这种模式支持希望通过IP组播方式进行消息通信的应用程序,而且无需依赖会话确认提供的服务质量。
如果你的应用程序无法处理消息的丢失或者重复,那么你应该避免使用这种模式。
如果发送消息的初始化尝试失败的话,重复的消息可能会被再次发送。
注:
在上表的5种确认模式中,
JMS规范定义的:
AUTO_ACKNOWLEDGE,DUPS_OK_ACKNOWLEDGE,CLIENT_ACKNOWLEDGE
是WebLogicJMS提供的
NO_ACKNOWLEDGE,MULTICAST_NO_ACKNOWLEDGE。
三.配置JMS
1.创建连接工厂
(1)启动WebLogicServer8.1,登录控制台,选中JMSConnectionFactories节点,点击右边的"
ConfigureanewJMSConnectionFactory..."
;
(2)填写连接工厂的名称SendJMSFactory和JNDI名称SendJMSFactory,点击"
Create"
(3)勾上"
myserver"
将SendJMSFactory应用到myserver;
2.定义后备存储
(1)选中JMSStores节点,点击右边的"
(2)填写文件后备存储的名称SendFileStore和目录DirectionaryE:
BEAuser_projectsdomainsmydomainsendfilestore,点击"
.
3.创建JMS服务器
(1)选中JMSServers节点,点击右边的"
ConfigureanewJMSServer..."
(2)填写JMS服务器的名称SendJMSServer和PagingStore设为"
SendFileStore"
点击"
(3)Target选中"
将SendJMSServer应用到myserver.
4.创建消息队列
(1)展开"
SendJMSServer"
节点,点击"
ConfigureanewJMSQueue..."
(2)填写消息队列的名称SendJMSQueue和JNDI名称SendJMSQueue,点击"
四.JMS应用程序
一个JMS应用程序由下列元素组成:
JMS客户机。
用JMSAPI发送和接收消息的Java程序。
非JMS(Non-JMS)客户机。
认识到这一点很重要-旧的程序经常成为整个JMS应用程序的一部分,而且它们的包含应该在设计时预先考虑。
消息。
在JMS和非JMS客户机之间交换的消息的格式和内容是JMS应用程序设计所必须考虑的部分。
JMS供应商。
供应商必须提供特定于其MOM产品的具体的实现。
受管对象。
消息传递系统供应商的管理员创建了一个对象,它独立于供应商专有的技术。
包括连接工厂ConnectionFactory和目的Destination。
一种典型的JMS程序需要经过下列步骤才能开始消息产生和使用:
通过JNDI查找ConnectionFactory。
通过JNDI查找一个或多个Destination。
用ConnectionFactory创建一个Connection。
用Connection创建一个或多个Session。
用Session和Destination创建所需的MessageProducer和MessageConsumer。
启动Connection。
下面利用上面配置的JMS资源演示点对点消息发送和接收的过程。
五.设计消息发送端
1.使用的JMS资源
服务器URL:
t3:
//localhost:
80
连接工厂:
SendJMSFactory
队列:
SendJMSQueue
2.设计步骤
初始化JNDITree
Hashtableenv=newHashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,JNDI_FACTORY);
env.put(Context.PROVIDER_URL,PROVIDER_URL);
returnnewInitialContext(env);
lookupConnectionFactory
qconFactory=(QueueConnectionFactory)ctx.lookup(JMS_FACTORY);
lookupDestination
queue=(Queue)ctx.lookup(queueName);
用ConnectionFactory创建Connection
qcon=qconFactory.createQueueConnection();
用Connection创建一个Session
qsession=qcon.createQueueSession(false,Session.AUTO_ACKNOWLEDGE);
用Session和Destination创建MessageProducer
qsender=qsession.createSender(queue);
qcon.start();
发送消息
msg=qsession.createTextMessage();
msg.setText(message);
qsender.send(msg);
3.源代码
packagejmssample;
importjava.util.Hashtable;
importjavax.jms.*;
importjavax.naming.Context;
importjavax.naming.InitialContext;
importjavax.naming.NamingException;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
/**Thisexampleshowshowtoestablishaconnection
*andsendmessagestotheJMSqueue.Theclassesinthis
*packageoperateonthesameJMSqueue.Runtheclassestogetherto
*witnessmessagesbeingsentandreceived,andtobrowsethequeue
*formessages.Theclassisusedtosendmessagestothequeue.
*
*@authorCopyright(c)1999-2003byBEASystems,Inc.AllRightsReserved.
*/
publicclassQueueSend
{
//DefinestheJNDIcontextfactory.
publicfinalstaticStringJNDI_FACTORY="
weblogic.jndi.WLInitialContextFactory"
//DefinestheJNDIproviderurl.
publicfinalstaticStringPROVIDER_URL="
80"
//DefinestheJMSconnectionfactoryforthequeue.
publicfinalstaticStringJMS_FACTORY="
SendJMSFactory"
//Definesthequeue.
publicfinalstaticStringQUEUE="
SendJMSQueue"
privateQueueConnectionFactoryqconFactory;
privateQueueConnectionqcon;
privateQueueSessionqsession;
privateQueueSenderqsender;
privateQueuequeue;
privateTextMessagemsg;
/**
*Createsallthenecessaryobjectsforsending
*messagestoaJMSqueue.
*@paramctxJNDIinitialcontext
*@paramqueueNamenameofqueue
*@exceptionNamingExceptionifoperationcannotbeperformed
*@exceptionJMSExceptionifJMSfailstoinitializeduetointernalerror
publicvoidinit(Contextctx,StringqueueName)
throwsNamingException,JMSException
}
*SendsamessagetoaJMSqueue.
*@parammessagemessagetobesent
*@exceptionJMSExceptionifJMSfailstosendmessageduetointernalerror
publicvoidsend(Stringmessage)throwsJMSException{
*ClosesJMSobjects.
*@exceptionJMSExceptionifJMSfailstocloseobjectsduetointernalerror
publicvoidclose()throwsJMSException{
qsender.close();
qsession.close();
qcon.close();
/**main()method.
*@paramargsWebLogicServerURL
*@exceptionExceptionifoperationfails
publicstaticvoidmain(String[]args)throwsException{
InitialContextic=getInitialContext();
QueueSendqs=newQueueSend();
qs.init(ic,QUEUE);
readAndSend(qs);
qs.close();
privatestaticvoidreadAndSend(QueueSendqs)
throwsIOException,JMSException
BufferedReadermsgStream=newBufferedReader(newInputStreamReader(System.in));
Stringline=null;
booleanquitNow=false;
do{
System.out.print("
Entermessage("
quit"
toquit):
"
);
line=msgStream.readLine();
if(line!
=null&
&
line.trim().length()!
=0){
qs.send(line);
System.out.println("
JMSMessageSent:
+line+"
quitNow=line.equalsIgnoreCase("
}while(!
quitNow);
privatestaticInitialContextgetInitialContext()
throwsNamingException
六.设计消息接收端
用Session和Destination创建MessageConsumer
qreceiver=qsession.createReceiver(queue);
设置监听
qreceiver.setMessageListener(this);
启动Connection
*Thisexampleshowshowtoestablishaconnectionto
*andreceivemessagesfromaJMSqueue.Theclassesinthis
*formessages.Thisclassisusedtoreceiveandremovemessages
*fromthequeue.
publicclassQueueReceiveimplementsMessageListener
publicfinals
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java JMS教材 JMS 教材