Spring对JMS的支持
Spring 提供了JMS的集成,简化JMS的使用,提供的API封装类似于Spring的JDBC集成。
JMS的功能大体上分为两类——接收、发送消息。Spring提供了:
- JmsTemplate来完成消息的发送、同步接收
- 消息监听器容器(message li…
Gradle学习笔记
Gradle是近年来流行起来的自动化构建工具,它具有以下特性:
- 灵活、通用的构建功能,类似Ant
- 基于约定的构建框架,类似Maven
- 强大的多工程构建支持
- 支持基于Apache Ivy的依赖管理,现已使用Gradle自己的依赖处理引擎(de…
使用Oracle Java Mission Control监控JVM运行状态
Oracle Java Mission Control(以下称JMC)是一个集成到JVM(jdk7u40+)的性能剖析和诊断工具,相比起JProfiler之类的性能剖析工具,JMC更加简单易用,界面友好。
JMC使用了JVM内部特定的基于事件的接口,不…
阅读全文Eclipse 4.3.2开发环境搭建
下载地址列表:http://www.eclipse.org/downloads/packages/release/Kepler/SR2
对于Java开发,建议选择:Eclipse IDE for Java EE Developers
如果同时需要使用BIRT进行报表开发,建议选择:Eclipse IDE for Java and Report De…
Tomcat知识集锦
报错信息:
Artifact pems-web-manager:war exploded: Error during artifact deployment. See …
阅读全文ActiveMQ知识集锦
与Spring DMLC集成,进行持久化订阅时,会报此错误,报错的根源是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
@Override public void setClientID(String newClientID) throws JMSException { checkClosedOrFailed(); // false if (this.clientIDSet) { throw new IllegalStateException("The clientID has already been set"); } // true if (this.isConnectionInfoSentToBroker) { // 不允许在“已经使用”的连接上执行设置clientID的操作 throw new IllegalStateException("Setting clientID on a used Connection is not allowed"); } this.info.setClientId(newClientID); this.userSpecifiedClientID = true; ensureConnectionInfoSent(); } |
可以看到,状态isConnectionInfoSentToBroker变为true后,就不能再设置ClientID,修改此字段值的,只…
阅读全文ActiveMQ代理网络无法连接的问题一例
基于JMS的ActiveMQ Java客户端示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
package cc.gmem.demo.amq.client; import javax.jms.Connection; import javax.jms.DeliveryMode; import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.MessageProducer; import javax.jms.Session; import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnectionFactory; public class Producer { private ActiveMQConnectionFactory factory; public Producer( String brokerHost, int brokerPort ) { factory = new ActiveMQConnectionFactory( "tcp://" + brokerHost + ":" + brokerPort ); } public void sendMsgToQueue( String queueName, String msg ) throws JMSException { Connection connection = null; try { //如果代理启用身份验证,这里需要指定用户、密码参数 connection = factory.createConnection(); connection.start(); //创建会话时有事务和确认选项 Session session = connection.createSession( false, Session.AUTO_ACKNOWLEDGE ); //如果代理上没有队列,则创建,否则,直接使用 Destination dest = session.createQueue( queueName ); //创建消息生产者 MessageProducer producer = session.createProducer( dest ); //设置消息是否持久化 producer.setDeliveryMode( DeliveryMode.NON_PERSISTENT ); //创建一个文本消息 TextMessage message = session.createTextMessage( msg ); producer.send( message ); } finally { connection.close(); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
package cc.gmem.demo.amq.client; import javax.jms.Connection; import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.MessageConsumer; import javax.jms.Session; import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnectionFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Consumer { private static final Logger LOGGER = LoggerFactory.getLogger( Consumer.class ); private ActiveMQConnectionFactory factory; public Consumer( String brokerHost, int brokerPort ) { factory = new ActiveMQConnectionFactory( "tcp://" + brokerHost + ":" + brokerPort ); } public String reveiveMsgFromQueue( String queueName ) throws JMSException { Connection connection = null; try { //如果代理启用身份验证,这里需要指定用户、密码参数 connection = factory.createConnection(); connection.start(); //创建会话时有事务和确认选项,如果确认选项为:SESSION_TRANSACTED,则必须启用事务 Session session = connection.createSession( true, Session.SESSION_TRANSACTED ); //如果代理上没有队列,则创建,否则,直接使用 Destination dest = session.createQueue( queueName ); //创建消息生产者 MessageConsumer consumer = session.createConsumer( dest ); //等待队列里面有消息可消费,最多1秒,超时返回NULL long timeout = 1000; TextMessage msg = (TextMessage) consumer.receive( timeout ); String recMsg = msg == null ? null : msg.getText(); //如果设置:Session.CLIENT_ACKNOWLEDGE,则必须手工确认:msg.acknowledge() session.commit();//如果设置:Session.SESSION_TRANSACTED,则必须提交或者回滚 return recMsg; } finally { connection.close(); } } } |
Tomcat7配置指南
server.xml包含了影响Tomcat7的Servlet/JSP容器行为的绝大部分配置项。可以在该配置文件中使用Ant风格的变量替换。变量可以使用系统属性,对于propname,可以使用${propname}这种形式的占位…
阅读全文JVM参数与性能调优
本文主要适用于HotSpot JVM的参数设置与调优。
工具类型 | 说明 |
堆Dump分析 | 推荐使用MAT,参考使用Eclipse Memory Analyzer分析JVM堆Dump |
栈Dump分析 | 推荐使用在线工具:http://fastthread.io/ |
低成本剖析 | 推荐使用JMC,参考使用Oracle Java Mission Control监控JVM运行状态 |
命令 | 说明 |
jps |
JVM Process Statu… |