activemq应用总结(一)
1.mq发送消息准备
配置
<spring:bean id="jmsFactory"
class="org.apache.activemq.ActiveMQConnectionFactory">
<spring:property name="brokerURL" value="${activemq.brokerURL}" />
<spring:property name="userName" value="${activemq.username}" />
<spring:property name="password" value="${activemq.password}" />
</spring:bean>
<spring:bean id="client" class="com.*.*.core.mq.Client" init-method="init" destroy-method="destroy">
<spring:property name="jmsFactory">
<spring:ref bean="jmsFactory" />
</spring:property>
<spring:property name="reqQueue">
<spring:ref bean="reqQueneOne" />
</spring:property>
<spring:property name="resQueue">
<spring:ref bean="resQueneOne" />
</spring:property>
<spring:property name="timeToLive" value="${activemq.timetolive}" />
<spring:property name="hostName">
<spring:ref bean="hostInfo.hostName"/>
</spring:property>
</spring:bean>
<spring:bean id="service" class="com.*.*.core.mq.AMQService">
<spring:property name="client">
<spring:ref bean="client" />
</spring:property>
<spring:property name="readTime" value="${activemq.readtimeout}" />
</spring:bean>
mq通过jmsFactory产生的connection
connection = jmsFactory.createConnection();
connection通过获取会话session
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
session产生producer.
producer = session.createProducer(reqQueue);
2.发送的消息体
ActiveMQBytesMessage byteMessage = new ActiveMQBytesMessage();
byteMessage设置JMSCorrelationID,Content(byteSequence = new ByteSequence(mqMessageEntity.getStrRecBuf().getBytes(MQGlobals.MQ_CHARSET));),property(name,value).JMSReplyTo(resQueue).
public String send(MQMessageEntity mqMessageEntity) { String sRecBuf = mqMessageEntity.getStrRecBuf(); String correlationID = String.valueOf(Thread.currentThread().getId())+"_"+createRandomString(); ClientAMQ clientAMQ = new ClientAMQ(); DataCache.instance().putData(correlationID, clientAMQ); mqMessageEntity.setCorrelationID(correlationID); client.sendMQ(mqMessageEntity); log.info("发送:correlationID="+correlationID+";["+sRecBuf+"]"); String returnBuf = clientAMQ.waitRes(readTime); DataCache.instance().removeData(correlationID); //打印接收报文 log.info("返回:correlationID="+correlationID+";["+returnBuf+"]"); if (null == returnBuf) { returnBuf = ""; } return returnBuf; }
3.接收消息配置
<spring:bean id="reqQueueOne"
class="org.apache.activemq.command.ActiveMQQueue">
<spring:constructor-arg value="${lianpay.reqQueueOne}"></spring:constructor-arg>
</spring:bean>
<spring:bean id="resQueueOne"
class="org.apache.activemq.command.ActiveMQQueue">
<spring:constructor-arg value="${lianpay.resQueueOne}"></spring:constructor-arg>
</spring:bean>
<!-- YT_RESP消息监听 -->
<spring:bean id="msgListener"
class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
<spring:constructor-arg>
<spring:bean
class="com.*.*.core.mq.MsgListener">
</spring:bean>
</spring:constructor-arg>
<spring:property name="defaultListenerMethod" value="handleMessage" />
<spring:property name="messageConverter" ref="messageConverter" />
</spring:bean>
<!-- 交易监听容器 -->
<spring:bean id="YTMsgContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<spring:property name="concurrentConsumers" value="${activemq.consumers}" />
<spring:property name="connectionFactory" ref="jmsFactory" />
<spring:property name="destination" ref="resQueueOne" />
<spring:property name="messageListener" ref="msgListener" />
<spring:property name="messageSelector" value="${selector.resp}"/>
</spring:bean>
4.接收消息
public void handleMessage(ActiveMQBytesMessage activeMQBytesMessage) { String correlationID = activeMQBytesMessage.getCorrelationId(); log.info("监听到消息:correlationID=" + correlationID + "];"+ activeMQBytesMessage.getDestination()); String returnBuf = null; try { returnBuf = new String(activeMQBytesMessage.getContent().getData(),MQGlobals.MQ_CHARSET); } catch (UnsupportedEncodingException e) { log.error("字符转换异常," + e.getMessage()); } // 判断内存中是否存在发送对象 Object obj = DataCache.instance().getData(correlationID); if (null != obj) { ClientAMQ clientAmq = (ClientAMQ) obj; clientAmq.setReturnBuf(returnBuf); clientAmq.startNotify(correlationID); } else { log.info("correlationID=" + correlationID + ";[" + returnBuf + "]"); } }
5,接受消息的消息体
public class ClientAMQ { private String returnBuf;//返回结果 /** * 开始等待 * @param waitTine * @return */ public synchronized String waitRes(long waitTime) { if(null!=returnBuf) return returnBuf; try { wait(waitTime); } catch (InterruptedException e) { e.printStackTrace(); } return returnBuf; } /** * 开始唤醒 * @param correlationID */ public synchronized void startNotify(String correlationID) { notify(); } public String getReturnBuf() { return returnBuf; } public void setReturnBuf(String returnBuf) { this.returnBuf = returnBuf; } }
浙公网安备 33010602011771号