`
losphantom
  • 浏览: 2275 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

tomcat中使用websphere mq

    博客分类:
  • jms
阅读更多
第一次使用websphere mq,每次要使用IBM的破玩意就觉得蛋疼,可是这H公司的操蛋规定就是只能用商业的MQ,不允许使用ActiveMQ或RabbitMQ。。于是只好硬着头皮研究如何使用,经过一番折腾总算整了出来,中间遇到的几个问题记录一下。

  第一部分:
  当然还是要把wmq安装好,因为生产环境是Linux环境,所以也只好在Linux环境中安装。装完就一堆命令工具,额~~~

  找了些资料应该先建一个Queue Manager
  命令crtmqm -q  QM1(QM1是Queue Manager的名称)
  然后启动这个Queue Manager
  strmqm QM1
  最后还得启动队列的监听器,有点像启动Oracle的感觉
  runmqlsr –t tcp –p 1414 –m QM1 & (注意这个&最好加上,要不然ctrl+C都退不出来。。。)
 
  接下来要在wmq的交互命令行中创建具体的队列,囧~之前用ActiveMQ都是程序自己创建的
  runmqsc QM1(如果当前只启动了QM1,后面这个参数是可选的)
  然后使用创建队列的命令
  define qlocal(Q1) 注意网上说只能建本地Queue,没说为什么,这里照办的。。(Q1是队列名)
  接下来以为完了,结果还没完,这破玩意除了需要自己建具体的队列,还需要建channel,这是神马?我现在也还不清楚,不过这破东西很重要,第一次整完全部东西开始连接队列的时候总是报错就是因为这东西建错了,囧。。
  刚开始直接找了个创建命令:DEFINE CHANNEL (C1) CHLTYPE(RCVR),结果马上出个莫名其妙的错。

  com.ibm.mqservices.MQInternalException:   MQJE001:发生   MQException:完成码   2,原因码   2009
MQJE016:连接期间,MQ   队列管理器立即关闭通道
关闭原因   =   2009


  上网找了很多都都没找到真正的原因,多数说的是神马最大连接数配置不够导致,我勒个去,就我一个人连能不够。后来是看了一下,CHLTYPE,就是channel的type,其实有好几种,我需要的原来不是RCVR。。这种情况应该建成SVRCONN(叫服务器连接通道- -),后面终于能正常连上了。
  说了这么多,总结一句,就是要执行命令:DEFINE CHANNEL(C1) CHLTYPE (SVRCONN)  REPLACE
 
  到此为止wmq的折腾就算完成了,接下来是Tomcat。
 
  第二部分:
  tomcat其实还好,网上有很多正确的配置
  首先是需要JMS,JMX和JTA的api包以及wmq的相关包:
  geronimo-j2ee-management_1.0_spec-1.1.1.jar
  geronimo-jms_1.1_spec-1.1.1.jar
  geronimo-jta_1.1_spec-1.1.1.jar
  com.ibm.mq.jar ( /opt/mqm/java/lib/ )
  com.ibm.mqjms.jar ( /opt/mqm/java/lib/ )
  connector.jar ( /opt/mqm/java/lib/ )
  dhbcore.jar ( /opt/mqm/java/lib/ )

  接下来是修改context.xml文件,在里面添加
 
<!--连接工厂定义-->
<Resource name="jms/queueConnectionFactory" auth="Container"
					type="com.ibm.mq.jms.MQQueueConnectionFactory"
					factory="com.ibm.mq.jms.MQQueueConnectionFactoryFactory"
					HOST="<wmq host ip>"
					PORT="1414"
					CHAN="C1"
					TRAN="1"
					QMGR="QM1"
/>

<!--队列定义-->
<Resource name="jms/mailQueue" auth="Container"
					type="com.ibm.mq.jms.MQQueue"
					factory="com.ibm.mq.jms.MQQueueFactory"
					description="JMS Queue for sending messages to app"
					QU="Q1"
/>


  在Resource元素中,属性说明:
  name : JNDI的名称,这自己去,在自己的程序中需要根据这个名词在jndi中查找
  HOST: wmq主机名
  PORT: 队列管理器的端口号,上面启动监听器的-port参数指定的
  CHAN:服务器通道名,上面创建channel的名称
  QMGR:队列管理器名,上面创建Queue Manager指定的名称
  QU: 队列名,上面创建的队列名称

  第三部分:
  最后还要说明一下在程序中需要注意的问题,主要是和我一样,使用spring 的jndi以及jmd来管理队列连接工厂和队列时,因为connectionFactory对象是一个jndi对象,如果需要认证授权,用一下方式抱起来:
 
<bean id="jmsQueueConnectionFactory"
	class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter">
   <property name="targetConnectionFactory"
		ref="internalJMSQueueConnectionFactory" />
   <property name="username" value="mqm" />
   <property name="password" value="" />
 </bean>

  其中internalJMSQueueConnectionFactory是jndi对象,相关配置忽略。

  如果使用了一下方式管理队列:
 
<bean id="mailQueue"
   class="org.springframework.jndi.JndiObjectFactoryBean">
   <property name="jndiName">
     <value>java:comp/env/jms/mailQueue</value>
   </property>
 </bean>

  千万不要多此一举的配置代理jms的标准接口,这样做会导致出现MQJMS2003错,说什么目标不可理解或不再可用云云。关于这种错误太难理解了,网上找到一个外国的老兄给出正解,IBM代码使用了
 
instanceof MQQueue

  来判断队列的实例,用的不是JMS的标准API,导致出错,IBM这二货,无语O__O"…
  还有一种情况也会导致这个错,就是如果你在你的程序中放了上面提到要放到tomcat中的那几个包。这时候报错的原因是tomcat自身的classloader和web程序的classloader不是同一个导致,这一点比较隐蔽。把程序中的jar包去掉就OK了。
 
  到此为止应该基本OK了。。
分享到:
评论

相关推荐

    IBM MQ工程

    Tomcat Server 中运行IBM Websphere MQ 项目,读取消息队列。 通过Maven管理jar包。

    非对称环境下Message Broker集群负载均衡

    在本文中,作者详细介绍了如何在非对称硬件环境下,利用WebSphere MQ V6的特性实现Message Broker集群的负载均衡。首先,Message Broker可以通过增加流程实例和执行组进行纵向扩展,以提升处理能力。然而,为了实现...

    spring jms tomcat 异步消息传递入门实例

    2. **Tomcat与JMS**:虽然Tomcat本身并不直接支持JMS,但可以在Tomcat中部署一个支持JMS的容器,如Apache ActiveMQ或IBM WebSphere MQ。这些服务器将作为消息代理,接收和分发消息。在Tomcat中配置JMS,需要在`...

    jdbc驱动包.rar

    因此,将JDBC驱动包解压并放入此目录,确保了Tomcat服务器上的所有应用程序都能够使用其中的驱动来连接到MySQL、JMS服务或MQ。 综上所述,这个"jdbc驱动包.rar"包含的可能内容有: - MySQL的JDBC驱动JAR,如`mysql-...

    jboss administration guide

    在配置方面,指南提供了关于如何在JBoss ESB中配置JMS提供者的详细指导,包括JBoss Messaging的配置、JBoss Messaging的集群配置、ActiveMQ的使用,以及IBM WebSphere MQ系列和Oracle AQ等第三方消息服务的集成。...

    Spring Boot + RWD + JMS/MQ

    对于MQ,如IBM WebSphere MQ或RabbitMQ,Spring Boot也有相应的适配器来简化整合。 将这三个技术结合在一起,我们可以构建一个高效、响应式的Web应用,同时利用消息队列处理后台任务。例如,Spring Boot可以作为...

    websphere_weblogic

    作者从架构、性能、易用性、扩展性和成本等多个角度进行了详细的比较,旨在帮助读者理解这两个在企业级Java应用程序部署中广泛使用的平台。 【知识点】: 1. **WebSphere**:IBM的WebSphere是业界领先的企业级应用...

    tomcat2WAS9.rar

    spring4.3.x、CXF3.2.x框架部署到Websphere9,在TOMCAT8.5跑没问题,到WAS9上各种冲突,框架用的jar和工具都很新,网上资料很少, 最后干脆自己不停尝试,用了2天时间终于把冲突的jar包理顺了。方法就是各种排列组合...

    jms-and-tomcat:我的博客条目http的源代码-tomcat source code

    深入研究这些代码,开发者可以学习到如何在实际应用中使用JMS来实现解耦、异步处理、负载均衡和容错等高级特性。同时,了解如何在Tomcat这样的轻量级服务器上集成这些服务,对于理解和优化Java Web应用的架构和性能...

    TechAdmin:Linux,MQ,AIX

    IBM MQ,原名WebSphere MQ,是一种消息中间件,用于在不同应用程序之间安全、可靠地传输数据。它支持多种操作系统和编程语言,提供事务处理、消息确认、队列管理等功能。在分布式系统中,MQ起到了桥梁作用,允许异步...

    H3C iMC APM BSM管理组件操作演示.rar

    目录: APM应用监控演示视频-AIX操作系统 APM应用监控演示视频-IIS服务器 APM应用监控演示视频-Linux服务器 ...APM应用监控演示视频-WebSphere MQ服务器 BSM视频案例之业务监控 BSM视频案例之容量预测

    架构规范 SSH 框架

    此外,服务层包括 Tomcat、Apache、Websphere 和 IBM MQ,这些都需符合规范以保证系统的稳定运行。 在模块规范上,SSH 框架划分了通用基础模块和业务基础模块。通用基础模块主要处理非业务相关的功能,如日志管理、...

    高级软件工程师.docx

    - **技术栈**:使用UNIX、WebSphere(MQ+Workflow)等。 - **成果**:提升了贷款审批的效率和准确性。 ### 三、技术栈与工具 1. **操作系统**:Windows20003、Linux/Unix等。 2. **服务器环境**:PC Server、小型...

    Spring JMS 消息处理-基于JNDI

    消息中间件如ActiveMQ、RabbitMQ、IBM WebSphere MQ等,通过JMS接口与应用程序交互。 Spring JMS是Spring框架对JMS的封装,它提供了一种声明式的方式来配置JMS模板、监听容器等,极大地简化了开发者的任务。Spring ...

    中间件技术在Web系统中的应用.pdf

    2. **数据库中间件**:例如Oracle Tuxedo或IBM WebSphere MQ,它们用于处理数据库访问,提高数据操作的效率和一致性。 3. **事务处理中间件**:如IBM CICS,确保在分布式环境中的事务处理完整性和一致性。 4. **...

    中间件技术0506

    1. 消息中间件:如Apache ActiveMQ或IBM WebSphere MQ,它们通过消息队列进行异步通信,允许系统间的解耦合。 2. 应用服务器:如Java的Tomcat或JBoss,它们为运行企业级Java应用程序提供了一个平台。 3. 数据库...

    哈工大软件学院中间件教程ppt

    消息中间件,如Apache ActiveMQ或IBM WebSphere MQ,是用于异步通信的重要工具,能够实现应用之间的解耦,提高系统的可扩展性和可靠性。交易中间件,例如Tuxedo或WebLogic Transaction Server,主要用于处理事务处理...

    消息队列资料

    Apache ActiveMQ是一款开源的MQ实现,遵循Apache许可证,用户可以在项目中免费使用。与Tomcat类似,ActiveMQ提供了灵活的部署选项,可以在各种操作系统上运行,并且支持多种协议,如开放消息传递协议(OpenWire)、...

Global site tag (gtag.js) - Google Analytics