20230609 记一次接入MQ踩得坑

项目:财务系统

框架:pafa 底层属于 SSM 单体架构 weblogic容器 2009年投产的项目

背景:数电项目,VMS将发票状态同步调整为异步MQ同步,接入集团FMQ 底层rocketMQ,作为消费者同步发票状态

本地开发,平台接入时demo只给了main方法启动,

遇到问题1 触发mq消费方式

解决问题1 方案 参考原来项目逻辑,采用定时消费触发,直接写在原接口中

经过咨询mq人员得出结论,需在项目启动时触发启动mq,mq本身有监听会自动消费

百度到项目启动可以使用监听器,servlet监听会在web服务器启动后自动调用初始化方法,此时调用mq启动方法,实现ServletContextListener接口,本地测试通过,无问题。示例代码如下:

Public class ListenerTest implements ServletContextListener{

Public void contextInitialized(ServletContextEvent servletContextEvent){

//获取配置文件 调用mq启动方法

Subscribe(customer,filter, topic);

customer.Start();

}

Public void contextDestroyed(ServletContextEvent servletContextEvent){

//停止 mq方法

    Customer.shutDown();

}

}

配置文件web.xml

<listener>

   <listener-class>com.test.ListenerTest</listener-class>

</listener>

部署测试环境

遇到问题2 测试环境调不通,报错提示jms配置找不到

原因 测试告知他们开的墙是APP到mq的,但我知道我的监听日志是打印在WEB层的,所以觉得是他们开墙错误,又重新开了WEB端的墙,但是还是会报同样的错误

测试环境服务器有4台 APP两台 WEB两台,jms属于weblogic上配置的数据源信息,数据源在测试服务器上只在APP服务器上配置,WEB服务器不做配置。了解到这个情况结合架构变更及专业人员提供的消费者开墙流程和其他系统的监听情况得出结论,应该将启动MQ的程序放在APP层,也就是后端进行处理。

搜索各种资源学习怎么在后端触发MQ启动,且需要在spring容器加载完成后启动,这样可以直接在mq处理中获取到上下文,直接将数据处理掉,没有复杂逻辑无需异步处理。但是由于样例中是直接在xml中将参数配置好调用的,而我的mq是将一些参数作为方法入参传入的,所以不能用这种方法。当时没有想到可以新增方法调用处理,然后又做了很多尝试,

尝试多种方案,使用监听器都会在WEB端触发,最终在后端采用普通BEAN的方式配置,bean配置有默认初始化方法和销毁方法可以配置,将servlet监听的初始化方法和销毁方法名称调整后配置在bean中即可。

配置到项目中已存在的xml中用bean的方式启动,可以成功启动

遇到问题3 项目启动会将mq启动3次,然后后面两次启动就会报错

原因是因为mq已经启动,发现项目中加载配置文件会加载3次,搜索配置文件,发现加载配置文件的一个xml中,不同的session都加载了一次xml,如果删除加载资源启动就会报错,于是将mq bean的配置新增xml单独配置一次,且在代码中判断为空才启动,问题解决

Public class ListenerTest {

Public void initMq(){

//获取配置文件 调用mq启动方法

Subscribe(customer,filter, topic);

customer.Start();

}

Public void detroyedMq(){

//停止 mq方法

    Customer.shutDown();

}

}

配置文件biz-context.xml

<bean class=”” init-method = “initMq” destroy-method = “detroyedMq”>

   <property id = “service” class=””/>

</bean>

如果topic不是作为入参,而是和cid一样作为属性获取

就可以按如下配置,无需initMq方法了

<bean class=”” init-method = “subscribe” destroy-method = “detroyedMq”>

<property name=”cid” value=””/>

<property name=”address” value=””/>

<property name=”virtualAccount” value=””/>

<property name=”topic” value=””/>

   <property name = “service” class=””/>

</bean

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值