




免费预览已结束,剩余6页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JMS 异步传输与Spring结合实例URL: /www-35java-com/archive/2010/12/31/1923480.html在Spring 2.0之前,Spring的JMS的作用局限于产生消息。这个功能(封装在 JmsTemplate 类中)当然是很好的,但是,它没有描述完整的JMS堆栈,比如像消息的 异步 产生和消耗。JMS堆栈缺少的这一部分已经被添加,Spring 2.0现在提供对消息异步消耗的完整支持。 让我们从一个例子开始。 首先我们打开ActiveMQ。从ActiveMQ的安装路径上的bin目录,那里有一个ActiveMQ.bat,双击执行即可。不过要注意必须先设置java_home环境变量。ActiveMQ默认的服务端口是61616。 然后我们开始配置Spring配置文件。我起名为spring-jms.xml1. 首先要配置一个ConnectionFactory代码如下 这里用到的ConnectionFactory是ActiveMQ提供的工厂,为了能使用这个工厂,我们必须在项目中添加以下几个jar文件:geronimo-jms_1.1_spec-1.0.jar,activeio-core-3.0-beta3.jar,activemq-core-4.0.1.jar,backport-util-concurrent-2.1.jar,commons-logging-1.0.4.jar,geronimo-j2ee-management_1.0_spec-1.0.jar以上这些Jar文件都存在于ActiveMQ安装目录的lib目录下,这些可是我一个一个试验出来的,累个半死。1. 然后应该配置一个Queue(我使用的是点对点方式),不过ActiveMQ只要提供一个名字就可以自动创建队列,因此这一步省了,呵呵 2. 下 面就轮到Spring的支持类了,首先是JmsTemplate。这个类提供了大量的方法简化我们对JMS的操作。常用的有两个, org.springframework.jms.core.JmsTemplate102和 org.springframework.jms.core.JmsTemplate,这两个类分别支持JMS的1.02版本和1.1版本。现在比较常用 的还是1.02版本。配置如下 上 面的配置中用到了第一步配置的connectionFactory以及一个消息转换的类messageConverter,这个类实现了 org.springframework.jms.support.converter.MessageConverter接口,可以在消息发送之前和接 受之后进行消息类型转换。具体的看最后的实例代码。配置代码如下: 这里还配置了发送的消息的存在时间timeToLive,目标Queue的名字defaultDestinationName,接受消息超时时间receiveTimeout1. 配置发送代码 1. 接着配置监听器,这是Spring2.0新增的功能,配置如下: Spring配置监听器有很多种选择,在这里我选择这回种MessageListenerAdapter方法主要是因为这个方法比较灵活。实现他只 要一个很普通的java类即可,和JMS以及Spring的耦合度最低。其中方法onMessage可以随便修改方法名,只要在配置文件中对应的修改就好 了。 MessageListenerAdapter还有一个功能就是如果处理方法(我这里是onMessage)返回一个非空值,它将自动返回一个响应 消息。这个消息会返回给JMS Reply-To属性定义的目的地(如果存在),或者是MessageListenerAdapter设置(如果配置了)的缺省目的地;如果没有定义目的 地,那么将产生一个InvalidDestinationException异常(此异常将不会只被捕获而不处理,它将沿着调用堆栈上传)。 这样我们的配置就都完成了。接下来我们来实现对应的Java文件先是接口文件发送消息接口IApmgtMessageProducer.javapublic interface IApmgtMessageProducer public abstract void sendMessage(ApmgtMessageData messageData);接受消息接口IApmgtMessageListener.javapublic interface IApmgtMessageListener public void onMessage(ApmgtMessageData message);发消息的文件DefaultApmgtMessageProducer.javapublic class DefaultApmgtMessageProducer implements IApmgtMessageProducer private JmsTemplate jmsTemplate; public void setJmsTemplate(JmsTemplate jmsTemplate) this.jmsTemplate = jmsTemplate; public void sendMessage(ApmgtMessageData messageData) this.jmsTemplate.convertAndSend(messageData); 收消息文件DefaultApmgtMessageListener.javapublic class DefaultApmgtMessageListener implements IApmgtMessageListener public void onMessage(ApmgtMessageData message) System.out.println(监听到消息:+message); 消息转换类ApmgtMessageConverter.javapublic class ApmgtMessageConverter implements MessageConverter private Log log = LogFactory.getLog(ApmgtMessageConverter.class); private SimpleMessageConverter converter; public void setConverter(SimpleMessageConverter converter) this.converter = converter; public Object fromMessage(Message message) throws JMSException, MessageConversionException if (message instanceof ObjectMessage) ObjectMessage o_message = (ObjectMessage)message; MessageHeader header = new MessageHeader(); header.setId(message.getLongProperty(id); header.setReceiver(message.getIntProperty(receiver); header.setSender(message.getIntProperty(sender); header.setSendPerson(message.getStringProperty(sendPerson); header.setType(message.getIntProperty(type); Serializable messageContent = o_message.getObject(); ApmgtMessageData messageData = new ApmgtMessageData(); messageData.setMessageContent(messageContent); messageData.setMessageHeader(header); return messageData; return null; public Message toMessage(Object object, Session session) throws JMSException, MessageConversionException if (object instanceof ApmgtMessageData) ApmgtMessageData data = (ApmgtMessageData) object; Message message = converter.toMessage(data.getMessageContent(), session); message.setLongProperty(id, data.getMessageHeader().getId(); message.setIntProperty(receiver, data.getMessageHeader().getReceiver(); message.setIntProperty(sender, data.getMessageHeader().getSender(); message.setIntProperty(type, data.getMessageHeader().getType(); message.setStringProperty(sendPerson, data.getMessageHeader().getSendPerson(); (发送消息MessageSender:n + message); return message; else return null; 消息类文件消息父类:ApmgtMessageData.javapublic class ApmgtMessageData protected T messageContent; protected MessageHeader messageHeader; public T getMessageContent() return this.messageContent; public MessageHeader getMessageHeader() return this.messageHeader; public void setMessageContent(T messageContent) this.messageContent = messageContent; public void setMessageHeader(MessageHeader messageHeader) this.messageHeader = messageHeader; 消息属性的一个类MessageHeader.javapublic class MessageHeader /* * 消息ID */ private long id; /* * 消息类型 */ private int type; /* * 消息发送方,发送消息的模块 */ private int sender; /* * 消息接收方,接收消息的模块 */ private int receiver; /* * 消息发送者,具体的用户 */ private String sendPerson; public MessageHeader() this.id = System.currentTimeMillis() ; public long getId() return id; public void setId(long id) this.id = id; public String getSendPerson() return sendPerson; public void setSendPerson(String sendPerson) this.sendPerson = sendPerson; public int getReceiver() return receiver; public void setReceiver(int receiver) this.receiver = receiver; public int getSender() return sender; public void setSender(int sender) this.sender = sender; public int getType() return type; public void setType(int type) this.type = type; 消息体的类ModPasswordRequest.javapublic class ModPasswordRequest implements Serializable private static final long serialVersionUID = 1L; /* * 旧密码 */ private String oldPassword; /* * 新密码 */ private String newPassword; public String getNewPassword() return newPassword; public void setNewPassword(String newPassword) this.newPassword = newPassword; public String getOldPassword() return oldPassword; public void setOldPassword(String oldPassword) this.oldPassword = oldPassword; 消息类:ApmgtModPasswordRequest.javapublic class ApmgtModPasswordRequest extends ApmgtMessageData private static final int REQ_MODPASSWORD = 0; private static final int INTF = 1; private static final int APMGT = 2; public void init() messageHeader = new MessageHeader(); messageContent = new ModPasswordRequest(); messageHeader.setType(REQ_MODPASSWORD); messageHeader.setSender(INTF); messageHeader.setReceiver(APMGT); messageContent.setNewPassword(123456); messageContent.setOldPassword(654321); 最后是测试类Main.java public class Main public static void main(final String args) throws Exception PropertyConfigurator.configure(perties); Abstr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 栀子炒焦炮制技术
- 离婚财产分割协议中遗产继承补充条款
- 夫妻双方共同债务承担及房产过户补充协议范本
- 《个性化定制离婚协议模板:财产分割与子女监护》
- 高新技术企业员工待岗及薪酬保障协议
- 竞业限制及保密协议范本:离职员工竞业限制细则
- 离职员工竞业限制协议及违约责任认定范本
- 高端设备研发成果保密及技术转移合同模板
- 绿色环保住宅小区物业服务合同履行环境质量担保书
- 精美的古风课件
- 2025年下半年安徽省港航集团有限公司所属企业社会公开招聘22名考试参考试题及答案解析
- 人教PEP版六年级英语上册全册教案
- 3D打印技术在制造业2025年发展趋势及市场前景可行性分析报告
- 综合楼玻璃安装合同协议书范本模板6篇
- 2025年度集中供暖项目暖气设施安装及售后服务合同
- 护士医护人员职业安全防护培训
- 2025福建厦门市公安局同安分局招聘警务辅助人员50人笔试备考试题及答案解析
- 2025年四川省建筑安全员A证模拟试题(及答案)
- 莲山教学课件下载
- 大学生创新创业基础课件 第7章 创业与创业历程
- 班主任育人故事经验分享陪伴每一名学生慢慢成长模板
评论
0/150
提交评论