下面文章很长,至于我的最终解决方法是 在 独立客户端的项目上右键->库->添加JAR/Folder
加入 C:\Program Files\glassfish-3.1.2\glassfish\lib\gf-client.jar 文件
最近一直在关注JMS,起因是从Magento 的PHP系统向JMS发送消息。实验了ActiveMQ,GlassFish与ActiveMQ的集成。最后还是觉得直接用GlassFish自带的OpenMQ省事。GlassFish 3 开始集成了对Stomp的支持,使得PHP系统与Java的系统能够很好的结合了。
GlassFish升到3了,其JMS的使用有些变化,主要是使用的那些java库发生了变化。网上有很多很多人遇到问题,可是却很难很难找到答案。前段时间弄了一下PHP与JMS,也在GlassFish上写了消息接收和发送程序,本以为客户端程序又是java,应该是小儿科,结果昨天测试的时候才发现问题多多。
首先、对于GlassFish 3.1.1 独立的java程序需要添加的包有两个,一个是GlassFish的客户端:/home/tlz/glassfish3/glassfish/lib/gf-client.jar
另外一个是 /home/tlz/glassfish3/mq/lib/jms.jar。就这两个就够了,网上那些包含了很多包的程序,可能是针对glassfish 2.1的。有个外国网友骂到glassfish v3 越来越难用。
另外一个难点是JNDI的使用,几乎所有的错误都是出在jndi的lookup。其原因有两个:一种是缺乏运行时的包,另外一种可能是自己装了多个glassfish,把gf-client.jar包弄错了。
1、Glassfish的配置
假定在glassfish上配置了JNDI连接工厂jms/smsCF和一个Topic 配置:topic/SMSTopic,对应的物理地址为:SMSTopic。
2、发送代码
需要添加到库里的jar文件是:
./glassfish3/glassfish/lib/gf-client.jar
./glassfish3/mq/lib/jms.jar
package jmsclient;
import java.util.Date;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class JmsClient {
public static void main(String[] args) {
ConnectionFactory connectionFactory = null;
Connection connection = null;
Session session = null;
// Queue queue = null;
Topic topic = null;
MessageProducer messageProducer = null;
MapMessage message = null;
TextMessage tm = null;
try {
Properties props = new Properties();
props.setProperty("org.omg.CORBA.ORBInitialHost", "172.24.9.116");
// optional. Defaults to 3700. Only needed if target orb port is not 3700.
props.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
InitialContext context = new InitialContext(props);
Object abcd = context.lookup("jms/smsCF");
connectionFactory = (ConnectionFactory) context.lookup("jms/smsCF");
topic = (Topic) context.lookup("topic/SMSTopic");
connection = connectionFactory.createConnection();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
messageProducer = session.createProducer(topic);
tm = session.createTextMessage();
tm.setText("Hello,this is standnone jms client" + new Date());
messageProducer.send(tm);
connection.close();
} catch (NamingException e) {
Logger.getLogger(JmsClient.class.getName()).log(Level.SEVERE, null, e);
} catch (JMSException e) {
Logger.getLogger(JmsClient.class.getName()).log(Level.SEVERE, null, e);
} finally {
System.out.println("ENDED.");
System.exit(0);
}
}
}
上面这段代码说明,用队列也是可以向Topic发送消息的。
2、独立的远程接收代码
通过使用MessageListener接口,可以实现类是容器的OnMessage事件触发,用户只要编写实现OnMessage部分即可。
package jmslistener;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicSession;
import javax.jms.TopicSubscriber;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import jms.scnjw.gov.cn.ScnjwMessageListener;
public class JmsListener {
public static void main(String[] args) {
String jndiConnetionFactory = "jms/smsCF";
String jndiDestName = "topic/SMSTopic";
TopicConnectionFactory connectionFactory = null;
TopicConnection connection = null;
TopicSession session = null;
// Queue queue = null;
Topic topic = null;
MessageProducer messageProducer = null;
MapMessage message = null;
TextMessage tm = null;
try {
Properties props = new Properties();
props.setProperty("org.omg.CORBA.ORBInitialHost", "172.24.9.116");
// optional. Defaults to 3700. Only needed if target orb port is not 3700.
props.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
InitialContext context = new InitialContext(props);
Object abcd = context.lookup("jms/smsCF");
connectionFactory = (TopicConnectionFactory) context.lookup(jndiConnetionFactory);
topic = (Topic) context.lookup(jndiDestName);
connection = connectionFactory.createTopicConnection();
session = (TopicSession) connection.createSession(
false, Session.AUTO_ACKNOWLEDGE);
TopicSubscriber topicSubscriber = session.createSubscriber(topic);
//设置Listener
topicSubscriber.setMessageListener(new ScnjwMessageListener());
connection.start();
//一直监听消息直到按Q键推出。
System.out.println("To end program, enter Q or q, "
+ "then <return>");
InputStreamReader inputStreamReader = new InputStreamReader(System.in);
char answer = '\0';
while (!((answer == 'q') || (answer == 'Q'))) {
try {
answer = (char) inputStreamReader.read();
} catch (IOException e) {
System.out.println("I/O exception: "
+ e.toString());
}
}
connection.close();
} catch (NamingException e) {
Logger.getLogger(JmsListener.class.getName()).log(Level.SEVERE, null, e);
} catch (JMSException e) {
Logger.getLogger(JmsListener.class.getName()).log(Level.SEVERE, null, e);
} finally {
System.out.println("ENDED.");
System.exit(0);
}
}
}
再建一个ScnjwMessageListener的类用于处理消息:
package jms.scnjw.gov.cn;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
public class ScnjwMessageListener implements MessageListener {
@Override
public void onMessage(Message msg) {
try {
System.out.print("receive msg from topic:");
if (msg instanceof TextMessage) {
System.out.println(((TextMessage) msg).getText());
}
} catch (JMSException ex) {
Logger.getLogger(ScnjwMessageListener.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
需要添加的库还是:
./glassfish3/glassfish/lib/gf-client.jar
./glassfish3/mq/lib/jms.jar
上述程序运行以后,就会一直不停的监听消息,一旦有消息到达就会自动调用Listener的onMessage方法。
这是运行结果:
run:
2011-8-31 10:42:11 com.sun.enterprise.v3.server.CommonClassLoaderServiceImpl findDerbyClient
信息: Cannot find javadb client jar file, derby jdbc driver will not be available by default.
2011-8-31 10:42:17 org.hibernate.validator.util.Version <clinit>
信息: Hibernate Validator 4.1.0.Final
2011-8-31 10:42:17 org.hibernate.validator.engine.resolver.DefaultTraversableResolver detectJPA
信息: Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver.
2011-8-31 10:42:17 com.sun.messaging.jms.ra.ResourceAdapter start
信息: MQJMSRA_RA1101: GlassFish MQ JMS Resource Adapter: 版本: 4.5.1 (Build 3-b) 编译: Tue Jun 21 16:31:32 PDT 2011
2011-8-31 10:42:17 com.sun.messaging.jms.ra.ResourceAdapter start
信息: MQJMSRA_RA1101: GlassFish MQ JMS Resource Adapter starting: broker is REMOTE, connection mode is TCP
2011-8-31 10:42:17 com.sun.messaging.jms.ra.ResourceAdapter start
信息: MQJMSRA_RA1101: GlassFish MQ JMS Resource Adapter Started:REMOTE
To end program, enter Q or q, then <return>
receive msg from topic:Hello,this is standnone jms clientWed Aug 31 10:42:36 CST 2011
receive msg from topic:Hello,this is standnone jms clientWed Aug 31 11:20:18 CST 2011
receive msg from topic:Hello,this is standnone jms clientWed Aug 31 11:22:06 CST 2011
3、如何独立运行上述程序
用Netbeans 7.0.1开发,在开发环境下只需要上面的两个包文件即可。可一旦要独立运行,可能需要glassfish的很多很多的包,只要缺少一个就会出现如下错误:
[tlz@localhost dist]$ java -jar JmsClient.jar
2011-8-31 11:29:50 jmsclient.JmsClient main
严重: null
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:325)
at javax.naming.InitialContext.lookup(InitialContext.java:392)
at jmsclient.JmsClient.main(JmsClient.java:62)
ENDED.
昨天在家里,我把glassfish的所有jar包和mq下的所有包拷贝到JmsClient.jar所在目录下lib下,上面的命令就可以正常运行了。如果有有心人,再把那个目录下的jar包一个一个的删除,应该可以弄出个最小集合来的吧。也有老外说,查看gf-client.jar包的MANIFEST.MF文件,那里列出了需要的jar包。这是那个文件,太多了:
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.6.5
Created-By: Apache Maven
Archiver-Version: Plexus Archiver
Built-By: java_re
Build-Jdk: 1.6.0_10
Package: org.glassfish.appclient.client.acc
Main-Class: org.glassfish.appclient.client.AppClientFacade
GlassFish-ServerExcluded: true
PreMain-Class: org.glassfish.appclient.client.acc.agent.AppClientConta
inerAgent
Class-Path: ../modules/jtype.jar ../modules/tools.jar ../modules/glass
fish-corba-asm.jar ../modules/glassfish-corba-codegen.jar ../modules/
glassfish-corba-csiv2-idl.jar ../modules/glassfish-corba-internal-api
.jar ../modules/glassfish-corba-newtimer.jar ../modules/glassfish-cor
ba-omgapi.jar ../modules/glassfish-corba-orb.jar ../modules/glassfish
-corba-orbgeneric.jar ../modules/auto-depends.jar ../modules/config.j
ar ../modules/config-types.jar ../modules/hk2.jar ../modules/hk2-core
.jar ../modules/osgi-adapter.jar ../modules/grizzly-comet.jar ../modu
les/grizzly-config.jar ../modules/grizzly-framework.jar ../modules/gr
izzly-http.jar ../modules/grizzly-http-servlet.jar ../modules/grizzly
-lzma.jar ../modules/grizzly-portunif.jar ../modules/grizzly-rcm.jar
../modules/grizzly-utils.jar ../modules/grizzly-websockets.jar ../mod
ules/javax.mail.jar ../modules/pkg-client.jar ../modules/jaxb-osgi.ja
r ../modules/activation.jar ../modules/el-api.jar ../modules/jaxr-api
-osgi.jar ../modules/jaxrpc-api-osgi.jar ../modules/endorsed/jaxb-api
-osgi.jar ../modules/stax-api.jar ../modules/junit.jar ../modules/sta
x2-api.jar ../modules/woodstox-core-asl.jar ../modules/javax.persiste
nce.jar ../modules/org.eclipse.persistence.antlr.jar ../modules/org.e
clipse.persistence.asm.jar ../modules/org.eclipse.persistence.core.ja
r ../modules/org.eclipse.persistence.jpa.jar ../modules/org.eclipse.p
ersistence.jpa.modelgen.jar ../modules/org.eclipse.persistence.oracle
.jar ../modules/endorsed/javax.annotation.jar ../modules/javax.ejb.ja
r ../modules/javax.enterprise.deploy.jar ../modules/javax.jms.jar ../
modules/javax.management.j2ee.jar ../modules/javax.resource.jar ../mo
dules/javax.security.auth.message.jar ../modules/javax.security.jacc.
jar ../modules/javax.servlet.jar ../modules/javax.servlet.jsp.jar ../
modules/javax.transaction.jar ../modules/simple-glassfish-api.jar ../
modules/admin-core.jar ../modules/admin-util.jar ../modules/config-ap
i.jar ../modules/monitoring-core.jar ../modules/acc-config.jar ../mod
ules/gf-client-module.jar ../modules/gms-bootstrap.jar ../modules/amx
-core.jar ../modules/amx-j2ee.jar ../modules/annotation-framework.jar
../modules/common-util.jar ../modules/container-common.jar ../module
s/glassfish-api.jar ../modules/glassfish-ee-api.jar ../modules/glassf
ish-naming.jar ../modules/internal-api.jar ../modules/scattered-archi
ve-api.jar ../modules/stats77.jar ../modules/connectors-inbound-runti
me.jar ../modules/connectors-internal-api.jar ../modules/connectors-r
untime.jar ../modules/work-management.jar ../modules/glassfish.jar ..
/modules/kernel.jar ../modules/logging.jar ../modules/deployment-comm
on.jar ../modules/deployment-javaee-core.jar ../modules/dol.jar ../mo
dules/ejb-container.jar ../modules/ejb-internal-api.jar ../modules/ld
apbp-repackaged.jar ../modules/libpam4j-repackaged.jar ../modules/man
agement-api.jar ../modules/flashlight-framework.jar ../modules/gmbal.
jar ../modules/ha-api.jar ../modules/class-model.jar ../modules/asm-a
ll-repackaged.jar ../modules/bean-validator.jar ../modules/jms-core.j
ar ../modules/endorsed/webservices-api-osgi.jar ../modules/webservice
s-extra-jdk-packages.jar ../modules/webservices-osgi.jar ../modules/o
rb-connector.jar ../modules/orb-iiop.jar ../modules/eclipselink-wrapp
er.pom ../modules/jpa-connector.jar ../modules/persistence-common.jar
../modules/cmp-internal-api.jar ../modules/appclient.security.jar ..
/modules/ejb.security.jar ../modules/jaspic.provider.framework.jar ..
/modules/security.jar ../modules/ssl-impl.jar ../modules/websecurity.
jar ../modules/webservices.security.jar ../modules/jta.jar ../modules
/jts.jar ../modules/transaction-internal-api.jar ../modules/el-impl.j
ar ../modules/jsp-impl.jar ../modules/war-util.jar ../modules/web-cli
.jar ../modules/web-core.jar ../modules/web-embed-api.jar ../modules/
web-glue.jar ../modules/web-gui-plugin-common.jar ../modules/web-nami
ng.jar ../modules/jsr109-impl.jar ../modules/mimepull.jar ../modules/
tiger-types.jar ../modules/shoal-gms-api.jar http://www.cnblogs.com/mq/lib/imq.jar ../
../mq/lib/imqadmin.jar http://www.cnblogs.com/mq/lib/imqutil.jar http://www.cnblogs.com/mq/lib/fscontex
t.jar ../lib/install/applications/jmsra/imqjmsra.jar ../lib/install/a
pplications/__ds_jdbc_ra/__ds_jdbc_ra.jar ../lib/install/applications
/__cp_jdbc_ra/__cp_jdbc_ra.jar ../lib/install/applications/__xa_jdbc_
ra/__xa_jdbc_ra.jar ../lib/install/applications/__dm_jdbc_ra/__dm_jdb
c_ra.jar http://www.cnblogs.com/javadb/lib/derby.jar http://www.cnblogs.com/javadb/lib/derbyclient.jar
http://www.cnblogs.com/javadb/lib/derbynet.jar http://www.cnblogs.com/javadb/lib/derbytools.jar http://www.cnblogs.com/j
avadb/lib/derbyrun.jar ../lib/install/applications/jaxr-ra/jaxr-ra.ja
r ../modules/aixporting-repackaged.jar
GlassFish-Conditional-Additions: ../modules/aixporting-repackaged.jar
看起来很痛苦,不过,能够摆脱glassfish那个大家伙的控制,把客户端考到任何机器上都能运行,这也还是值得的。
4、一位外国朋友给出的独立客户端需要的jar包列表
auto-depends.jar
deployment-common.jar
glassfish-corba-internal-api.jar
internal-api.jar
management-api.jar
bean-validator.jar
dol.jar
glassfish-corba-newtimer.jar
javax.ejb.jar
orb-connector.jar
common-util.jar
ejb-container.jar
glassfish-corba-omgapi.jar
javax.jms.jar
orb-iiop.jar
config-api.jar
ejb.security.jar
glassfish-corba-orb.jar
javax.resource.jar
security.jar
config-types.jar
glassfish-api.jar
glassfish-corba-orbgeneric.jar
javax.servlet.jar
ssl-impl.jar
config.jar
glassfish-corba-asm.jar
glassfish-naming.jar
javax.transaction.jar
transaction-internal-api.jar
connectors-internal-api.jar
glassfish-corba-codegen.jar
gmbal.jar
jta.jar
container-common.jar
glassfish-corba-csiv2-idl.jar
hk2-core.jar
kernel.jar
该文地址:http://stackoverflow.com/questions/4311157/glassfish-v3-x-and-remote-standalone-client
相关推荐
"Eclipse 与 GlassFish 3.1.1 配置指南" 概述: 本文档旨在指导读者如何在 Eclipse 中配置 GlassFish 3.1.1,实现连接池配置和 JNDI 配置。同时,也会解决在部署过程中可能出现的异常。 一、GlassFish 3.1.1 简介 ...
maven-embedded-glassfish-plugin-3.1.1.jar
通过这个EJBDemo,开发者可以深入理解EJB和Glassfish服务器的工作原理,掌握EJB的开发和部署过程,同时了解客户端如何与EJB通信,这对于理解Java EE架构和企业级应用开发至关重要。 总结,基于Glassfish的EJBDemo...
maven-embedded-glassfish-plugin-3.1.1-sources.jar
会话Bean处理客户端请求,实体Bean持久化业务数据,而消息驱动Bean则用于处理JMS(Java Message Service)消息。 开发EJB客户端时,首先需要设置开发环境。这通常包括安装JDK、集成开发环境(IDE,如Eclipse或...
NetBeans IDE是一款免费且开源的Java开发工具,支持多种编程语言,而GlassFish是Oracle公司提供的开源Java EE应用服务器,为开发者提供了部署和运行Java EE应用程序的平台。 **NetBeans IDE详解** NetBeans IDE以...
每个域代表一个独立的GlassFish实例,可以设置不同的配置参数。默认情况下,安装后会有一个名为`domain1`的域。 3. 部署应用:在Admin Console中,选择“Applications” > “Deploy”,然后浏览并上传你的WAR或EAR...
JMS_Glassfish-3-Server 在 Glassfish 3 ...消息域:- 点对点(消息只分发给一个客户端,这里使用队列) 发布者/订阅者(一条消息传递给所有订阅者,如广播)JMS 队列示例:- 安装 glassfish3 服务器并创建两个 JNDI
"网络编程第三次课代码"这个标题暗示我们将会深入探讨网络编程的一些关键概念和实现,可能包括客户端-服务器架构,套接字编程,以及在Windows环境下的应用。 描述中的"一起学习,一起提高,一起进步"鼓励共享知识和...
这些JAR文件可能包括了ActiveMQ客户端库、GlassFish的JMS库以及与SOAP相关的库,如JAXB(Java Architecture for XML Binding)和JAX-WS(Java API for XML Web Services)。 为了实现SOAPJMS,我们需要编写一个SOAP...
JSF 2.0的引入,则让UI开发变得更加直观和高效,其组件模型和Ajax支持使得创建富客户端界面更为轻松。 此外,Glassfish 3.1.2.2还提供了强大的管理和监控工具,如GlassFish Server Administration Console,它允许...
标题《Glassfish集群搭建手册》指的是利用Oracle提供的Glassfish应用服务器软件进行集群配置的详细指南。此手册涵盖了在不同场景下通过图形化界面和命令行方式搭建集群的整个过程,并且描述了如何配置集群环境以支持...
1. 模块化容器:Glassfish-v2的容器支持模块化部署,允许开发者将应用程序分解为独立的模块,如Web组件、EJB组件等,提高了可维护性和可扩展性。 2. Web容器:负责处理HTTP请求,管理Servlet和JSP,并提供会话管理...
GlassFish 安装配置文档 GlassFish 是一个基于 Java 的开源应用服务器,提供了一个强大且灵活的平台来部署和管理基于 Java 的应用程序。本文档将指导 readers 通过安装和配置 GlassFish 服务器,并将其与 Eclipse ...
在这个场景中,它被用来配置Apache作为反向代理服务器,将客户端请求转发到Glassfish集群中的不同节点。我们需要在httpd.conf中添加或修改以下内容: 1. 加载mod_jk模块: ```apache LoadModule jk_module ...
由Oracle公司维护,它支持各种企业级服务,包括Web服务、EJB(Enterprise JavaBeans)、JMS(Java Message Service)、JPA(Java Persistence API)以及Servlet和JSP等。作为NetBeans IDE的一部分,GlassFish为...
5. **默认端口配置**:在默认情况下,Glassfish的管理端口为4848,HTTP服务端口为8080,JMS端口为7676,IIOP端口为3700。这些端口在安装过程中需要确保没有其他程序占用。 6. **启动与管理**:将Glassfish安装目录...
4. **资源管理**:允许开发者管理GlassFish服务器上的数据源、JMS资源等,方便配置应用程序所需的外部资源。 5. **热部署**:插件支持热部署,即在不中断服务器运行的情况下,更新应用代码,提高开发效率。 6. **...
### Glassfish部署Web项目知识点详解 #### 一、概述 **Glassfish** 是一款开源的Java EE应用服务器,由Oracle公司维护。它基于Java EE标准,支持多种Java EE技术,如EJB、JPA、JSF等。由于其强大的功能和良好的...
5. **配置应用中的JMS连接**: 在你的Java代码或应用的配置文件中,你需要配置应用程序以使用在GlassFish中设置的JMS资源。这通常涉及通过JNDI查找获取连接工厂,并使用该工厂创建JMS连接。 6. **测试配置**: 完成...