在网上看到的jms教程,很多仅仅局限在发送接收上,而实际上本人认为异步jms中的事务管理是非常重要的,比如说网上银行,为了更好的响应用户,我们采用异步提交订单的方式,那么用户提交后,在其虚拟账户里,就减少了相应的数额,而真正账户的减少还正在进行,那么如果这个时候由于网络或者其他原因这个消息的处理发生错误,这个时候我们就希望进行消息的回滚,使得消息进行重新处理,那么我们就需要使用jms事务。
开发一个jms驱动的应用,这是被用来作为与其他几个系统的结合点,上面的例子是与银行系统进行交互。我们定义一个标准的异常处理过程 ,假如整个系统是消息驱动的,在我们的应用的最顶端是我们的messagelistener ,这在今天看起来有点像这样:
public void onmessage(message m) {
try {
process(m);
} catch (throwable t) {
log(t);
}
}
假如我们的异常处理策略就是这一种,现在这只是一种情况,我们必须知道,有时候这样的异常并不是自身系统的异常,而是我们需要集成的那些系统,有可能是他们的服务器暂时关闭,因此,在出现这样的错误时,我们希望重新处理此消息,要想重新处理,就要是使用jms的事务处理了。如果是编码进行管理,那么我们需要暴露出session。
public ourmessagelistener(topicsession topicsession) {
this.topicsession = topicsession;
}
public void onmessage(message m) {
try {
process(m);
//如果成功了,就调用commit,清除消息缓存
topicsession.commit();
} catch (throwable t) {
log(t);
}
}
如果添加了回滚方法
public void onmessage(message m) {
try {
process(m);
topicsession.commit();
} catch (throwable t) {
log(t);
topicsession.rollback();//如果想让他回滚,就从session缓存中取得刚发送的消息,继续发送
}
}
下一个场景,有些异常需要回滚,有些则不需要:
public void onmessage(message m) {
try {
object command = new messagehandler(m);
process(command);
topicsession.commit();
} catch (messageinvalidexception e) {
log(t);
//我们不希望处理这个异常
topicsession.commit();
} catch (throwable t) {
log(t);
topicsession.rollback();
}
}
分享到:
相关推荐
功能说明: 环境说明: 开发软件:VS 2017 (版本2017以上即可,不能低于2017) 数据库:SqlServer2008r2(数据库版本无限制,都可以导入) 开发模式:mvc。。。
labview程序代码参考学习使用,希望对你有所帮助。
大米外贸商城系统 简称damishop 完全开源版,只需做一种语言一键开启全球133中语言自动翻译功能,价格实现自动汇率转换,集成微信支付宝 paypal以及国外主流支付方式,自带文章博客系统。 软件架构 基于MVC+语言包模式,增加控制台,API导入产品方便对接其他系统(带json示例数据)。 使用要求 PHP7.4+ MYSQL5.6+ REDIS(可选) 安装方法 composer install 打开安装向导安装 http://您的域名/install 特色 1、缓存层增加时间与批量like删除 2、API产品导入方便对接其他系统 3、增加控制台命令行,命令行生成语言翻译包 4、后台一键开启自动翻译模式,支持全球133中语言,由于google代理翻译需要收费,这个功能需要付费。 5、可选购物车与ajax修改购物车产品 6、一键结算checkout 7、增加网站前台自定义路由 方便seo 更新日志 v3.9.7 集成鱼码支付接口,方便个人站长即使收款到账使用 v3.9.3 更新内容 1:增加ueditor与旧编辑器切换 2:增加可视化布局插
labview程序代码参考学习使用,希望对你有所帮助。
labview程序代码参考学习使用,希望对你有所帮助。
毕设和企业适用springboot人工智能客服系统类及旅游规划平台源码+论文+视频