- 浏览: 1589117 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (289)
- java 语法基础 (51)
- spring (8)
- mvc struct /Ant --build.xml (8)
- SOA (0)
- oracle 9i/10g (23)
- sql server 2000-2005 (3)
- 数据库基础知识 (6)
- 设计模式与软件架构 (10)
- Hibernate 持久化 (9)
- J2SE/J2EE/J2ME/AJAX 技术 (8)
- JSF 技术 (3)
- JAVA 图形化 (0)
- JMS (40)
- Eclipse 3.2 IDE 开发技巧 (13)
- 项目处理方法集合 (2)
- html/jsp/javascript (2)
- Unix/Linux (9)
- j2me/ARM/windriver/嵌入式 (4)
- 电信科学 (8)
- jsp (1)
- c/c++ (1)
- LZW压缩算法(java) (2)
- Android (77)
- 版本管理git/svn (2)
最新评论
-
huihai:
有demo吗?
NamingStrategy实现动态表名映射 -
cangbaotu:
推荐给大家一些有用的爬虫源码:https://github.c ...
网络爬虫(源代码参考) -
tuspark:
除了.classpath文件以外,.project文件也应该了 ...
Eclipse .classpath文件浅谈 -
tuspark:
造成eclipse自动关闭的原因有很多,这里有很多介绍:ecl ...
eclipse 自动关闭 解决方案 -
DEMONU:
网上都是这些,这种文章。。。
ActiveMQ中的消息持久性
目的地类型JNDI名字连接工厂类型
Topic/Queuejava:/ConnectionFactoryJVM
Topic/Queuejava:/XAConnectionFactoryJVM支持XA事务
Topic/QueueRMIConnectionFactoryRMI
Topic/QueueRMIXAConnectionFactoryRMI支持XA事务
Topic/QueueConnectionFactoryOIL
Topic/QueueXAConnectionFactoryOIL支持XA事务
Topic/QueueUILConnectionFactoryUIL
Topic/QueueUILXAConnectionFactoryUIL支持XA事务
3)JBoss中高级JMS配置
在上边段落主要描述了和JbossMQ一起实行的基本配置工作。在本段来描述JMS其他配置。
(1)JMS持久性管理
JMS持久性管理(PM)负责存储消息,并且将消息标记为持久,如果服务器发生故障时,能保证消息不会丢失,并允许恢复持久性消息。持久性JMS消息可以使用不同的方法来完成。每个方法有自己优点和缺陷:
PM名字优点缺点
File比较稳定速度慢
Rollinglogged速度比较快此方法比较新,有些地方需要完善
JDBC对于稳定性和可量测性比较好必须有JDBC
Logged速度快Logfilesgrowwithoutbound,memorymanagementproblemsduringrecovery
在JBoss中缺省的持久性消息管理是File持久性管理。可以改变它,但必须对于一个JMS
Server有且仅有一个持久性管理配置。所以你在JBoss管理界面的jboss.mq–>
service=PersistenceManager只是看到一个。
持久性管理的配置文件是jbossmq-service.xml。在server\..\deploy下。
为了让大家了解持久性管理的各种方法,我下面来逐个介绍如何配置。
wFile持久性管理
File持久性管理的概念就是为每一个持久性消息建立一个文件。消息持久性方法不是全部都能使用,但它是比较稳定的。
File持久性管理在JBoss发布时,作为一个缺省的持久性管理。如果你打开jbossmq-service.xml文件,你会看到下面的XML:
<mbeancode="org.jboss.mq.pm.file.PersistenceManager"
name="jboss.mq:service=PersistenceManager">
<attributename="DataDirectory">db/jbossmq/file</attribute>
<dependsoptional-attribute-name="MessageCache">jboss.mq:service=MessageCache</depends>
</mbean>
当设置Mbean配置时,File持久性管理允许你指定下面的属性:
DataDircetory是存放持久性消息的路径,会把生成的数据文件放在此目录下。
w设置Rollinglogged持久性管理
Rollinglogged持久性管理是比较新的一种持久性消息管理方法,因为它使用日志文件来持续多个消息,所以当建立一个文件时,不需要许多的I/O。
定义Rollinglogged持久性管理:
<mbeancode="org.jboss.mq.pm.rollinglogged.PersistenceManager"
name="jboss.mq:service=PersistenceManager">
<attributename="DataDirectory">db/jbossmq/file</attribute>
<dependsoptional-attribute-name="MessageCache">jboss.mq:service=MessageCache</depends>
</mbean>
Rollinglogged持久性管理中DataDirctory存放持久性消息的路径,会把生成的数据文件放在此目录下。
w设置JDBC持久性管理
JDBC持久性管理使用数据库表来存储消息。需要一个JBoss配置的数据源来访问数据库。具体内容参考jbossmq-service.xml文件中的内容。
w设置Logged持久性管理
Logged持久性管理是比较早的一个,在JBoss2.4.1以后版本中不在建议使用。现在有其他更好的办法。
4、举例说明
当我们清楚了以后内容后,现在我们来用JBoss实现一个例子来加深对JBoss和JMS的了解。
在上面叙述中,我们知道明确使用JMSprovider有三个基本的事情要做:配置JNDI初始化上下文,连接工厂的名字和使用目的地的名字。
当编写产品的最好的事情是不受provider-specific影响,使代码能在不同的JMSprovider之间容易移植。在此这个例子没有聚焦在开发产品上,而是解释如何使用JbossMQ来工作。
1)初始化上下文
w配置JNDI的一个方法是通过属性文件jndi.properties。在这个文件中使用正确的值,并且把它所在的路径包含到classpath中,它比较容获得正确初始化上下文。
jndi.properties文件的内容如下:
java.naming.factory.initial=org.jnp.inte***ces.NamingContextFactory
java.naming.provider.url=localhost:1099
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.inte***ces
把该文件放置的路径成为你的classpath的一部分。如果你使用这种方法,在初始化上下文时,代码比较简单:Contextcontext=newIntialContext();1
w在某些情景下,可能需要手工配置JNDI;例如当运行的类文件中环境已经配置了一个初始化上下文,但不是你想用的上下文时,需要手工来配置一个上下文。设置在哈希表中的几个属性值,并且使用此哈希表来实例化一个上下文。定义语法:
Hashtableprops=newHashtable();
props.put(Context.INITIAL_CONTEXT_FACTORY,
"org.jnp.inte***ces.NamingContextFactory");
props.put(Context.PROVIDER_URL,"localhost:1099");
props.put("java.naming.rmi.security.manager","yes");
props.put(Context.URL_PKG_PREFIXES,"org.jboss.naming");
2)查找连接工厂
自有了上下文后,需要查找一个连接工厂。为了查找它,使用一个可用的名字。查找连接工厂的代码如下:
对于一个topic目的地
TopicConnectionFactorytopicFactory=(TopicConnectionFactory)context.lookup(“ConnectionFactory”)
Queue目的地:
QueueConnectionFactoryqueueFactory=(QueueConnectionFactory)context.lookup(“ConnectionFactory”)
3)建立连接和会话
在我们有了连接工厂后,建立一个连接,在此连接中建立一个会话。
对于topic代码如下:
//建立一个连接
topicConnection=topicFactory.createTopicConnection();
//建立一个会话
topicSession=topicConnection.createTopicSession(false,//不需要事务
Session.AUTO_ACKNOLEDGE//自动接收消息的收条。
);
对于queue代码如下:
//建立一个连接
queueConnection=queueFactory.createQueueConnection();
//建立一个会话
queueSession=queueConnection.createQueueSession(false,//不需要事务
Session.AUTO_ACKNOLEDGE//自动接收消息的收条。
);
一个会话建立时,配置是否调用事务
在事务Session中,当事务被提交后,自动接收,如果事务回滚,所有的被消费的消息将会被重新发送。
在非事务Session中,如果没有调用事务处理,消息传递的方式有三种:
Session.AUTO_ACKNOWLEDGE:当客户机调用的receive方法成功返回,或当MessageListenser成功处理了消息,session将会自动接收消息的收条。
Session.CLIENT_ACKNOWLEDGE:客户机通过调用消息的acknowledge方法来接收消息。接收发生在session层。接收到一个被消费的消息时,将自动接收该session已经消费的所有消息。例如:如果消息的消费者消费了10条消息,然后接收15个被传递的消息,则前面的10个消息的收据都会在这15个消息中被接收。
Session.DUPS_ACKNOWLEDGE:指示session缓慢接收消息。
4)查找目的地
现在我们来介绍建立publishes/sends或subscribles/receives消息。
下面的代码列出来查找一个目的地:
对于topic查找一个testTopic目的地
Topictopic=(Topic)context.lookup(“topic/testTopic”);
对于queue查找一个testQueue目的地
Queuequeue=(Queue)context.lookup(“queue/testQueue”);
注意:JbossM的前缀topic/(queue/)通常被放在topic(queue)名字前面。
在JMS中,当客户机扮演每种角色,象对于topic来将的publisher,subscriber或对于queue来将的sender,receiver,都有自己不同类继承和不同函数。
5)建立一个消息制造者MessageProducer(topicpublisher/queuesender)
消息制造者是一个由session创建的对象,主要工作是发送消息到目的地。
对于一个topic,需要通过TopicSession来创建一个TopicPublisher。代码如下:
TopicPublishertopicPublisher=TopicSession.createPublisher(topic);
对于一个queue,需要通过QueueSession来创建一个QueueSender。代码如下:
QueuePublisherqueuePublisher=queueSession.createSender(queue);
6)消息发送
建立一个TestMessage并且publish它,代码:
TextMessagemessage=topicSession.createTestMessage();
message.setText(msg);
topicPublishe.publish(topic,message);
建立一个TestMessage并且send它,代码:
TextMessagemessage=queueSession.createTestMessage();
message.setText(msg);
queueSender.send(queue,message);
7)下面是一个完成的topicpublisher代码,文件名HelloPublisher.java:
importjavax.naming.Context;
importjavax.naming.InitialContext;
importjavax.naming.NamingException;
importjavax.jms.TopicConnectionFactory;
importjavax.jms.TopicConnection;
importjavax.jms.TopicSession;
importjavax.jms.TopicPublisher;
importjavax.jms.Topic;
importjavax.jms.TextMessage;
importjavax.jms.Session;
importjavax.jms.JM***ception;
importjava.util.Hashtable;
publicclassHelloPublisher{
TopicConnectiontopicConnection;
TopicSessiontopicSession;
TopicPublishertopicPublisher;
Topictopic;
publicHelloPublisher(StringfactoryJNDI,StringtopicJNDI)
throwsJM***ception,NamingException{
Hashtableprops=newHashtable();
props.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.inte***ces.NamingContextFactory");
props.put(Context.PROVIDER_URL,"localhost:1099");
props.put("java.naming.rmi.security.manager","yes");
props.put(Context.URL_PKG_PREFIXES,"org.jboss.naming");
Contextcontext=newInitialContext(props);
TopicConnectionFactorytopicFactory=
(TopicConnectionFactory)context.lookup(factoryJNDI);
topicConnection=topicFactory.createTopicConnection();
topicSession=topicConnection.createTopicSession(false,Session.AUTO_ACKNOWLEDGE);
topic=(Topic)context.lookup(topicJNDI);
topicPublisher=topicSession.createPublisher(topic);
}
publicvoidpublish(Stringmsg)throwsJM***ception{
TextMessagemessage=topicSession.createTextMessage();
message.setText(msg);
topicPublisher.publish(topic,message);
}
publicvoidclose()throwsJM***ception{
topicSession.close();
topicConnection.close();
}
publicstaticvoidmain(String[]args){
try{
HelloPublisherpublisher=newHelloPublisher(
"ConnectionFactory","topic/testTopic");
for(inti=1;i<11;i++){
Stringmsg="HelloWorldno."+i;
System.out.println("Publishingmessage:"+msg);
publisher.publish(msg);
}
publisher.close();
}catch(Exceptionex){
System.err.println(
"AnexceptionoccurredwhiletestingHelloPublisher25:"+ex);
ex.printStackTrace();
}
}
}
发表评论
-
基于jms使用ActiveMQ实现异步日志功能.消息持久到oracle 10g 数据库
2008-09-18 15:05 9933package askyaya.entity;import j ... -
activemq 重新连接的机制
2008-09-18 14:39 23220最近一个项目要用到ActiveMq,并且需要最大程度的保证消息 ... -
ActiveMQ stop inactivity read check
2008-09-17 16:01 10648You can do the following to fix ... -
WSAD环境下JMS异步通信全攻略 (3)
2008-09-11 14:18 32233.5 消息驱动的Bean 在前文讨论JMS消息接收处理逻 ... -
WSAD环境下JMS异步通信全攻略 (2)
2008-09-11 13:58 3771三、JMS P2P编程 在JMS P2P通信方式中,发送程 ... -
WSAD环境下JMS异步通信全攻略 (1)
2008-09-11 13:57 4711一、JMS基本概念 1.1 P2P通信 1.2 Pub ... -
ProducerTool /MessageBroker /getConnectionFactoryF
2008-09-10 18:12 2473lib: jms1.1.jar activemq-all-5. ... -
activemq例子代码 发送BytesMessage消息
2008-09-10 13:55 18380import javax.jms.Connection; im ... -
ActiveMQ in Action(7)
2008-09-10 13:44 3948ActiveMQ in Action(7) 关键字 ... -
ActiveMQ in Action(6)
2008-09-10 13:43 3731ActiveMQ in Action(6) 关键字: acti ... -
ActiveMQ in Action(5)
2008-09-10 13:42 3924ActiveMQ in Action(5) 关键字: acti ... -
ActiveMQ in Action(4)
2008-09-10 13:40 3475ActiveMQ in Action(4) 关键字: acti ... -
ActiveMQ in Action(3)
2008-09-10 13:39 3676ActiveMQ in Action(3) 关键字: acti ... -
ActiveMQ in Action(2)
2008-09-10 13:38 4207ActiveMQ in Action(2) 关键字: acti ... -
ActiveMQ in Action(1)
2008-09-10 13:37 5825ActiveMQ in Action(1) 关键字: acti ... -
为ActiveMQ服务器添加简单验证机制
2008-09-09 23:48 4192为ActiveMQ服务器添加简单验证机制 关键字: Java, ... -
Sender/receiver 消息
2008-09-09 20:28 2123Sender:import java.io.BufferedR ... -
activema.xml 配置
2008-09-09 17:44 3811/***作者:andyao,email:andyaoy@gma ... -
JMX 与系统管理
2008-09-08 10:52 1861Java SE 6 新特性: JMX 与系统管理 ... -
ActiveMQ中的消息持久性
2008-09-05 12:24 3389ActiveMQ中的消息持久性 ActiveMQ很 ...
相关推荐
javax.jms.TopicPublisher.class javax.jms.TopicConnectionFactory.class javax.jms.TopicRequestor.class javax.jms.XAConnection.class javax.jms.XASession.class javax.jms.XAConnectionFactory.class javax....
1. **JMS接口**:`javax.jms`包中定义了几个关键接口,包括`MessageProducer`、`MessageConsumer`、`QueueSender`、`QueueReceiver`、`TopicPublisher`、`TopicSubscriber`等。这些接口提供了创建和管理消息的基本...
5. **API接口**: JMS提供了两个主要的接口:`javax.jms.QueueSender`和`javax.jms.TopicPublisher`用于发送消息,`javax.jms.QueueReceiver`和`javax.jms.TopicSubscriber`用于接收消息。此外,还有`javax.jms....
而在发布订阅模型中,使用TopicPublisher。 消息消费者消息消费者是接收消息的客户端,它们同样通过Session创建MessageConsumer对象。在点对点模型中,消费者使用QueueReceiver接收消息,而发布订阅模型中则使用...
使用Topic会话创建一个TopicPublisher,它负责发布消息到Topic。`publisher = session.createPublisher(topic);` 7. **发送消息**: 最后,我们创建并发送消息。在这个例子中,我们创建了两种类型的JMS消息:`...
2. **发布/订阅模型(Topic)**:使用TopicPublisher发布消息,TopicSubscriber订阅并接收消息,支持广播式通信。 3. **消息类型**:包括TextMessage(文本消息)、ObjectMessage(Java对象)、BytesMessage(字节流...
编程模式与P2P类似,但使用TopicConnection和TopicSession,创建TopicPublisher发送消息,TopicSubscriber接收消息。 **5. 二阶段提交的事务** JMS支持JTA(Java Transaction API)的二阶段提交,确保跨多个资源的...
- `javax.jms.TopicPublisher` 和 `javax.jms.TopicSubscriber`: 用于发布/订阅模型中的消息发布和订阅。 使用JMS时,需要选择一个JMS实现,如ActiveMQ、RabbitMQ或Apache Qpid等。配置连接工厂和目的地(队列或...
在`javax.jms`包中,包括`MessageProducer`, `QueueSender`, `TopicPublisher`等类,这些都是发送端的主要接口。通常,你需要引入`jms.jar`或在现代Java应用中,包含在Java EE的`javaee-api.jar`或`javax.jms-api....
消息的生产者和消费者分别由`MessageProducer`和`MessageConsumer`接口表示,它们各自有针对不同模式的子接口,如`TopicPublisher`、`QueueSender`、`TopicSubscriber`和`QueueReceiver`。 此外,`...
9. **TopicPublisher** 和 **TopicSubscriber**:发布/订阅模型中的特殊类型,只适用于主题。 在实际应用中,开发人员需要根据业务需求选择合适的模型,并利用JMS API进行编程。例如,PTP模型适合用于订单处理,...
- `TopicPublisher`:用于发布消息。 - `TopicSubscriber`:用于订阅消息。 3. **JMS消息结构**:JMS消息主要包括消息头、属性和消息体三个部分。 - **消息头**:包含消息的识别信息和路由信息。 - `...
8. **TopicPublisher** 和 **TopicSubscriber**: 这两个接口专门用于主题(Topic)操作,分别对应消息的发布和订阅。 javax.management.j2ee-api-1.1.1.jar则是Java管理扩展(JMX)的API,它提供了管理和监控Java...
- **TopicPublisher** 和 **TopicSubscriber**:对应发布/订阅模型中的消息发布和订阅。 - **ConnectionFactory**:创建连接的工厂,是JMS客户端与消息服务之间的桥梁。 - **Connection**:代表一个到JMS提供者的...
在JMS中,可以创建不同类型的MessageProducer和MessageConsumer,例如QueueProducer和TopicPublisher。 3. **抽象工厂模式**:为创建一系列相关或相互依赖的对象提供一个接口,而无需指定它们的具体类。在JMS中,...
例如,“TopicConnectionFactory facConFactory = jndi.lookup(java:comp/env/jms/topicfacConnFactory)”用于查找主题连接工厂,“TopicPublisher publisher = session.createPublisher(personInfoTopic)”创建一个...
- **API接口**:JMS提供了一套标准接口,如`javax.jms.QueueSender`、`javax.jms.TopicPublisher`等,供开发者在应用程序中使用。 - **消息模型**:JMS支持两种消息模型,即点对点(Queue)和发布/订阅(Topic)。...
OpenJMS提供了具体的实现类,例如`javax.jms.ConnectionFactory`、`javax.jms.QueueSession`和`javax.jms.TopicPublisher`等。 总结来说,OpenJMS服务器是实现JMS规范的一个强大工具,它为开发者提供了可靠的消息...