读书人

Spring调整Blazeds实现ActiveMQ JMS消

发布时间: 2012-09-08 10:48:07 作者: rapoo

Spring整合Blazeds实现ActiveMQ JMS消息服务

????? 上一篇中简单实现了Blazeds的JMS消息服务功能,但是JMS相关的配置信息都在messaging-config.xml文件中配置的,项目部署人员需要同时维护messaging-config.xml和Spring的jms配置信息,如果能把两者整合在那是一件很美妙的事情。经过我的一番努力终于统一了blazeds和spring的jms消息服务。

????? 先来说下我的大概思路:JMSAdapter是jms的消息适配器,它会加载messaging-config.xml里面jms的配置信息,JMSProxy是JMS服务的代理,它会根据配置信息连接ConnectionFactory、创—estination。知道了,JMS的工作流程那就开始改造代码:

????? 修改JMSAdapter.java

?????

    protected void validate()    {                if (isValid())            return;                super.validate();        //        if (settings.getConnectionFactory() == null)//        {//            // JMS connection factory of message destinations with JMS Adapters must be specified.            //            ConfigurationException ce = new ConfigurationException();//            ce.setMessage(MISSING_CONNECTION_FACTORY);//            throw ce;//        }//        //        if (settings.getDestinationJNDIName() == null)//        {//            // JNDI names for message destinations with JMS Adapters must be specified.//            ConfigurationException ce = new ConfigurationException();//            ce.setMessage(JMSConfigConstants.MISSING_DESTINATION_JNDI_NAME);//            throw ce;            //        }//        if (settings.getMessageType() == null)//        {//            // Unsupported JMS Message Type ''{0}''. Valid values are javax.jms.TextMessage and javax.jms.ObjectMessage. //            ConfigurationException ce = new ConfigurationException();//            ce.setMessage(INVALID_JMS_MESSAGE_TYPE, new Object[] {null});//            throw ce;            //        }            }

?

注释掉的代码是因为在messaging-config.xml中没有了JMS相关的配置信息。

?

?? 修改JMSProxy.java文件

??

   public void start() throws NamingException, JMSException    {    this.connectionFactory=(ConnectionFactory) SpringContext.getBean("JmsConnectionFactory");                this.destination=(Destination) SpringContext.getBean("JmsDestination");    //validate();                //initializeJndiContext();                //initializeConnectionFactory();                //initializeDestination();    }

?

SpringContext的getBean方法的作用是根据spring配置的beanID实例化相关的bean信息。附件中给我了SpringContext的源代码。JmsConnectionFactory为jms的连接工厂,JmsDestination是jms的消息主题Topic

?

下面是spring的jms相关bean的配置

?

<!-- JMS连接工厂 brokerURL方式 例如ActiveMQ--><bean id="JmsConnectionFactory" value="${jms.activemq_url}"></property></bean><!--JMS Topic目的地 例如 ActiveMQ--><bean id="JmsDestination" value="${jms.activemq_topic}"></constructor-arg></bean><!-- JMS模板 --><bean id="JmsTemplate" ref="JmsConnectionFactory"/><property name="defaultDestination" ref="JmsDestination"/></bean>

?

?下面是messaging-config.xml文件中JMS的配置信息。

<!-- JMS消息目标的配置 --><destination id="scanfile">           <adapter ref="jms" />           <channels>                     <channel ref="my-polling-amf" />                     <channel ref="my-streaming-amf" />            </channels></destination>

?

?Ok,到此为止,已经整合完毕,整合后context.xml文件就不需要了。

附件给我了我修改后的flex-messaging-core.jar和SpringContext的源码。到目前为止Blazeds的配置已经很简单了,但是还有一种更好的方案就是org.springframework.flex,该组件主要作用是Blazeds和Spring的整合,在以后的文章中我会继续向大家介绍这个组件的使用方法。

?

??? 本片介绍了activemq的实现方法,如果是weblogic服务器则可以使用weblogic自带的jms服务,spring配置weblogic信息,可以参考我的下一篇文章,Spring整合Blazeds实现Weblogic JMS消息服务

?

读书人网 >软件架构设计

热点推荐