GlassFish使用集成的MQ的相当简单,没有什么要配置的。但是要使用其他MQ产品,则需颇费一番功夫。下面详细介绍下GlasshFish中配置SonicMQ的过程。
软件信息: GlassFish3.1.1, SonicMQ 6.1.
ü 安装 Genericra
下载地址: http://genericjmsra.java.net/ (据说可以用UpdateTool 下载并安装,我用Update Tool找不到这个东西)
我下载了个最新的版本2.1,随笔放那里,假说C盘根目录吧。则按装方法为,
a. 运行cmd开命令行,并进入C盘根目录 (你的genericra.rar放的地方);
b. 运行asadmin (前提是你已经把 $glassFish/bin加入了Path中);
c. 然后敲入 deploy genericra.rar即可。
ü 建立Resource Adapter
我使用的命令行 (asadmin中),执行
create-resource-adapter-config --user admin --property SupportsXA=true:ProviderIntegrationMode=javabean:ConnectionFactoryClassName=com.sun.messaging.ConnectionFactory:\CommonSetterMethodName=setProperty:UserName=guest:Password=guest:\QueueConnectionFactoryClassName=com.sun.messaging.QueueConnectionFactory:\TopicConnectionFactoryClassName=com.sun.messaging.TopicConnectionFactory:\QueueClassName=com.sun.messaging.Queue:TopicClassName=com.sun.messaging.Topic:\LogLevel=info:UserName=guest:Password=guest:XAQueueConnectionFactoryClassName=com.sun.messaging.XAQueueConnectionFactory:\XATopicConnectionFactoryClassName=com.sun.messaging.XATopicConnectionFactory:\XAConnectionFactoryClassName=com.sun.messaging.XAConnectionFactory genericra
ü 建立连接池及连接工厂
create-connector-connection-pool --raname genericra --connectiondefinition javax.jms.QueueConnectionFactory qcpool
asadmin create-connector-resource --poolname qcpool jms/QCFactory
ü 创建Destination
asadmin create-admin-object --raname genericra --restype javax.jms.Queue --property DestinationProperties=Name\\=clientQueue jms/clientQueue
至此,配置已经差不多了了。 (其实这些官方网站都写的很清楚),到Admin控制台,大概就是这样,
接下来,我就直接在Admin Console中操作了,
一, 为qcpool指定MQ server的 Jndi信息,就是你的sonicMQ server的连接信息。其中
JndiProperties = java.naming.factory.initial=com.sonicsw.jndi.mfcontext.MFContextFactory,java.naming.provider.url=tcp://192.168.0.125:2506,com.sonicsw.jndi.mfcontext.domain=Domain1,java.naming.security.principal=Administrator,java.naming.security.credentials=Administrator
二,把Sonic MQ相关的包放到$glassFish/lib中去,
至此你已经可以往SonicMQ发消息了,比较让人振奋了。代码如下,
package com.apress.ejb3.chapter02;
import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.*;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
/**
* Session Bean implementation class MessageSender
*/
@Stateless(name="MessageSender", mappedName="ejb/MessageSender")
public class MessageSender implements MessageSenderRemote, MessageSenderLocal {
@Resource(mappedName = "jms/QCFactory")
private QueueConnectionFactory newGradeConnectionFactory;
@Resource(mappedName = "jms/clientQueue")
private Queue queue;
/**
* Default constructor.
*/
public MessageSender() {
}
public String sendMessage(String txtmsg){
System.out.println("Start to sendMessage.");
QueueConnection connect = null;
try {
// create a session for use in this thread/transaction
connect = newGradeConnectionFactory.createQueueConnection();
QueueSession session = connect.createQueueSession(true, 10);
// // create a new message
//
QueueSender sender = session.createSender(queue);
Message msg = session.createTextMessage(txtmsg);
// return newGradeQueue.get?QueueName();
sender.send(msg);
// session.commit();
} catch (Throwable je) {
je.printStackTrace();
// throw a more friendly exception
} finally {
if (connect != null) {
try {
connect.close();
} catch (Exception e) {
}
}
}
return "successfully";
}
}
但用MDB收消息是否也可以了呢?结果是不行的。并且MDB不能这用Annotation,必须要使用xml去配置。配置文件如下,
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sun-ejb-jar
PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 8.1 EJB 2.1//EN"
"http://www.sun.com/software/appserver/dtds/sun-ejb-jar_2_1-1.dtd">
<sun-ejb-jar>
<enterprise-beans>
<ejb>
<ejb-name>DemoDataRequestProcessor</ejb-name>
<mdb-resource-adapter>
<resource-adapter-mid>genericra</resource-adapter-mid>
<activation-config>
<activation-config-property>
<activation-config-property-name>ConnectionFactoryJndiName
</activation-config-property-name>
<activation-config-property-value>jms/QCFactory
</activation-config-property-value>
</activation-config-property>
<activation-config-property>
<activation-config-property-name>DestinationJndiName
</activation-config-property-name>
<activation-config-property-value>jms/clientQueue
</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.Queue
</activation-config-property-value>
</activation-config-property>
</activation-config>
</mdb-resource-adapter>
</ejb>
</enterprise-beans>
</sun-ejb-jar>
你的MDB理论上可以工作了,测试代码如下,
package sonicMQ.testing;
import javax.ejb.MessageDriven;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
/**
* Message-Driven Bean implementation class for: DemoDataRequestProcessor
*
*/
@MessageDriven(name="DemoDataRequestProcessor",mappedName="jms/clientQueue")
@TransactionManagement(value= TransactionManagementType.BEAN)
public class DemoDataRequestProcessor implements MessageListener {
/**
* Default constructor.
*/
public DemoDataRequestProcessor() {
// TODO Auto-generated constructor stub
}
/**
* @see MessageListener#onMessage(Message)
*/
public void onMessage(Message message) {
try {
if (message instanceof TextMessage) {
TextMessage orderMessage = (TextMessage) message;
System.out.println("DemoDataRequestProcessor recieved = " + orderMessage.getText());
} else {
System.out.println("Invalid message ");
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
但是我这边,总是抛异常,如下
java.lang.ClassCastException: com.sun.genericra.outbound.SessionAdapter cannot be cast to progress.message.jimpl.Session
at progress.message.jimpl.aspi.wd.handleMessage(Unknown Source)
at progress.message.zclient.MessageHandler.doNextWorkItem(Unknown Source)
at progress.message.zclient.lx.threadMain(Unknown Source)
at progress.message.zclient.DebugThread.run(Unknown Source)
无赖之下,我不得不研究了下genericra的相关代码,最终改了两个类,改的比较下;
InboundJmsResource的set方法,改动后如下,
SessionAdapter加了个getPhysicalSession方法,如下
两个java文件也加加附件中了。
至此,MDB终于也可以工作了。虽然其中走了很多弯路,没一个小小的细节搞明白都包含了N次失败的尝试,最终终于完成了,当然其间也了解很多其它与此不相关的东西。
----------------------------------------------------------------------
张瑜,Mybeautiful, zhangyu0182@sina.com.
- 大小: 84.7 KB
- 大小: 56.5 KB
- 大小: 8 KB
分享到:
相关推荐
GlassFish 安装配置文档 GlassFish 是一个基于 Java 的开源应用服务器,提供了一个强大且灵活的平台来部署和管理基于 Java 的应用程序。本文档将指导 readers 通过安装和配置 GlassFish 服务器,并将其与 Eclipse ...
本教程将详细讲解如何在Glassfish服务器上配置JNDI以连接到DB2数据库。 首先,我们需要准备DB2数据库的驱动文件。在进行任何配置之前,确保你已经有了DB2的JDBC驱动,即db2jcc.jar和db2jcc_license_cu.jar。这两个...
glassfish手工修改domain部署应用步骤,文档详细介绍了如何使用手工部署一个web文件夹目录形式的应用,以及手工配置jdbc
文件标题“GlassFish 管理配置”明确指出,本文档将聚焦于GlassFish服务器开源版本5.0的管理和配置。描述中提到的“配置和管理GlassFish服务器开源版本的说明”进一步强调了这一主题,并暗示了文档将详细介绍如何对...
"Eclipse 与 GlassFish 3.1.1 配置指南" 概述: 本文档旨在指导读者如何在 Eclipse 中配置 GlassFish 3.1.1,实现连接池配置和 JNDI 配置。同时,也会解决在部署过程中可能出现的异常。 一、GlassFish 3.1.1 简介 ...
GlassFish 数据源连接池配置 GlassFish 是一个开源的 Java EE 应用服务器,它提供了一个基于 Web 的管理接口,允许用户通过 Web 界面配置和管理服务器的各种设置。其中,配置数据源连接池是 GlassFish 的一个重要...
- **简化配置**:GlassFish提供了更为直观的配置方式,减少了开发者在设置过程中可能遇到的问题。 ##### 可靠性和可用性 - **高可用性**:GlassFish支持集群配置,这意味着可以在多台服务器上运行相同的应用程序...
### GlassFish、Ant与Eclipse配置指南:详细步骤与图解 #### 一、环境准备:设置基础环境变量 在开始GlassFish服务器的配置之前,首先确保已经正确设置了以下环境变量: - **JAVA_HOME**: 指向已安装的JDK目录。...
### GlassFish和Ant安装与配置 #### 一、概述 本文档主要介绍如何在Windows平台上安装和配置GlassFish服务器以及Ant构建工具,并在Eclipse IDE中进行相应的设置,以便能够顺利地开发、构建和部署Java Web应用程序...
配置GlassFish V3 - 将`josso-dist/gateway/apps/josso-gateway-web-1.8.0.war`部署到`glassfish/domains/domain1/autodeploy`目录下。 - 将`josso-dist/gateway/config/*.xml`文件复制到`glassfish/domains/domain...
【GlassFish 5.0 安装与配置详解】 GlassFish,由Oracle公司主导的开源项目,是一款功能强大的Web服务器和应用服务器,以其卓越的性能和丰富的特性在开发者社区中备受推崇。相比于Tomcat,GlassFish提供了更全面的...
在本文中,我们将深入探讨与Glassfish 3.1.2.2中JPA问题相关的主题,特别是关于EclipseLink的更新方法。JPA(Java Persistence API)是Java平台上的一个标准,用于处理对象关系映射(ORM),使得开发者能够方便地在...
标题《Glassfish集群搭建手册》指的是利用Oracle提供的Glassfish应用服务器软件进行集群配置的详细指南。此手册涵盖了在不同场景下通过图形化界面和命令行方式搭建集群的整个过程,并且描述了如何配置集群环境以支持...
在这个场景中,它被用来配置Apache作为反向代理服务器,将客户端请求转发到Glassfish集群中的不同节点。我们需要在httpd.conf中添加或修改以下内容: 1. 加载mod_jk模块: ```apache LoadModule jk_module ...
本文详细介绍了如何使用Glassfish部署Web应用的过程,包括开发工具的选择、Glassfish的安装与配置以及Web应用的具体部署方法。通过本文的学习,读者应该能够掌握如何有效地在Glassfish环境下部署和管理Web应用。
在本文中,我们将深入探讨如何安装Glassfish,以及如何利用Ant工具进行配置。首先,我们来看一下安装的基本步骤。 1. **下载安装文件**:Glassfish的安装文件可以从官方网站获取,例如,对于Windows系统,你可以...
此外,Glassfish 3.1.2.2还提供了强大的管理和监控工具,如GlassFish Server Administration Console,它允许开发者远程配置和管理服务器,查看应用状态,进行日志分析,甚至进行故障排查。同时,服务器支持集群和...
- GlassFish 2.0 的配置文件(如`domain.xml`)允许进行详细的服务器配置,包括数据源、安全设置、监听端口等,可以根据项目需求进行定制。 总之,GlassFish 2.0 是一个强大的Java EE应用服务器,适合于企业级开发...
本手册旨在弥补这一空缺,提供一份全面的、深入的Glassfish集群搭建指南,包括图形化界面配置和命令行批处理配置两种方式,以帮助开发者和运维人员更好地理解和操作Glassfish服务器。 ### 1. 图形化界面配置 #### ...