- 浏览: 111781 次
- 性别:
- 来自: 北京
最新评论
-
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 1872Hessian Lightweight binary pr ... -
动态的为web service soap消息增加验证规则
2010-08-03 16:12 2005在我们当前的 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 2005基本上cache是通过key-value的形式来缓存数 ... -
基于spring和ibatis的多数据源切换方案
2009-08-13 15:06 6617在仅使用ibatis时,多数据源简直就是梦魇,每多一个数据源就 ... -
下一步学习方向
2009-08-03 18:05 773????? -
监控memcached
2009-08-03 18:02 1620监控memcached的运行情况还是很有必要的,当前尝试了如下 ... -
为Jpetstore增加memcached缓存支持
2009-08-03 10:37 2786Jpetstore是一个典型的web应用,其开发框架为stru ... -
学习memcached
2009-07-30 20:48 1181memcached是一个高性能、分布式的基于内存的对象缓存系统 ... -
为spring2.5中的jpetstore增加perf4j监控
2009-07-28 22:49 2056perf4j是一款类似于log4j ...
相关推荐
集成Spring和WebLogic JMS的关键步骤如下: 1. **配置JMS连接工厂**:在Spring的配置文件中,我们需要定义一个JMS连接工厂bean,通常使用`weblogic.jndi.WLInitialContextFactory`作为初始上下文工厂类,并设置JNDI...
以上就是配置Spring与WebLogic JMS的基本流程,这个过程中可能涉及源码的阅读和调试,以及使用一些工具(如JConsole、VisualVM等)进行监控和调优。在实际应用中,还需要结合具体的业务场景和需求进行调整和优化。
Spring 整合 Weblogic JMS 是一种非常有用的技术,可以为应用程序提供高性能、可靠性和灵活性的消息传递机制。 知识点: * Spring 整合 Weblogic JMS 的优点 * JMS 服务器配置 * Spring 配置 applicationContext-...
通过以上知识,开发者可以构建一个基于Spring的Java应用,有效地利用WebLogic Server的JMS服务进行消息传递,实现高效且可靠的异步通信。理解并熟练掌握这些概念和实践,对于在企业级环境中构建可扩展、高可用的系统...
本人开发的spring jms项目,已经上线近一年了,这里是我项目jms配置文件,使用的是spring jms 整合weblogic jms。如果真的需要,请咨询我,并且附上我上传的这个配置文件,附近中没有带有这个文件,一律不作任何回答...
集成Spring和WebLogic 9.2发送JMS消息的步骤如下: 1. **配置JMS连接工厂**:在Spring的配置文件中,你需要定义一个JMS连接工厂。这通常通过`jee:jndi-lookup`标签完成,指定在WebLogic中注册的JMS连接工厂JNDI名称...
WebLogic Server是一款由Oracle公司提供的企业级应用服务器,它支持Java Message Service (JMS) 规范,允许在分布式环境中可靠地发送和接收消息。JMS是Java平台上的标准接口,用于实现应用程序间的异步通信。本文将...
这可以验证WebLogic、JMS和Spring的整合是否成功。 **总结:** WebLogic与JMS+Spring的整合利用了WebLogic的稳定性和JMS的异步通信能力,结合Spring的灵活性和易用性,为开发高效、可扩展的企业级应用提供了强大的...
这个示例代码提供了从Spring Boot应用向WebLogic JMS发送和接收消息的基本结构,可以帮助开发者快速理解并实现自己的集成方案。通过深入研究和调整这些源码,你可以根据实际需求构建出更复杂的JMS应用场景,如事务性...
本文将深入探讨如何在Spring框架下配置JMS,并结合WebLogic 8.1这个J2EE容器进行实践。我们将围绕标题“jms.rar_weblogic8_spring_jms”以及描述中的关键信息展开。 首先,让我们理解JMS的核心概念。Java消息服务...
5. **配置应用程序**:在应用中引入JMS相关的依赖库,如JMS API、Spring框架的JMS支持和其他必要的库(如WebLogic客户端库)。 6. **编写接收端和发送端代码**:接收端通过监听器等待消息,发送端则负责创建消息并...
通过学习这篇博客,开发者可以了解到如何利用Spring JMS和JNDI在Java应用程序中实现高效、可靠的异步通信,提升系统的可扩展性和稳定性。这种技术在微服务架构和分布式系统中尤其有价值,因为它们通常依赖于消息传递...
5. JMS和Web服务:WebLogic支持JMS(Java Message Service),用于异步消息传递,还支持SOAP和RESTful Web服务。 二、WebLogic管理 1. 管理控制台:WebLogic Server通过一个基于Web的管理控制台,提供图形化的界面...
Weblogic支持EJB、JMS、JSP、Servlet等标准,还具备集群、负载均衡和安全管理等功能,是企业级应用的首选服务器。 2. **EJB3(Enterprise JavaBeans 3)**:EJB是Java EE规范的一部分,用于构建可复用的、安全的、...
WebLogic Server是基于Java平台的企业级中间件,它支持多种Java EE规范,如Servlet、JSP、EJB、JMS、JTA等。WebLogic提供了丰富的管理工具,如WebLogic Administration Console,用于配置、管理和监控WebLogic集群和...
1. JMS(Java Message Service):WebLogic支持JMS服务,可用于异步通信和消息队列,提高系统性能和稳定性。 2. JDBC数据源:配置和管理JDBC数据源,连接到数据库,提供统一的访问接口,支持数据源的连接池和事务...
WebLogic Server是一款由甲骨文公司提供的企业级Java应用程序服务器,是Java EE(Java Platform, Enterprise Edition)平台的实现,广泛用于构建、部署和管理分布式应用程序。本指南将深入探讨WebLogic Server的管理...