最近公司有个需求,需要接收其他部门发送的MQ请求,发送MQ的部门是基于pub/sub方式发布的。我负责我们部门的订阅MQ的开发。
环境:websphere6.1
实现:a) 采用Message Driver Bean
在WAS上部署一个EJB应用,将业务逻辑在MDB的onMessage () 方法中实现。
b) 采用JMS程序
自己开发轮询程序,获得消息内容,并将其用于业务逻辑中。
开发细节:
1.在websphere上配置消息中间件:
a.新建主题工厂
主机、端口配置成发布消息的地址,传输类型选择client,通道,队列管理器填写。代理版本选择基本,客户机标识填写接收消息的标识
b.新建主题
基本主题名填写a中的客户机标识,目标客户选择jms
c.配置监听端口
服务器---应用服务器----server1----通信----消息侦听器服务----侦听器端口---新建侦听端口侦听主题工厂、主题。
2.两种实现订阅消息
a .jsm轮询查询:
public static void main(String[] args) { JMSPubSub.send(args);
}
public static String send(String[] args){
String result = null;
System.out.println(args[0]);
System.out.println(args[1]);
System.out.println(args[2]);
System.out.println(args[3]);
System.out.println(args[4]);
if (args.length < 4) {
usage();
System.out.println("out");
return result;
}
String subName = null;
String url = args[0];
boolean isPublisher = true;
if (args[3].equalsIgnoreCase("P")) {
isPublisher = true;;
} else if (args[3].equalsIgnoreCase("S")) {
isPublisher = false;
if (args.length > 4) subName = args[4];
} else {
usage();
return result;
}
javax.naming.InitialContext initContext;
initContext = initContext(url);
System.out.println("initContext:" + initContext);
if (initContext == null) return result;
if (true) {
TopicConnection topicConnection = initTopicConnection(initContext, args[1]);
if (topicConnection == null) return result;
try {
topicConnection.start();
System.out.println("topicConnection start......");
} catch (JMSException e1) {
System.out.println("topicConnection start is error......");
e1.printStackTrace();
return result;
}
TopicSession session;
try {
session = topicConnection.createTopicSession(false,
Session.AUTO_ACKNOWLEDGE);
System.out.println("topicConnectionSession start......");
} catch (JMSException e1) {
System.out.println("topicConnectionSession start is error......");
e1.printStackTrace();
return result;
}
Topic topic = getTopic(initContext, args[2]);
if (session == null) return result;
if (isPublisher) {
try {
TopicPublisher publisher = session.createPublisher(topic);
System.out.println("TopicPublisher start......");
TextMessage message = session.createTextMessage();
String text = getFromIn();
message.setText(text);
System.out.println("publisher start......");
publisher.publish(message);
System.out.println("publisher end......");
} catch (JMSException e) {
System.out.println("publisher is error ......");
e.printStackTrace();
}
} else {
try {
System.out.println("in sub ......");
TopicSubscriber subscriber;
if (subName != null && !subName.equals("")) {
subscriber = session.createDurableSubscriber(topic, subName);
} else {
subscriber = session.createSubscriber(topic);
}
System.out.println("createDurableSubscriber over ......");
// MessageListener listener = new JMSPubSub.MyMessageListener();
Message arg0 = subscriber.receive();
if (arg0 instanceof TextMessage) {
try {
result = ((TextMessage) arg0).getText();
System.out.println("message: [" +result + "]");
} catch (JMSException e) {
System.out.println("get message is error" + e);
e.printStackTrace();
}
} else {
System.out.println("Message Type is error.");
}
} catch (JMSException e) {
System.out.println("createDurableSubscriber is error ......");
e.printStackTrace();
}
}
if (session != null) {
try {
session.close();
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (topicConnection != null) {
try {
topicConnection.close();
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return result;
}
传入参数:iiop://10.1.12.11:2810 notification/IdentificationChangedTopicFactory notification/IdentificationChangedTopic S identificationChanged
其中出现错误:1.远程调用ejb查找jndi失败问题。2.websphere dumpNameSpace 查找jndi要求输入服务器登录用户名密码。3.调用接收程序之后,重复调用发订阅信息被锁的问题。
b. 采用Message Driver Bean,由websphere自己订阅接收到的信息。需要在websphere上部署一个ejb-mdb。ejb2.1写法如下:
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar id="ejb-jar_ID" version="2.1" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd">
<display-name>
identychangeEJB</display-name>
<enterprise-beans>
<message-driven id="SubscriberDMDB">
<display-name>
SubscriberMDB_IdentyChange</display-name>
<ejb-name>SubscriberMDB_IdentyChange</ejb-name>
<ejb-class>com.taikang.identychange.ejb.IdentificationChangedMDB</ejb-class>
<messaging-type>javax.jms.MessageListener</messaging-type>
<transaction-type>Bean</transaction-type>
<message-destination-type>javax.jms.Topic</message-destination-type>
<activation-config>
<activation-config-property>
<activation-config-property-name>acknowledgeMode</activation-config-property-name>
<activation-config-property-value>Auto-acknowledge</activation-config-property-value>
</activation-config-property>
<activation-config-property>
<activation-config-property-name>destinationType</activation-config-property-name>
<activation-config-property-value>javax.jms.Topic</activation-config-property-value>
</activation-config-property>
<activation-config-property>
<activation-config-property-name>subscriptionDurability</activation-config-property-name>
<activation-config-property-value>Durable</activation-config-property-value>
</activation-config-property>
</activation-config>
<env-entry>
<env-entry-name>jndi-datasource-name</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<env-entry-value>jdbc/InsureDB</env-entry-value>
</env-entry>
<resource-ref id="ResourceRef_1254203818020">
<description>Database reference for insure application</description>
<res-ref-name>jdbc/InsureDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</message-driven>
</enterprise-beans>
</ejb-jar>
遇到问题:1.ejb部署问题。2.ejb引用其他jar包问题。3.ejb使用jndi的问题。
4.最奇怪的:transaction问题:发生试探非法用现有两阶可用资源落实一阶可用资源。
通过<transaction-type>Bean</transaction-type>来解决的。(之前是<transaction-type>Container</transaction-type>)
最后测试通过!!!!!!!!希望对他人有用,传上订阅的ear包。
分享到:
相关推荐
【MyEclipse 配置 Websphere6.1】配置过程详解 MyEclipse是一款集成开发环境,常用于Java EE应用的开发。而Websphere6.1是IBM的一款企业级应用服务器,常用于部署和运行Java EE应用程序。在MyEclipse中配置...
7. **配置文档**:`WebSphere+v6.1配置文档.rar`和`websphere安装后配置说明.rar`提供了详细的配置指导,可能包括自定义服务器配置、扩展功能如JMS、EJB、SSL/TLS、JDBC驱动、WS-Security等的配置。 通过这些资料,...
websphere 6.1安装配置指南websphere 6.1安装配置指南websphere 6.1安装配置指南websphere 6.1安装配置指南websphere 6.1安装配置指南websphere 6.1安装配置指南
WebSphere 6.1 SSL 配置 WebSphere 6.1 SSL 配置是 IBM WebSphere Application Server 6.1 中的一项安全功能,旨在提供安全的数据传输和身份验证。该配置文件详细介绍了如何在 WebSphere 6.1 中配置 SSL 加密连接,...
【Websphere6.1 安装配置说明】 在IT领域,WebSphere是IBM提供的一款企业级应用服务器,常用于构建、部署和管理Java应用程序。本文将详细介绍如何安装和配置WebSphere 6.1,包括设置DataSource、JDBC连接、JNDI命名...
总之,“WebSphere6.1 for Oracle数据源配置”涉及了WebSphere与Oracle数据库的集成,包括JDBC驱动的管理、数据源的创建和配置、以及应用与数据源的绑定。正确配置数据源能够保证应用程序高效、可靠地访问数据库,...
本文将详细介绍在 Linux 平台上安装 WebSphere 6.1 的步骤,以及相关的配置和设置。 安装准备 在安装 WebSphere 6.1 之前,需要准备好操作系统和环境。首先,需要检查操作系统的版本和配置,确保其满足 WebSphere ...
### MyEclipse 6.0 下 Websphere 6.1 的配置详解 #### 一、概述 在软件开发过程中,集成开发环境的选择至关重要。MyEclipse 作为一款功能强大的 Java 开发工具,深受广大开发者的喜爱。而 WebSphere Application ...
### WebSphere 6.1 安装与配置详解 #### 一、WebSphere Application Server 的安装与配置 ##### (一)安装 WebSphere Application Server **1. Windows 下安装 WebSphere** WebSphere Application Server (WAS)...
发布过程中,对于消息驱动的bean,需要在WebSphere管理控制台中指定“消息驱动的bean监听器绑定”,即指定之前创建的激活规范,而不是像WebSphere 6.0之前的版本那样设置“监听器端口”。 这些配置步骤确保了...
- 安装:执行安装程序,按照向导完成安装,选择安装目录,例如Unix/Linux的`/usr/IBM/WebSphere/AppServer`。 3. **安装过程中选择与配置** - 可选择是否安装示例应用程序。 - 选择安装类型,如Network ...
【Websphere6.1程序部署】是关于IBM Websphere Application Server 6.1版本的详细操作指南,包括了安装、配置以及程序包的发布等多个环节。在部署过程中,理解并掌握这些步骤至关重要,因为它们是确保应用程序在...
相比于tomcat的项目部署,websphere中项目的部署还是还是很不一样的,本文档中图文并茂地讲述了,在Myeclipse中如何配置websphere以及如何部署web程序 另外,还详细讲解了如何在websphere中配置数据库连接池
通常建议使用默认路径`/opt/IBM/WebSphere/AppServer`。 ###### 2.3.7 选择安装环境 - **环境**:选择是开发环境还是生产环境。 - **影响**:不同环境的选择会影响安装的组件和配置。 ###### 2.3.8 设置管理...
WebSphere管理控制台是一个基于Web的工具,用于配置、管理和监控WebSphere Application Server。通过管理控制台,管理员可以进行各种操作,如创建、编辑服务器配置,部署应用程序,以及监控性能指标。 **第二个节点...
### WebSphere 6.1 配置指南:发布 Web 应用及数据库连接池设置 #### 一、概述 在本篇文章中,我们将详细介绍如何在 IBM WebSphere Application Server 6.1 版本中配置并发布一个 Web 应用程序,并特别关注于...
【安装配置Websphere 6.1】是一个关键任务,对于任何希望管理和部署基于IBM Websphere的应用程序的IT专业人员来说,都是必备技能。Websphere是IBM提供的一款强大的企业级应用程序服务器,用于托管Java EE(Java ...