glassfish3 学习笔记(一)

来源:互联网 发布:listview的优化方案 编辑:程序博客网 时间:2024/05/14 17:32
运行http://localhost:4848出现如下错误:
Source Document: jndi:/__asadmin/WEB-INF/faces-config.xml
  Cause: Unable to find class 'com.sun.webui.jsf.faces.UIComponentELResolver'
解决方法:
将JDK版本升级到1.6.0_17以上

出现如下错误:
java.lang.NullPointerException
    at com.sun.enterprise.naming.impl.SerialContext.getRemoteProvider(SerialContext.java:297)
    at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:271)
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:430)
    at javax.naming.InitialContext.lookup(InitialContext.java:392)
    at com.session.stateless.HelloClient.main(HelloClient.java:19)
Exception in thread "main" javax.naming.NamingException: Lookup failed for 'com.session.stateless.Hello' in SerialContext targetHost=localhost,targetPort=3700 [Root exception is javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext targetHost=localhost,targetPort=3700 [Root exception is java.lang.NullPointerException]]
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:442)
    at javax.naming.InitialContext.lookup(InitialContext.java:392)
    at com.session.stateless.HelloClient.main(HelloClient.java:19)
Caused by: javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext targetHost=localhost,targetPort=3700 [Root exception is java.lang.NullPointerException]
    at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:276)
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:430)
    ... 2 more
解决方法:
将glassfishv3/glassfish/modules文件夹下的gf-client-module.jar,gf-client.jar导入到构建路径下

EJB中Stateful Bean 和Stateless Bean 区别

有状态会话Bean是这样一种EJB,即其服务的业务过程能够延伸到多个方法请求或者事务中。为完成这种业务过程,有状态会话Bean需要为单个客户保存状态信息。如果在方法调用期间有状态会话Bean的状态发生改变,则这种改变必须反映到同一客户的随后调用中。
无状态会话Bean是这样一种EJB,即其服务的业务过程只需要单个业务方法即可完成。由于它们不需要维护客户多个方法调用间的会话状态,因此它是无状态的。
为了限制内存中运行的有状态会话bean实例的数量,EJB容器需要将有状态会话Bean的会话状态保存到硬盘或者其他存储源中,该过程称为挂起(Passivation)。序列化和反序列化过程中不会对EJB持有的JDBC连接,或已打开的Socket,或其他非序列化对象进行操作。因此需要EJB开发者介入进来。
@PrePassivate注解是在挂起之前调用,在@PrePassivate注解的方法中可以对JDBC连接,文件等进行关闭。
@PostActivate注解是激活该会话bean后调用,在@PostActivate注解方法中可以对JDBC连接,文件等进行开启。
无状态会话Bean,在Bean实例池中维护相关Bean,使用后并不一定会立即销毁,可能会被下一个用户继续使用。

glassfish下:
@MessageDriven(
        activationConfig = { @ActivationConfigProperty(
                propertyName = "destinationType", propertyValue = "javax.jms.Queue"
        ) },
        mappedName = "test")
方式消息驱动部署不成功问题,
上述方式在glassfish下部署不成功,很是奇怪,目前不知道是什么原因。
目前知道的在glassfish下成功部署MDB的方式是:
1.http://localhost:4848/ 登录管理控制台
2.在”配置“菜单下,点击”Java 消息服务“,选择”物理目的地“,点击”新建“按钮,创建一个目标,在”名称“里输入“创建名称”、类型选择需要的类型:javax.jms.Queue或javax.jms.Topic,点击“确定”
3.创建号物理目的后,我们”资源“菜单,点击”JMS 资源“,创建连接工厂,点击”连接工厂“,点击”新建“按钮,在”JNDI名称“输入jms/TopicConnectionFactory,资源类型,选择 ”javax.jms.TopicConnectionFactory"可以根据自己需要的类型选择,最后点击”确定“完成JMS连接工厂的创建。
4.然后点击”目的地资源“,新建目标,点击”新建“按钮,在”JNDI名称“里输入:jms/TestTopic,物理目的地里输入刚刚我们新建的物理目的地名称,这里是:步骤2中创建的物理名称,资源类型选择:javax.jms.Topic,然后点击”确定“按钮完成创建。

5.在对应的消息驱动Bean下,添加@MessageDriven(mappedName = "jms/TestTopic")即可,

备注:也可以不用创建物理目的,创建目的地资源后物理目的可直接自动生成

6.客户端
public class LogClient {    public static void main(String[] args) throws NamingException, JMSException {        Properties props = new Properties();                props.put("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactory");        props.setProperty("java.naming.factory.url.pkgs", "com.sun.enterprise.naming");        props.setProperty("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");        props.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");  //host        props.setProperty("org.omg.CORBA.ORBInitialPort", "3700");  //EJB Port        // 初始化JNDI        InitialContext ctx = new InitialContext(props);        // 1: 查找连接工厂        TopicConnectionFactory factory = (TopicConnectionFactory)ctx.lookup("jms/TopicConnectionFactory");        // 2: 使用连接工厂创建JMS连接        TopicConnection connection = factory.createTopicConnection();        // 3: 使用JMS连接创建Session        TopicSession session = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);        // 4: 查找目的地        Topic topic = (Topic)ctx.lookup("jms/TestTopic");        // 5: 创建消息发布者        TopicPublisher publisher = session.createPublisher(topic);        // 6:创建和发布消息        TextMessage msg = session.createTextMessage();        msg.setText("This is a test message.");        publisher.send(msg);        // 完成        publisher.close();        System.out.println("Message published.");    }}
原创粉丝点击