- 浏览: 156300 次
文章分类
最新评论
-
飘零雪:
[b][/b][i][/i][u][/u]引用
自定义Mave archetype的创建 -
fujohnwang:
<div class="quote_title ...
基于iBatis的开源分布式数据访问层 -
gzenzen:
<pre name="code" c ...
基于iBatis的开源分布式数据访问层 -
fujohnwang:
bornwan 写道我就很想知道分布式数据源,水平切分之后排序 ...
基于iBatis的开源分布式数据访问层 -
fujohnwang:
gzenzen 写道什么时候支持mybatis3、spring ...
基于iBatis的开源分布式数据访问层
本来想就这个写一系列的东西,不过, 很难拼凑足够数量的案例(自然也成不了书),所以, 先暂且随手捡两个掰一掰, 一个黑的,一个红的...
话说PACMAN项目需要对DTC来的消息处理过程进行优化,这活儿到我头上了, 本来吧, 小事儿, 虽然数据量一下子从两三万蹿到100万左右, 首先咱可以提高worker threads的数量嘛, 实在不行, 咱再考虑分布, 但这是宏观上的, 这里的小陷阱存在于细节中, 有句话叫做“The problem isn't design; it's implementation.”, 说的就是这个道理, 不过,这有些扯远了...
程序重构完了,该测试了。 第一次启动Weblogic, 测了一轮, 有些地方需要持续修正, 程序部署之后, 重新启动Weblogic,当当, 异常来啦!
javax.jms.JMSException: Duplicate durable subcription detected at com.tibco.tibjms.Tibjmsx.buildException(Tibjmsx.java:562) at com.tibco.tibjms.TibjmsSession._createConsumer(TibjmsSession.java:437) at com.tibco.tibjms.TibjmsSession._createConsumer(TibjmsSession.java:366) at com.tibco.tibjms.TibjmsSession.createDurableSubscriber(TibjmsSession.java:3950) at com.tibco.tibjms.TibjmsTopicSession.createDurableSubscriber(TibjmsTopicSession.java:114) at com.citigroup.posmgmt.util.consumer.JMSTopicConsumer.initialiseService(JMSTopicConsumer.java:105) at com.citigroup.posmgmt.util.consumer.DTCMsgConsumer.initService(DTCMsgConsumer.java:146) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1133) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1095) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:396) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:233) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:145) at com.citigroup.posmgmt.ejb.AdminMsgHandler.startRealTimeConsumer(AdminMsgHandler.java:135) at com.citigroup.posmgmt.ejb.AdminMsgHandler.onMessage(AdminMsgHandler.java:68) at weblogic.ejb.container.internal.MDListener.execute(MDListener.java:429) at weblogic.ejb.container.internal.MDListener.transactionalOnMessage(MDListener.java:335) at weblogic.ejb.container.internal.MDListener.onMessage(MDListener.java:291) at weblogic.jms.client.JMSSession.onMessage(JMSSession.java:4072) at weblogic.jms.client.JMSSession.execute(JMSSession.java:3962) at weblogic.jms.client.JMSSession$UseForRunnable.run(JMSSession.java:4490) at weblogic.work.ExecuteRequestAdapter.execute(ExecuteRequestAdapter.java:21) at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:145) at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:117)
他娘的, 不能把?!怎么隐约记得之前好象测试其他地方的时候也遇到过类似的问题那? 不过, 那时候也不知道怎么糊弄过去了, 看来不成, 确实哪里有问题啊!
EMS服务器还是人家NY的, 咱也上不去阿, 能上去也好看一下是不是其他连接在那里, 到底谁在捣乱, 发信给NY,告诉没权限, nnd, google吧, 围绕EMS和这个异常折腾了好是一通, 未果。 忘了都折腾啥了, 反正我是彻底的翻了一遍code和spring配置文件, destroy方法真真切切的在那里,我都挨个字母得对名称啊, 对完了也没发现有问题。
最后, 不管了, 出去溜达了一圈, 回头一想, tnnd,不会之前的代码没有触发对象销毁的行为吧?不然,这多出来的连接到底哪里来的?好像除了我也没人在做同样的事情啊! 查入口类StartupManager, 得, 还真他娘的是这么回事, shutDownService()方法只有抛出Exception的情况下才会被调用到, 正常情况下, 反而没有被调用, 靠, 这代码都跑了2年了, 这帮人居然没发现, 还好意思说, 代码都跑了两年了,没有遇到这样的问题啊, 这Batch从市场关闭到市场开启的近乎半天时间里, 你就算不关Connection, 那服务器那边也会按照超时给你“咔嚓”掉吧?这样的跑了两年当然没问题啦!
生活在Spring容器中的对象, 他们的生命周期是由容器来管理的, 但是, 仅仅通过实现DisposableBean接口或者通过destroy-method配置项, 甚至通过JSR250的@PreDestroy标注, 容器并不会在程序退出的时候,自动调用这些对象销毁的回调,我们必须在程序的主入口类或者其它合适的位置明确告知Spring容器, “哥们, 我要下班了,你把那些家伙都收拾了吧!”, 之后, 你通过以上所有方式指定的对象销毁逻辑才会被调用,否则, 哼哼...
用行话来说就是, 如果你使用的是BeanFactory类型的IoC容器,那么,你最好在容器构造完成后, 保险起见,顺便加上以下这样的代码片断:
Runtime.getRuntime().addShutdownHook(new Thread(){ @Override public void run() { if(beanFactory != null){ beanFactory.destroySingletons(); } } });
如果你使用的是ApplicationContext类型的IoC容器,那么, 与上面类似:
ApplicationContext ctx = ...; ((AbstractApplicationContext)ctx).registerShutdownHook();
当然了, 道理实际上跟上面BeanFactory对应的处理差不多。
这样的处理虽然不能保证100%的安全,不过,只要你不是太粗鲁的对待你的应用程序,比如kill -9或者直接System.halt()之类, 这道安全网还是必要的。
Note |
这个问题实际上早就写入了《Spring揭密》之中,只不过, 既然书还没出来,那就再重复一下这一言论吧! |
还是跟JMS连接有关, 话说纽约DDI Team某天突然发彪,说, “要连接到我们的EMS服务器订阅消息,必须通过用户和密码验证, 那种不验证就使用我们服务的日子已经一去不复返了。”
收到旨意之后, 你得赶快行动啊, 不然,下个release拿不到trades信息可就是你自己的问题了, 还好啦, 现在的Subscriber已经提供了这样的支持, 直接设置相应的username和pasword就行了。 不过那,如果你是通过JmsTemplate或者MessageListenerContainer来发送或者接受消息的话, 你该怎么做哪?! 也只是通过为JmsTemplate或者MessageListenerContainer提供连接的用户名和密码设置就行了?呵呵,倒是找找看, 你是否能找到相应的setter方法吧。
摘录一段别人的代码如下:
if(String.valueOf(userName).trim().length()>0) { topicConn = connFactory.createTopicConnection(userName,password); } else { topicConn = connFactory.createTopicConnection(); }
如果你觉得JmsTemplate或者MessageListenerContainer在实现的时候也是这样处理的,那么, 在上面的那个场景中,你将浪费某些精力和时间去寻找这个方向上的答案, 但即使你去查代码,估计你也不会有啥收获。实际上,针对这个问题, Spring框架已经提供了对应的解决方案, 但是, 解决问题的角度不同而已。
Spring提供了一个UserCredentialsConnectionFactoryAdapter, 通过它,对你提供给JmsTemplate或者MessageListenerContainer使用的ConnectionFactory稍微“打扮”一下就行了, 例如:
ConnectionFactory cf = (ConnectionFactory) ctx.lookup(connectionFactoryJndiName); UserCredentialsConnectionFactoryAdapter connectionFactoryAdaptor = new UserCredentialsConnectionFactoryAdapter(); connectionFactoryAdaptor.setTargetConnectionFactory(cf); connectionFactoryAdaptor.setUsername("ddi_admin"); connectionFactoryAdaptor.setPassword("ddi_admin"); ... // *** JmsTemplate jmsTemplate = new JmsTemplate(connectionFactoryAdaptor);
现在, 验证信息可以生效了。 说白了, 还是包装,包装,再包装,最终都是为了“偷梁换柱”!
Caution |
如果是使用JmsTemplate来发送消息,为了避免JmsTemplate内部不断创建新的连接, 保险起见, 可以使用SingleConnectionFactory对ConnectionFactory再包装一层(当然了,如果拿到的ConnectionFactory早已配置了连接池来控制资源的使用,也可以不用这么做),例如: ConnectionFactory cf = (ConnectionFactory) ctx.lookup(connectionFactoryJndiName); UserCredentialsConnectionFactoryAdapter connectionFactoryAdaptor = new UserCredentialsConnectionFactoryAdapter(); connectionFactoryAdaptor.setTargetConnectionFactory(cf); connectionFactoryAdaptor.setUsername("ddi_admin"); connectionFactoryAdaptor.setPassword("ddi_admin"); final SingleConnectionFactory singleCf = new SingleConnectionFactory(connectionFactoryAdaptor); Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { try { singleCf.destroy(); } catch (Exception e) { logger.error("failed to destroy single connection factory.\n"); logger.error(ExceptionUtils.getFullStackTrace(e)); } } }); JmsTemplate jmsTemplate = new JmsTemplate(singleCf); 安全第一, 安全第一... |
Know Spring And Have Fun With Spring.
发表评论
-
基于iBatis的开源分布式数据访问层
2011-03-28 11:46 5536http://code.alibabatech.com/wik ... -
分布式数据访问与同步场景浅析
2010-09-06 19:50 2235分布式数据访 ... -
Netty Framework Tips And Gotchas
2010-08-11 18:01 2663王福强(Darren.W ... -
有关Maven编译DeprecatedAPI失败的问题
2010-08-02 10:59 4468在项目代码里用了sun.misc.Signal ... -
Java Daemon Control
2010-07-27 17:50 2903Java Daemon Control ... -
Event Driven Style API Design Instead of Old Procedure Style Ones
2010-07-12 19:53 1471王福强(Darren.Wang) <f ... -
HA狭义与广义论
2010-07-09 09:25 1462Author: Darren Wang(fujohnwang) ... -
Why We Need A Global ID Generator?!
2010-05-18 13:01 1621Table of Contents 1. Pai ... -
Gotchas With JUnit's Execution Model
2010-03-26 09:22 1046Maybe you have known it before, ... -
Transaction Management Patterns In Brief
2010-02-09 10:27 1761There are several patte ... -
"扩展Spring的依赖注入行为"两例
2009-12-26 12:59 2726扩展Spring的依赖注入行为两例 ... -
框架API设计相关的碎言
2009-11-17 09:32 1606框架的API设计,应该是 ... -
自定义Mave archetype的创建
2009-10-29 20:12 12349Table of Contents ... -
看来有人已经有要抢先推出这个节目的意思了
2009-10-27 19:29 1014这篇blog对java, clojure和scala中的并发处 ... -
Roma Documentation Outline
2009-10-27 17:35 150Roma Docume ... -
Hot Stuff - Lombok
2009-10-22 19:46 1024give it a try, it's really cool ... -
ROMA框架潜在改进点思考(Thinking in ROMA improvements)
2009-10-21 19:53 1931. 关于ROMA现有表单 ... -
Valang Validator under the hood
2009-10-19 13:29 1658Table of Contents 1. Va ... -
ThreadSafety, Non-ThreadSafety 与 Stateless, Stateful有必然的对应关系吗?
2009-10-09 09:11 1856“It depends. ” 我们 ... -
A Big Piture On Concurrency
2009-09-12 09:49 12353- Concurrency Share (Concur ...
相关推荐
Spring Cloud Context 提供了 ApplicationContext 的实用程序和特殊服务,而 Spring Cloud Commons 则是一组在不同的 Spring Cloud 实现中使用的抽象和常用类。 在使用 Spring Cloud 时,需要注意到由于“非法密钥...
Spring Framework 是Java开发中的核心框架,它以其强大的功能和易用性成为了许多开发者首选的工具。Spring Framework 6.0.8-SNAPSHOT 的中文文档是针对这一最新版本的详尽指南,旨在解决中文互联网上关于Spring框架...
Siva Prasad Reddy Spring is the most popular Java-based framework for building enterprise ...applications quickly and easily, and the inner workings of Spring Boot using easy-to-follow examples.
Spring框架是Java开发中最广泛应用的轻量级框架之一,它以IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)为核心,极大地简化了企业级应用的开发工作。这份"spring 源码...
Spring Batch是一个轻量级的,完全面向...5、提供Spring框架中配置、自定义、和扩展服务。 6、所有存在的核心服务可以很容的被替换和扩展,不影响基础层。 7、提供一个简单的部署模式,利用Maven构建独立的Jar文件。
在Java开发领域,Spring Boot和Spring Batch的整合是构建高效...通过学习和实践这个示例,你不仅可以掌握如何在Spring Boot中使用Spring Batch,还能了解批处理的最佳实践,这对于处理大数据量的应用场景非常有价值。
答:Spring Boot 的启动方式有多种,包括在 IDEA 中直接启动、使用 Maven 命令来启动、使用 Maven 编译生成 Jar 包,然后使用 Java 命令来启动等。 题目 3: Spring Boot 中,Tomcat 的默认端口是多少? 答:Spring...
而"Maven3实战笔记(整合).pdf"则可以帮助开发者了解如何使用Maven这一强大的构建工具与Spring框架进行整合,实现自动化构建和依赖管理。 总的来说,Spring 5.0.0不仅在核心功能上进行了强化,还在反应式编程、Web...
在本文中,我们将深入探讨如何在IntelliJ IDEA(IDEA)中使用Spring框架进行简单的入门。Spring是一个广泛使用的开源Java框架,它为构建企业级应用程序提供了强大的支持,包括依赖注入、面向切面编程(AOP)、事务...
描述:Spring Boot中文文档是Spring Boot官方文档的中文翻译版,它包含了Spring Boot的基本介绍、快速入门、核心特性、高级特性等内容,可以帮助用户快速了解和掌握Spring Boot的使用方法和技巧。 Spring Boot是一款...
在表达式语言(SpEL)章节中,介绍了Spring表达式语言的基础知识和功能特性,以及如何在Bean定义中使用SpEL表达式进行求值和语言参考。 测试章节提供了单元测试和集成测试的示例和最佳实践,包括JDBC测试和使用...
依赖关系管理和命名约定 Spring依赖和依靠弹簧 Maven依赖管理 艾薇依赖管理 1.3.2。 日志 不使用通用日志 使用SLF4J 使用Log4j 二世。 什么是新的在春季3 2。 新特性和增强功能在Spring框架3.0 2.1。 Java 5 2.2。 ...
Spring 的事务管理机制使得应用程序可以在数据库和其他资源中执行事务。 Spring 的事务管理机制提供了多种方式来管理事务,包括编程式事务和声明式事务。 Spring 的 JDBC 模块提供了多种方式来访问数据库,包括 ...
我们可以在业务层自己控制 A 和 B 的初始化顺序,在 A 中设置一个“是否初始化的”标记,B 初始化前检测 A 是否得以初始化,如果没有则调用 A 的初始化方法,所谓的 check-and-act。 这种方法的优点是可以做到 lazy...
Database interaction using Spring and Hibernate/JPA- Spring Data JPA- Spring Data MongoDB- Messaging, emailing and caching support- Spring Web MVC- Developing RESTful web services using Spring Web ...
而Spring Security 则是 Java 开发中广泛使用的安全框架,用于实现认证和授权。当我们将这两者结合时,我们可以创建一个强大的统一登录认证鉴权系统。 首先,让我们深入了解Spring Cloud Gateway。这是一个基于...
在JavaWeb开发中,Spring框架是一个至关重要的组件,它提供了丰富的功能来简化应用程序的构建,尤其是在服务层和表现层的整合上。Spring 4.2.0是该框架的一个稳定版本,它支持Java Development Kit(JDK)1.8,这...
在 Java 领域中,Spring Integration 和 Spring WS 是两个常用的框架,它们分别负责集成系统和 Web 服务。今天,我们将探讨如何将这两个框架整合在一起,实现一个完整的 Web 服务解决方案。 Spring Integration ...
Spring Framework 是一个广泛使用的 Java 应用程序框架,它提供了一个通用的编程模型和配置机制,帮助开发者快速构建企业级应用程序。下面是对 Spring Framework 的详细知识点总结: 1. 什么是 Spring? Spring ...
* 依赖注入(Dependency Injection): Spring使用依赖注入来解耦合应用程序中的组件,提高系统的灵活性和可维护性。 * AOP(Aspect-Oriented Programming): Spring使用AOP来实现面向方面的编程,提高系统的可维护...