activeMQ作为系统间的消息推送中间件,经常会使用到 Spring配置 dubbo-provider.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- 对外公布接口 retries 失败后,重复调用次数 loadbalance 负载平衡的方法 actives -->
<!--客户服务-->
<dubbo:service interface="com.snt.crm.activemq.intf.MqMessageIntf" protocol="dubbo" ref="mqMessageIntf" />
</beans>
dubbo-consumer.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:reference interface="com.snt.crm.business.intf.SubTrafficCDRIntf" id="subTrafficCDRIntf" check="false"/>
<dubbo:reference interface="com.snt.crm.business.intf.SubscriberAccessIntf" id="subscriberAccessIntf" check="false"/>
<dubbo:reference interface="com.snt.crm.business.intf.AccountInfoIntf" id="accountInfoIntf" check="false"/>
<dubbo:reference interface="com.snt.crm.business.intf.SubscriberDetailInfoIntf" id="subscriberDetailInfoIntf" check="false"/>
<dubbo:reference interface="com.snt.crm.business.intf.CdrInternetTrafficIntf" id="cdrInternetTrafficIntf" check="false"/>
</beans>
dubbo-manage.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="crm_activemq" />
<!-- 使用zookeeper注册中心暴露服务地址 -->
<dubbo:registry protocol="zookeeper" address="${zookeeper.address}" />
<!-- 监控中心配置,protocol="registry",表示从注册中心发现监控中心地址 -->
<dubbo:monitor protocol="registry"/>
<!-- 当ProtocolConfig和ServiceConfig某属性没有配置时,采用此缺省值 -->
<dubbo:provider timeout="30000" threadpool="fixed" threads="100" accepts="1000" />
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="${activemq_dubbo_port}" />
<import resource="dubbo-provider.xml" />
<import resource="dubbo-consumer.xml" />
</beans>
spring-activemq.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd"
default-autowire="byName" default-lazy-init="false">
<!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供 -->
<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<!-- ActiveMQ服务地址 -->
<property name="brokerURL" value="${mq.brokerURL}" />
<property name="userName" value="${mq.userName}"></property>
<property name="password" value="${mq.password}"></property>
<property name="trustAllPackages" value="true"/>
</bean>
<!--
ActiveMQ为我们提供了一个PooledConnectionFactory,通过往里面注入一个ActiveMQConnectionFactory
可以用来将Connection、Session和MessageProducer池化,这样可以大大的减少我们的资源消耗。
要依赖于 activemq-pool包
-->
<bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory">
<property name="connectionFactory" ref="targetConnectionFactory" />
<property name="maxConnections" value="${mq.pool.maxConnections}" />
<property name="idleTimeout" value="0"/>
</bean>
<!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->
<bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">
<!-- 目标ConnectionFactory对应真实的可以产生JMS Connection的ConnectionFactory -->
<property name="targetConnectionFactory" ref="pooledConnectionFactory" />
</bean>
<!-- 配置线程池 -->
<bean id="threadPool" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<!-- 线程池维护线程的最少数量 -->
<property name="corePoolSize" value="5" />
<!-- 线程池维护线程所允许的空闲时间 -->
<property name="keepAliveSeconds" value="30000" />
<!-- 线程池维护线程的最大数量 -->
<property name="maxPoolSize" value="50" />
<!-- 线程池所使用的缓冲队列 -->
<property name="queueCapacity" value="100" />
</bean>
<!--这个是sessionAwareQueue目的地 -->
<bean id="businessQueue" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg>
<value>crm_business_queues</value>
</constructor-arg>
</bean>
<bean id="businessListener" class="com.snt.crm.activemq.listener.BusinessListener"/>
<bean id="businessListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory" />
<property name="destination" ref="businessQueue" />
<property name="messageListener" ref="businessListener" />
</bean>
<bean id="activeMqCrmBusiness" class="org.springframework.jms.core.JmsTemplate">
<!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->
<property name="connectionFactory" ref="connectionFactory"/>
<property name="defaultDestinationName" value="crm_business_queues"></property>
</bean>
<!-- crm端消息发送 -->
<bean id="activeMqAaaNotify" class="org.springframework.jms.core.JmsTemplate">
<!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->
<property name="connectionFactory" ref="connectionFactory"/>
<property name="defaultDestinationName" value="aaa_notify_queues"></property>
</bean>
</beans>
activemq.properties
## MQ
mq.brokerURL=tcp://192.168.xx.xx:61616
mq.userName=xxx
mq.password=xxx
mq.pool.maxConnections=10
#queueName
#queueName=crm_activeMQ
springmvc.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
<!-- 配置要扫描的包 -->
<context:component-scan base-package="com.snt.crm">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
</context:component-scan>
<!-- 采用注释的方式配置bean -->
<mvc:annotation-driven />
<!-- 读入配置属性文件 -->
<!-- <context:property-placeholder location="classpath:jdbc.properties,classpath:service.properties,classpath:activemq.properties" /> -->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<!-- 这里支持多种寻址方式:classpath和file -->
<!-- 推荐使用file的方式引入,这样可以将配置和代码分离,${resources_path}是获取VM arguments里的-D的值 -->
<value>file:${resources_path}/service.properties</value>
<value>file:${resources_path}/activemq.properties</value>
</list>
</property>
</bean>
<!-- proxy-target-class默认"false",更改为"ture"使用CGLib动态代理 -->
<aop:aspectj-autoproxy proxy-target-class="true" />
<import resource="classpath:spring/spring-activemq.xml" />
<import resource="classpath:spring/dubbo-manage.xml" />
</beans>
消息接口
package com.snt.crm.activemq.intf;
/**
* @描述:activemq消息接口
*/
public interface MqMessageIntf {
/**
* 消息生成
* @param message 消息内容
* @param type 业务类型
*/
public void sendMessage(Object message,int type);
}
消息接口实现
package com.snt.crm.activemq.intf.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.snt.crm.activemq.intf.MqMessageIntf;
import com.snt.crm.activemq.producer.ProducerBusiness;
/**
* @描述:activemq消息接口实现
*/
@Component("mqMessageIntf")
public class MqMessageIntfImpl implements MqMessageIntf{
@Autowired
private ProducerBusiness producer;
@Override
public void sendMessage(Object message, int type) {
producer.sendMessage(message, type);
}
}
MQ发送消息常量
package com.snt.crm.common.constants;
/**
* @描述: mq消息发送类常量
*/
public interface MqMessageConstant {
/**
* 消息类型,用于区分同一主题的消息
*/
public static final String MSG_TYPE = "msgType";
/**
* 消息类容,存放消息对应的数据
*/
public static final String MSG_CONTENT = "msgContent";
/**
* 话单上报
*/
public static final int TYPE_TRIFFIC = 0;
/**
* 用户接入状态上报
*/
public static final int TYPE_ACCESS = 1;
/**
* 同步订购信息
*/
public static final int TYPE_SYN_ORDER = 2;
/**
* 状态返回,同步crm
*/
public static final int TYPE_NMS_APPLY_STATUS = 3;
public static final int MQ_CRM_BUSINESS=0;
/**
* 订购关系变更通知
*/
public static final int MQ_AAA_NOTIFY = 1;
/**
* 产品变更通知
*/
public static final int MQ_AAA_PRO_CHANGE_NOTIFY = 2;
/**
* 流量账户和资金账户变更信息
*/
public static final int MQ_AAA_ACCOUNT_CHANGE_NOTIFY = 3;
}
MQ消息生产
package com.snt.crm.activemq.producer;
import javax.annotation.Resource;
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.stereotype.Component;
import com.alibaba.fastjson.JSONObject;
import com.snt.crm.common.constants.MqMessageConstant;
/**
*
* @描述: MQ消息生产者
*/
@Component
public class ProducerBusiness {
@Resource(name="activeMqCrmBusiness")
private JmsTemplate activeMqCrmBusiness;
@Resource(name="activeMqAaaNotify")
private JmsTemplate activeMqAaaNotify;
/**
* 发送消息.
* @param message
* @param type 业务类型
*/
public void sendMessage(final Object message,int type) {
switch(type){
case MqMessageConstant.MQ_CRM_BUSINESS:
activeMqCrmBusiness.send(new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
return session.createObjectMessage((JSONObject)message);
}
});
break;
case MqMessageConstant.MQ_AAA_NOTIFY:
activeMqAaaNotify.send(new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
return session.createObjectMessage((JSONObject)message);
}
});
break;
default:
break;
}
}
}
消息监听
package com.snt.crm.activemq.listener;
import java.util.HashMap;
import java.util.Map;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.ObjectMessage;
import javax.jms.Session;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.listener.SessionAwareMessageListener;
import com.alibaba.fastjson.JSONObject;
import com.google.protobuf.InvalidProtocolBufferException;
import com.snt.crm.business.intf.AccountInfoIntf;
import com.snt.crm.business.intf.CdrInternetTrafficIntf;
import com.snt.crm.business.intf.SubTrafficCDRIntf;
import com.snt.crm.business.intf.SubscriberAccessIntf;
import com.snt.crm.business.intf.SubscriberDetailInfoIntf;
import com.snt.crm.common.constants.MqMessageConstant;
/**
* @描述: 消费occ端接入的话单数据
*/
public class BusinessListener implements SessionAwareMessageListener<Message> {
private static final Logger log = LoggerFactory.getLogger(BusinessListener.class);
@Autowired
private SubTrafficCDRIntf trafficCDRIntf;
@Autowired
private CdrInternetTrafficIntf cdrInternetTrafficIntf;
@Autowired
private SubscriberAccessIntf subscriberAccessIntf;
@Autowired
private AccountInfoIntf accountInfoIntf;
@Autowired
private SubscriberDetailInfoIntf subscriberDetailInfoIntf;
@Override
public void onMessage(Message message, Session session) throws JMSException {
ObjectMessage msg = (ObjectMessage) message;
JSONObject resultMsg = (JSONObject)msg.getObject();
if(resultMsg!=null){
int msgType = resultMsg.getInteger(MqMessageConstant.MSG_TYPE);
switch(msgType){
case MqMessageConstant.TYPE_TRIFFIC:
//用户流量消息接收
//TODO
try {
cdrInternetTrafficIntf.insertCDRfromOCC(resultMsg.getBytes(MqMessageConstant.MSG_CONTENT));
} catch (InvalidProtocolBufferException e) {
log.error("保存话单数据出错",e);
}
break;
case MqMessageConstant.TYPE_ACCESS:
//用户登录状态接收
try {
byte[] buf = resultMsg.getBytes(MqMessageConstant.MSG_CONTENT);
subscriberAccessIntf.onlineOrOfflineUpdate(buf);
} catch (Exception e) {
log.error("更新用户状态失败",e);
}
break;
case MqMessageConstant.TYPE_SYN_ORDER:
//接收用户订购需要生效ID
try {
String subscriptionOrderIds= resultMsg.getString(MqMessageConstant.MSG_CONTENT);
accountInfoIntf.updateTimelyEffectiveSubscription(subscriptionOrderIds);
} catch (Exception e) {
log.error("立即生效订购关系失败",e);
}
break;
case MqMessageConstant.TYPE_NMS_APPLY_STATUS:
//nms返回apply status
try {
JSONObject jsonObject=resultMsg.getJSONObject(MqMessageConstant.MSG_CONTENT);
Map<String,Object> paramMap=new HashMap<String,Object>();
paramMap.put("terminalId", jsonObject.get("terminalId"));
paramMap.put("serviceState", jsonObject.get("applyStatus"));
subscriberDetailInfoIntf.updateVsetState(paramMap);
} catch (Exception e) {
log.error("返回的apply status同步失败",e);
}
break;
}
}
}
}
1253

被折叠的 条评论
为什么被折叠?



