Spring对JMS的支持
简介
Spring 提供了JMS的集成,简化JMS的使用,提供的API封装类似于Spring的JDBC集成。
JMS的功能大体上分为两类——接收、发送消息。Spring提供了:
- JmsTemplate来完成消息的发送、同步接收
- 消息监听器容器(message li…
9 years ago
0
ActiveMQ学习笔记
MOM简介
MOM简介
中间件是一类连接软件组件和应用的计算机软件,它包括一组服务。 以便于运行在一台或多台机器上的多个软件通过网络进行交互。该技术所提供 的互操作性,推动了一致分布式体系架构的演进,通常用于支持并简化 那些复杂的分布式应用程序。
所谓面向消息的…
阅读全文
9 years ago
0
ActiveMQ知识集锦
常见问题
Setting clientID on a used Connection is not allowed
与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,修改此字段值的,只…
阅读全文
10 years ago
0
1
ActiveMQ代理网络无法连接的问题一例
环境说明:ActiveMQ 5.10.0,Windows Server 2008 R2。
最近开发人员在做基于ActiveMQ的数据同步测试时,其中的一台AMQ服务器一直无法连接到代理网络中,久久找不到原因。
我检查了一下配置,各ActiveMQ服务器… 阅读全文
10 years ago
0
基于CMS接口的ActiveMQ CPP客户端示例
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 |
#ifndef AMQUTILS_H_ #define AMQUTILS_H_ #include <cms/Connection.h> #include <cms/Session.h> #include <decaf/lang/Exception.h> using namespace decaf::lang; using namespace cms; namespace amqutils { inline void closeQuitely( Connection* conn, Session* session ) { if ( session ) try { session->close(); } catch ( Exception& e ) { } if ( conn ) try { conn->close(); } catch ( Exception& e ) { } } } #endif |
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 |
#ifndef PRODUCER_H_ #define PRODUCER_H_ #include <activemq/core/ActiveMQConnectionFactory.h> #include <boost/shared_ptr.hpp> #include <stdlib.h> #include <stdio.h> using namespace activemq; using namespace activemq::core; using namespace decaf; using namespace decaf::lang; using namespace decaf::util; using namespace decaf::util::concurrent; using namespace cms; using namespace std; using namespace boost; class Producer { private: boost::shared_ptr<ActiveMQConnectionFactory> amqf; Connection* connection; Session* session; public: Producer( string& uri, string& userName, string& password ); Producer( boost::shared_ptr<ActiveMQConnectionFactory> amqf ); virtual ~Producer(); virtual void init(); virtual void send( string& queueName, string& msg ); virtual void pub( string& topicName, string& msg ); }; #endif |
10 years ago
0
基于JMS的ActiveMQ Java客户端示例
JMS生产者:
JMS消费者:
结合Spring使用,配置文件示例
监听器实现类示例
阅读全文
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(); } } } |
10 years ago
0
常用C++库的编译步骤记录
BOOST 1.55.0
MinGW
1 2 3 4 5 |
CD D:\CPP\tools\boost-1.55.0\tools\build\v2 build.bat mingw CD D:\CPP\tools\boost-1.55.0 REM 下面是静态链接的多线程支持版本,根据需要调整 bjam --build-type=complete toolset=gcc address-model=32 variant=debug,release threading=multi link=static |
Cygwin
1 2 |
#在Cygwin Terminal中执行 ./bjam --layout=versioned --build-type=complete toolset=gcc address-model=32 variant=debug,release threading=multi link=static |
wxWidgets 3.0.1
如果PATH环境变量中包含MSYS的bin目录,需要暂时禁用
MinGW
ActiveMQ CMS Library 3.8.3
GCC依赖库
GCC
MinGW
在MSYS的终端中执行:
Cygwin
Google Test 1.7.0
MinGW
Cygwin
阅读全文
10 years ago
0
使用Atomikos来进行分布式事务(XA)开发
结合Spring使用
和Spring集成的时候,不需要JNDI服务器
注意,不支持Spring的事务传播性:PROPAGATION_NESTED
JTA事务管理器配置样例:
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 |
<bean id="localLogAdministrator" class="com.atomikos.icatch.admin.imp.LocalLogAdministrator" /> <bean id="userTransactionService" class="com.atomikos.icatch.config.UserTransactionServiceImp" init-method="init" destroy-method="shutdownForce"> <constructor-arg> <!-- 配置Atomikos属性 --> <props> <prop key="com.atomikos.icatch.service">com.atomikos.icatch.standalone.UserTransactionServiceFactory</prop> </props> </constructor-arg> <property name="initialLogAdministrators"> <list> <ref bean="localLogAdministrator" /> </list> </property> </bean> <!-- Atomikos 事务管理器配置 --> <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close" depends-on="userTransactionService"> <property name="startupTransactionService" value="false" /> <!-- close()时是否强制终止事务 --> <property name="forceShutdown" value="false" /> </bean> <!-- Atomikos UserTransaction配置 --> <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp" depends-on="userTransactionService"> <property name="transactionTimeout" value="300" /> </bean> <!-- JTA事务管理器 --> <bean id="jtaTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" depends-on="userTransactionService"> <property name="transactionManager" ref="atomikosTransactionManager" /> <property name="userTransaction" ref="atomikosUserTransaction" /> </bean> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<bean id="xaFactory" class="org.apache.activemq.ActiveMQXAConnectionFactory"> <property name="brokerURL" value="tcp://localhost:61616" /> </bean> <bean id="jmsFactory" class="com.atomikos.jms.AtomikosConnectionFactoryBean" init-method="init" destroy-method="close"> <property name="uniqueResourceName" value="amq" /> <property name="xaConnectionFactory" ref="xaFactory" /> </bean> <bean id="tipsMessageListener" class="cc.gmem.demo.TipsMessageListener" /> <!-- 接收消息 --> <jms:listener-container container-type="default" connection-factory="jmsFactory" transaction-manager="jtaTransactionManager" session-transacted="true"> <jms:listener destination="TIPS.10000.BATCH" ref="tipsMessageListener" method="onMessage" /> </jms:listener-container> <!-- 发送消息 --> <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <property name="connectionFactory"> <ref bean="jmsFactory" /> </property> <property name="receiveTimeout" value="1000" /> <property name="sessionTransacted" value="true" /> </bean> |
不使用Spring,单独和Hibernate集成
Hibe… 阅读全文
11 years ago
0