轻量级Spring 之 JmsTemplate 接收消息和发送消息

17 篇文章 0 订阅

                         Spring是一个完整的J2EE框架和解决方案,完整并且模块化,你可以用的他的全部也可以只用他的一部分特性,Spring 包含 IoC, AOP, 事务处理,ORM, 也包括一个简单的MVC框架.
           用Spring,自我感觉,可以使你的代码至少节约30%,它的很多template很不错的,比如简单封装后的jdbctemplate,jmstemplate等。ioc用后就会爱不释手,它让你的代码风格完全改观。以前我要产生个对象,绝大多数时候只回想到new一个对象,而用spring的ioc,beanfactory,只需要配置一个xml文件即可。这种方式实现了松偶合,对单元测试非常有利。
还有它的aop,也是很不错的,
用spring的感觉,正如它的名字一样:如沐春风.
关于spring中的jms,spring把jms进行了简单的封装,用它的JmsTemplate可以很方便的发送和接收消息,并且资源的管理都由template来管理了.

          1:在web.xml文件中配置一个spring用的上下文:

<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>
		/WEB-INF/jmsconfig.xml
	</param-value>
</context-param>
                   jmsconfig.xml用来装配jms,内容如下:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
	<bean id="jmsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
		<property name="jndiName">
			<value>jms/Ntelagent/RequestQCF</value>
		</property>
	</bean>
	<bean id="destination" class="org.springframework.jndi.JndiObjectFactoryBean">
		<property name="jndiName">
			<value>jms/Ntelagent/RequestQ</value>
		</property>
	</bean>

	<bean id="jmsConnectionFactoryForReceive" class="org.springframework.jndi.JndiObjectFactoryBean">
		<property name="jndiName">
			<value>jms/Ntelagent/ResponseQCF</value>
		</property>
	</bean>
	<bean id="destinationForReceive" class="org.springframework.jndi.JndiObjectFactoryBean">
		<property name="jndiName">
			<value>jms/Ntelagent/ResponseQ</value>
		</property>
	</bean>


	<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate102">
		<property name="connectionFactory">
			<ref bean="jmsConnectionFactory" />
		</property>
		<property name="defaultDestination">
			<ref bean="destination" />
		</property>
		<property name="messageConverter">
			<ref bean="jmsTrxConverter" />
		</property>
		<property name="receiveTimeout">
			<value>1</value>
		</property>
	</bean>

	<bean id="jmsTemplateForReceive" class="org.springframework.jms.core.JmsTemplate102">
		<property name="connectionFactory">
			<ref bean="jmsConnectionFactoryForReceive" />
		</property>
		<property name="defaultDestination">
			<ref bean="destinationForReceive" />
		</property>
		<property name="messageConverter">
			<ref bean="jmsTrxConverter" />
		</property>
		<property name="receiveTimeout">
			<value>1</value>
		</property>
	</bean>

	<bean id="jmsTrxConverter" class="co.transport.jms.JmsTransactionConverter">
		<property name="rspQueue">
			<ref bean="destinationForReceive" />
		</property>
	</bean>

	<bean id="jmsRequestTransport" class="co.transport.jms.JmsRequestTransport">
		<property name="jmsTemplate">
			<ref bean="jmsTemplate" />
		</property>
		<property name="jmsTemplateForReceive">
			<ref bean="jmsTemplateForReceive" />
		</property>
	</bean>

</beans>

     其中:

           jmsConnectionFactory为jms连接工厂,属性jndiName的value为server服务配置的jndi名称.

         destination为消息队列,属性jndiName为消息队列的jndi名称.

         jmsTemplate为配置spring消息模版:采用JmsTemplate102(如果你的JMS实现符合JMS规范1.1版,则应该使用JmsTemplate),其中的messageConverter属性配置了一个消息转换器,因为通常消息在发送前和接收后都需要进行一个前置和后置处理,转换器便进行这个工作。
由于我的sendQueue很receiveRueue是不同的queue,所以我配置了两个jmsTemplate:jmsTemplateForReceive负责接收消息,jmsTemplate负责发发送消息.

    发送消息的代码很简单:

            jmsTemplate.convertAndSend(request);

接收消息也很简单:

                Object obj = jmsTemplate.receiveAndConvert();
如果需要用一个过滤器接收特定的消息,则:

                 Object obj = this.jmsTemplateForReceive.receiveSelectedAndConvert(this.messageSelector);

发送和接收消息的class如下

public class JmsRequestTransport implements RequestTransport {
	private JmsTemplate jmsTemplate;

	private JmsTemplate jmsTemplateForReceive;

	private String messageSelector;

	private String destinationName;

	public void setJmsTemplate(JmsTemplate template) {
		this.jmsTemplate = template;
	}

	public void request(Object request) {
		jmsTemplate.convertAndSend(request);
	}

	public Object receive() {
		System.out.println("in JmsRequestTransport: destinationName = "
				+ this.jmsTemplateForReceive.getDefaultDestinationName());
		System.out.println("in JmsRequestTransport: messageSelector = "
				+ messageSelector);
		Object obj = this.jmsTemplateForReceive
				.receiveSelectedAndConvert(this.messageSelector);
		return obj;
	}

	public String getMessageSelector() {
		return messageSelector;
	}

	public void setMessageSelector(String string) {
		messageSelector = string;
	}

	public String getDestinationName() {
		return destinationName;
	}

	public void setDestinationName(String string) {
		destinationName = string;
	}

	public JmsTemplate getJmsTemplateForReceive() {
		return jmsTemplateForReceive;
	}

	public void setJmsTemplateForReceive(JmsTemplate template) {
		jmsTemplateForReceive = template;
	}

}

        要实现一个消息转换器,只需要实现MessageConverter接口,MessageConverter很简单,它只有两个方法需要实现:
              public Object fromMessage(Message msg){}
                  public Message toMessage(Object obj, Session session) throws JMSException{}
                     fromMessage为接收消息后,对消息进行的转换(通常是把一个message转化为一个Object对象)
                 toMessage为发送消息前需要的转化(通常为把一个Object转化为一个message对象)
                我的JmsTransactionConverte
public class JmsTransactionConverter implements MessageConverter {
	 
	 private Queue rspQueue; 

	 public JmsTransactionConverter(){}
	  
	 public Object fromMessage(Message msg){
	  MessageBean msgBean = new MessageBean();
	  TextMessage massage = (TextMessage)msg;

	  try {
	   String str = massage.getText();   
	   msgBean.setHead("HeadTest");
	   msgBean.setOutput(str);
	   msgBean.setStatus("success");
	   
	  } catch (JMSException e) {
	   // TODO Auto-generated catch block
	   msgBean = null;
	   e.printStackTrace();
	  }
	  finally {
	   return msgBean;
	  }
	   
	 }



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值