activeMQ

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;
			}
		}
	}
}

转载于:https://my.oschina.net/erainm/blog/1186727

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值