- 浏览: 110223 次
- 性别:
- 来自: 北京
最新评论
-
bo_hai:
请问:这样配置可以解决事务回滚的问题吗?
基于spring和ibatis的多数据源切换方案 -
rockydang:
多谢分享。
第一个配置文件中有一块配置错了,估计是手误啊
...
基于spring和ibatis的多数据源切换方案 -
chao121:
[*]啊顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶121 ...
征求方案-关于多个excel,大数据量同时导入 -
jitabc:
效果很不错。
为spring2.5中的jpetstore增加perf4j监控 -
徐风子:
<p>原题来自:http://projecteul ...
一道软件面试题
环境
1.weblogic 9.2.3
已经创建JMS Connection Factory:jms/connectionFactory
JMS Queue:jms/TestQueue
JMS Topic:jms/TestTopic
实现一
通过spring的JmsTemplate发送消息到Queue,然后通过messageListener实现消息的异步接收.
完整的springl配置文件applicationContext-jms.xml如下:
<beans> <bean id="jmsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName"> <value>jms/connectionFactory</value> </property> <property name="jndiTemplate"> <ref bean="jmsJndiTemplate"></ref> </property> </bean> <!-- define jms queue jndi --> <bean id="jmsDestination" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName"> <value>jms/TestQueue</value> </property> <property name="jndiTemplate"> <ref bean="jmsJndiTemplate"></ref> </property> </bean> <!-- define jms queue url --> <bean id="jmsJndiTemplate" class="org.springframework.jndi.JndiTemplate"> <property name="environment"> <props> <!-- com.sun.enterprise.naming.SerialInitContextFactory --> <prop key="java.naming.factory.initial">weblogic.jndi.WLInitialContextFactory</prop> <prop key="java.naming.provider.url">t3://16.158.51.221:7001</prop> </props> </property> </bean> <!-- JMS Queue Send Template --> <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <property name="connectionFactory"> <ref local="jmsConnectionFactory" /> </property> <property name="defaultDestination"> <ref local="jmsDestination" /> </property> </bean> <bean id="jmsProducer" class="org.springframework.samples.jpetstore.jms.JmsProducer"> <constructor-arg ref="jmsTemplate" /> </bean> <bean id="messageListener" class="org.springframework.samples.jpetstore.jms.JpetstoreJmsListener" /> <bean id="listenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <!--property name="concurrentConsumers" value="5" /--> <property name="connectionFactory" ref="jmsConnectionFactory" /> <property name="destination" ref="jmsDestination" /> <property name="messageListener" ref="messageListener" /> <property name="sessionAcknowledgeModeName" value="AUTO_ACKNOWLEDGE"/> </bean> </beans>
消息发送JmsProducer代码如下
package org.springframework.samples.jpetstore.jms; import org.springframework.jms.core.JmsTemplate; public class JmsProducer { private JmsTemplate jmsTemplate; public JmsProducer(JmsTemplate jmsTemplate) { this.jmsTemplate = jmsTemplate; } public void sendMessage() { jmsTemplate.convertAndSend("Hello world!("+System.currentTimeMillis()+")"); } }
消息接收JpetstoreJmsListener代码如下
package org.springframework.samples.jpetstore.jms; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.TextMessage; public class JpetstoreJmsListener implements MessageListener { public void onMessage(Message message) { if (message instanceof TextMessage) { try { System.out.println("ok--"+((TextMessage)message).getText()); } catch (JMSException e) { throw new RuntimeException(e); } } else { throw new IllegalArgumentException( "Message must be of type TestMessage"); } } }
测试代码
public class JmsConsole { public static void main(String[] args) throws IOException { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-jms.xml"); JmsProducer sender = (JmsProducer) context.getBean("jmsProducer"); sender.sendMessage(); } }
运行JmsConsole,控制台输入如下:
ok--Hello world!(1250560961109)
将测试程序修改一下,如下
public static void main(String[] args) throws Exception { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-jms.xml"); JmsProducer sender = (JmsProducer) context.getBean("jmsProducer"); int i = 1; System.out.println(System.currentTimeMillis()); while(i<10){ System.out.println("line:"+i); sender.sendMessage(i); i++; } }
同时修改一下JpetstoreJmsListener
public void onMessage(Message message) { if (message instanceof TextMessage) { try { System.out.println("ok--"+((TextMessage)message).getText()); } catch (JMSException e) { throw new RuntimeException(e); } } else { throw new IllegalArgumentException( "Message must be of type TestMessage"); } System.out.println(System.currentTimeMillis()); }
将spring配置中的
<property name="concurrentConsumers" value="1" />
设置为1,运行测试程序,从开始往Queue发送消息开始到消息全部处理完毕结束平均耗时大概有600ms左右。
将spring配置中的
<property name="concurrentConsumers" value="9" />
设置为9,运行测试程序,从开始往Queue发送消息开始到消息全部处理完毕结束平均耗时大概也在600ms左右。
将循环加到100,设置为并发消费者数为1和为9的时间有10倍左右的差距。
因此对于大并发的Queue处理,设置concurrentConsumers是非常有必要的。
实现二
上面的例子是传输简单类型的消息,下面让我们看一下对象消息如何传输。
传输的对象如下
package org.springframework.samples.jpetstore.domain; import java.io.Serializable; public class Product implements Serializable { /* Private Fields */ private String productId; private String categoryId; private String name; private String description; /* JavaBeans Properties */ public String getProductId() { return productId; } public void setProductId(String productId) { this.productId = productId.trim(); } public String getCategoryId() { return categoryId; } public void setCategoryId(String categoryId) { this.categoryId = categoryId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } /* Public Methods*/ public String toString() { return getName(); } }
spring的配置不变,需要改变的是发送端代码和messageListener代码,如下
JmsProducer
package org.springframework.samples.jpetstore.jms; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.Session; import org.springframework.jms.core.JmsTemplate; import org.springframework.jms.core.MessageCreator; import org.springframework.jms.support.converter.SimpleMessageConverter; import org.springframework.samples.jpetstore.domain.Product; public class JmsProducer { private JmsTemplate jmsTemplate; public JmsProducer(JmsTemplate jmsTemplate) { this.jmsTemplate = jmsTemplate; } public void sendMessage() { jmsTemplate.send(new MessageCreator() { public Message createMessage(Session session) throws JMSException { Product p = new Product(); p.setCategoryId("1-2-3"); p.setName("TestP"); p.setProductId("P-1-2-3"); Message message = new SimpleMessageConverter().toMessage(p, session); message.setLongProperty("startTime", System.currentTimeMillis()); return message; } }); } }
JpetstoreJmsListener
package org.springframework.samples.jpetstore.jms; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.ObjectMessage; import org.springframework.jms.support.converter.SimpleMessageConverter; import org.springframework.samples.jpetstore.domain.Product; public class JpetstoreJmsListener implements MessageListener { public void onMessage(Message message) { if (message instanceof ObjectMessage) { try { Product p = (Product)(new SimpleMessageConverter().fromMessage(message)); System.out.println("ok--"+p.getProductId()); } catch (Exception e) { throw new RuntimeException(e); } } else { throw new IllegalArgumentException( "Message must be of type TestMessage"); } System.out.println(System.currentTimeMillis()); } }
测试代码
public class JmsConsole { public static void main(String[] args) throws IOException { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-jms.xml"); JmsProducer sender = (JmsProducer) context.getBean("jmsProducer"); sender.sendMessage(); } }
输入如下信息:
ok--P-1-2-3 1250585109375
附录
概念
JMS(Java Message Service)是Java程序与企业消息系统进行交互的规范,它提供了一组API用于创建、发送、接收和读取消息。JMS定义了一组通用的消息概念和功能,旨在降低开发者访问企业消息系统的难度,同时最大化应用程序的可移植性。
JMS消息模型
1、Pub/Sub模型:
一对多广播消息模式。在Pub/Sub模型中,消息发送方称为Publisher
,消息接收方称为Subscriber
。主题Topic
充当Publisher和Subscriber之间的中介,对某个Topic感兴趣的Subscriber在Topic上注册,Publisher将消息发送到指定的Topic,Topic上的消息将递送给所有注册的Subscriber。
Pub/Sub模型的主要特点:
对Topic上的一个消息,注册的每个Subscriber均得到该消息的一个拷贝。
Topic上的消息是自动递送给Subscriber的,不需要Subscriber去主动获取新消息,这种方式也称为推模式(Push Model)。
Publisher和Subscriber可以在运行时刻动态添加和删除。
2、P2P模型:
一对一消息模式。在P2P模型中,消息发送方称为Sender
,消息接收方称为Receiver
。队列Queue
充当Sender和Receiver之间的中介,Sender将消息发送到指定的Queue,Receiver从指定的Queue上获取消息。
P2P模型的主要特点:
对Queue上的每个消息,即使有多个Receiver请求该消息,有且只有一个Receiver接收到该消息。即每个消息只能被一个Receiver消费,消费之后消息就从Queue上删除了。
Receiver需要到Queue上请求消息,而不是自动递给它的,这种方式也称为拉模式(Pull Model)。
Queue上的消息是有顺序的,消息按照它发送到Queue上的顺序被Receiver取走。
发表评论
-
[引用自spring的ppt]spring remote技术比较
2010-08-24 09:37 1814Hessian Lightweight binary pr ... -
动态的为web service soap消息增加验证规则
2010-08-03 16:12 1961在我们当前的 SaaS 系统中 request 和 ... -
[引用]Design and implement POJO Web services using Spring and Apache CXF, Part 2:
2010-05-20 17:30 0Introduction In this article ... -
[引用]使用 Spring 和 Apache CXF 设计和实现 POJO Web 服务,第 1 部分: 使用 CXF 和 Spring 创建 Web 服务
2010-05-20 17:27 0引言 在本文中,您将使用 CXF 和 Spring 来构 ... -
Spring Aop Cache在Jpetstore中的应用
2009-08-25 11:35 1977基本上cache是通过key-value的形式来缓存数 ... -
基于spring和ibatis的多数据源切换方案
2009-08-13 15:06 6559在仅使用ibatis时,多数据源简直就是梦魇,每多一个数据源就 ... -
下一步学习方向
2009-08-03 18:05 751????? -
监控memcached
2009-08-03 18:02 1590监控memcached的运行情况还是很有必要的,当前尝试了如下 ... -
为Jpetstore增加memcached缓存支持
2009-08-03 10:37 2748Jpetstore是一个典型的web应用,其开发框架为stru ... -
学习memcached
2009-07-30 20:48 1150memcached是一个高性能、分布式的基于内存的对象缓存系统 ... -
为spring2.5中的jpetstore增加perf4j监控
2009-07-28 22:49 2028perf4j是一款类似于log4j ...
相关推荐
这是本人搭建的Spring框架,集成了Weblogic JMS,测试已经完成。现提供给大家下载学习。
本人开发的spring jms项目,已经上线近一年了,这里是我项目jms配置文件,使用的是spring jms 整合weblogic jms。如果真的需要,请咨询我,并且附上我上传的这个配置文件,附近中没有带有这个文件,一律不作任何回答...
主要介绍了Spring整合Weblogic jms实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
weblogic中使用JMS发送和接受消息(Queue and TOPIC)
weblogic jms 配置过程 博文链接:https://liyiye.iteye.com/blog/240724
NULL 博文链接:https://jackaney.iteye.com/blog/1276918
NULL 博文链接:https://a3mao.iteye.com/blog/313531
weblogi 整合 服务器 jms 异步消息 spring 包含weblogic的安装与配置 和在weblogic中配置jms。并有spring和jms的一个测试用例
在spring下配置jms。J2EE容器为weblogic8.1
6.6 JMS和事务 265 6.6.1 使用事务性Session 265 6.6.2 利用JTA全局事务 267 6.7 JMS服务器的异常监听 268 6.8 JMS集群 269 6.9 本章小结 270 第7章 利用JavaMail实现E-mail 271 7.1 E-mail简介 272 7.1.1 SMTP协议...
Spring MVC、EJB 3.0、JPA、JMS 和Web 服务等关键技术,展示了这些技术的应用。正文部分带 你经历这个应用程序设的计、开发和部署过程中每一个决策做出的过程,帮助你在自己的开发工 作中做出类似的决策。 读者对象 ...
12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的事务划分 12.2.8. 事务管理策略 12.2.9. 容器资源 vs 本地资源 12.2.10. 在应用服务器...
12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的事务划分 12.2.8. 事务管理策略 12.2.9. 容器资源 vs 本地资源 12.2.10. 在应用...
12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的事务划分 12.2.8. 事务管理策略 12.2.9. 容器资源 vs 本地资源 12.2.10. 在应用...
2. Spring 2.0和 2.5的新特性 2.1. 简介 2.2. 控制反转(IoC)容器 2.2.1. 新的bean作用域 2.2.2. 更简单的XML配置 2.2.3. 可扩展的XML编写 2.2.4. Annotation(注解)驱动配置 2.2.5. 在classpath中自动搜索组件...
Spring Framework 开发参考手册 Rod Johnson Juergen Hoeller Alef Arendsen Colin Sampaleanu Rob Harrop Thomas Risberg Darren Davison Dmitriy Kopylenko Mark Pollack ...19.2. 使用Spring JMS ...
Spring Boot Documentation 1. About the Documentation 2. Getting Help 3. First Steps 4. Working with Spring Boot 5. Learning about Spring Boot Features 6. Moving to Production 7. Advanced Topics II. ...
ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位. ⒈ 多种语言和协议编写客户端。语言: Java,C,C++,C#,...
使用Spring Data JPA和Mongo仓库 x. 67.10. 将Spring Data仓库暴露为REST端点 vii. 68. 数据库初始化 i. 68.1. 使用JPA初始化数据库 ii. 68.2. 使用Hibernate初始化数据库 iii. 68.3. 使用Spring JDBC初始化数据库 ...
ActiveMQ是一个完全支持JMS1.1和J2EE 1.4规范的JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。 主要特点: 1、多种语言和协议编写客户端。语言:Java,C...