JMS之ActiveMQ工具类分享(关于同步回执和异步回执)
来源:互联网 发布:solidworks软件优缺点 编辑:程序博客网 时间:2024/05/19 03:42
时隔一年,未写博客。
如今沉浸在各种代码之中不可自拔。前段时间写了一个基于ActiveMQ的工具类,在生产环境下使用过,没有什么大问题,分享出来给大家了解,当做互相学习和参考。
具体ActiveMQ是做什么的,就不细说了,直接百度就好。
工具类并没用使用Spring去管理ActiveMQ,本身目的是方便初学者学习AMQ和理清每一个对象是如何执行的。
这个工具类主要作用是希望能帮助更多人去了解AcriveMQ对强消息回执的同步和异步处理,网络上并没有太多相关的内容,并且也没有相关的源码可以参考。
文章后会附上附件,欢迎下载,如有疑问,下方留言。
发送消息并等待回执
/** * 发送点对点具有同步回执的消息 * @param sendTextMessage * @param config ##如果设置JSMUtil.ACK_CLIENT_ACKNOWLEDGE,则messageListener使用message.acknowledge()进行消息确认## * @param isPersistent * @param messageTimeout 默认值建议设置45秒 * @return JMSSendResultModel */public static JMSSendResultModel sendPointReplyTextMessageSync(String sendTextMessage,JMSConfigModel config,int isPersistent,Integer messageTimeout){Connection connection=getConnection(config);Session session=getSession(connection, config);Destination destination=getDestination(session,config,false);if(destination!=null){String reciveTextMessageString=null;MessageProducer messageProducer=null;try { messageProducer=session.createProducer(destination);messageProducer.setDeliveryMode(isPersistent);messageProducer.setTimeToLive(messageTimeout);TextMessage textMsg = session.createTextMessage(sendTextMessage);//构建回执(临时通道),这个很关键TemporaryQueue destinationReply=session.createTemporaryQueue();textMsg.setJMSReplyTo(destinationReply);//messageProducer.send(textMsg);if(config.isTransacted())session.commit();if(JMSConfig.debug)logger.debug("===============发送成功:"+sendTextMessage+" 等待回执========================");MessageConsumer messageConsumer = session.createConsumer(destinationReply);Message replyMessage=messageConsumer.receive(messageTimeout);if(replyMessage!=null&&(replyMessage instanceof TextMessage)){TextMessage textMessage=(TextMessage)replyMessage;reciveTextMessageString=textMessage.getText();if(JMSConfig.debug)logger.debug("===============回执成功!:"+reciveTextMessageString+" ========================"); if(config.getAcknowledge()==JMSConfig.ACK_CLIENT_ACKNOWLEDGE){ try { replyMessage.acknowledge();} catch (JMSException e) {// TODO Auto-generated catch blocke.printStackTrace();} }}} catch (JMSException e) {// TODO Auto-generated catch blocke.printStackTrace();String method = Thread.currentThread() .getStackTrace()[1].getMethodName();logger.error("func:"+method+" exception:"+e);return null;}JMSSendResultModel jmsResultModel=new JMSSendResultModel( config, sendTextMessage,reciveTextMessageString, messageProducer);return jmsResultModel;}return null;}
接收消息并同步回执
/** * 异步接收单点文本消息 * @param config ##如果设置JSMUtil.ACK_CLIENT_ACKNOWLEDGE,则messageListener使用message.acknowledge()进行消息确认## * @param jmsExcute * @return JMSReciveResultModel */public static JMSReciveResultModel recivePointReplyTextMessageAsync(JMSConfigModel config,JMSExcuter jmsExcute){Connection connection=getConnection(config);Session session=getSession(connection, config);Destination destination=getDestination(session,config,false);if(destination!=null){MessageConsumer messageConsumer = null;try { messageConsumer = session.createConsumer(destination);JMSMessageListener jmsMessageListener=new JMSMessageListener(session, config, jmsExcute){@Overridepublic void onMessage(Message message) {// TODO Auto-generated method stubDestination replyDestination ; // 创建回执消息 TextMessage textMessage;try {String result= (String)this.getJmsExcute().excute( ((TextMessage)message).getText());replyDestination = message.getJMSReplyTo(); textMessage = getSession().createTextMessage(result); MessageProducer producer = getSession().createProducer(replyDestination); producer.send(textMessage); producer.close();if(JMSConfig.debug)logger.debug("===============发送回执成功!:"+result+" ========================"); if(getConfig().getAcknowledge()==JMSConfig.ACK_CLIENT_ACKNOWLEDGE){ try {message.acknowledge();} catch (JMSException e) {// TODO Auto-generated catch blocke.printStackTrace();} }} catch (JMSException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} // 以上收到消息之后,从新创建生产者,然后在回执过去 }};messageConsumer.setMessageListener(jmsMessageListener);} catch (JMSException e) {// TODO Auto-generated catch blocke.printStackTrace();String method = Thread.currentThread() .getStackTrace()[1].getMethodName();logger.error("func:"+method+" exception:"+e);return null;}finally{}
激活调用方法:
发送消息
JMSSendResultModel jsModel= JMSUtil.sendPointReplyTextMessageSync(("我是测试:"+System.currentTimeMillis()), JMSConfig.config_NoTransactedAndACK_AUTO_ACKNOWLEDGE(JMSConfig.CONFIG_MODE_SEND,"test"), JMSConfig.DELIVERY_PERSISTENT, 45000);接收消息JMSExcuter jsmExcute=new JMSExcuter() { @Override public Object excute( String textMessage) { // TODO Auto-generated method stub// System.out.println("接受成功啦!"+textMessage.getText()); return "我是回执,您发送的内容是:"+textMessage; } }; JMSReciveResultModel jmsreReciveResultModel= JMSUtil. recivePointReplyTextMessageAsync( JMSConfig.config_NoTransactedAndACK_AUTO_ACKNOWLEDGE(JMSConfig.CONFIG_MODE_RECIVE,"test"), jsmExcute);
具体还是看附件源码啦,内容有点儿多,等后面再逐步完善。有疑问请在留言中提出,万分感谢。
Active有个巨坑的地方,就是activemq-all.jar包里面包含了太多的构建包,很容易和你项目里引用的包产生冲突,就比如logback。所以请使用我附件里的核心的jar就可以了,分离掉不必要的包。
点击下载源码附件
阅读全文
0 0
- JMS之ActiveMQ工具类分享(关于同步回执和异步回执)
- 关于XMPP和openfire中的消息回执和聊天状态
- 关于二代身份证照片回执
- 邮件回执
- 会议回执
- JMS学习十(Spring+ActiveMQ同步、异步)
- XMPP协议之消息回执解决方案
- XMPP协议之消息回执解决方案
- openfire 服务端讯息回执添加和响应
- XMPPFrameWork IOS 开发(七)消息回执
- XMPPFrameWork IOS 开发(七)消息回执
- XMPPFrameWork IOS 开发(七)消息回执
- XMPPFrameWork IOS 开发(七)消息回执
- 短信回执设置
- [置顶] XMPPFrameWork IOS 开发(七)消息回执
- ActiveMQ分享(一)JMS简介
- ActiveMQ分享(一)JMS简介
- ActiveMQ分享(一)JMS简介
- React Native常用第三方组件汇总--史上最全[转]
- IntelliJ IDEA插件系列:五大装逼神器
- opencv读取avi视频并抽取帧
- mysql索引详解
- FractalNet: Ultra-Deep Neural Networks without Residuals
- JMS之ActiveMQ工具类分享(关于同步回执和异步回执)
- Eclipse或MyEclipse工具中,进行文件搜索的时候,排除svn目录下的.svn-base文件
- 论C#之多继承
- java原生数据队列的简单使用,可变数据集合,遍历过程中动态添加数据并能在后续遍历过程中获取
- 事件对象
- 【大咖周语录】互联网时代教育的本质依旧是为了传承文化、创造知识、培养人才
- 万树IT:学软件测试的几大优势
- 专访华热科技高级架构师刘紫健:没有大数据,智慧供热的目标就无法达成
- BASIC-19VIP试题 完美的代价