前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >EJB学习日志

EJB学习日志

作者头像
全栈程序员站长
发布2022-11-11 14:52:28
5650
发布2022-11-11 14:52:28
举报

大家好,又见面了,我是你们的朋友全栈君。

第一天:

经典的:HelloWord

1. 编写helloword接口

package com.ejb;

public interface HelloWord { public String sayHello(String name); }

2.HelloWord的实现

package com.ejb.impl;

import javax.ejb.Remote; import javax.ejb.Stateless;

import com.ejb.HelloWord;

@Stateless // 声明这个bean是无状态的会话bean Stateless 声明这个bean是有状态的会话bean 两种状态的会话bean 代码没多大区别 但在调用的时候 他们俩个在对bean的管理的技术是不一样的 无状态bean使用实例池技术管理bean 有状态bean使用激活(activation)管理bean /** * @Remote 注释指明实现的接口是远程接口, * @Local 注释指明实现的接口是本地接口。 * 当@Local 和@Remote 注释都不存在时,会话 Bean 实现的接口默认为 Local接口。 * 如果在本地用 EJB(确保客户端与 EJB 容器运行在同一个 JVM),采用 Local 接口访问 EJB 优于 Remote 接口, * 因为 Remote接口访问 EJB 需要经过远程方法调用(RPCs)环节,而 Local 接口访问 EJB 直接从 JVM 中返回 EJB 的引用。 */ @Remote(HelloWord.class) // 指定远程接口 可以不写 默认是 本地接口 public class HelloWordBean implements HelloWord {

@Override public String sayHello(String name) { // TODO Auto-generated method stub return name + “说: 你好!!!”; }

}

3.把上面的类打包成*.jar 如helloword.jar 放到jboss的\server\default\deploy文件下 运行jboss

4.编写测试类

package com.ejb.test;

import java.util.Properties;

import javax.naming.InitialContext; import javax.naming.NamingException;

import com.ejb.HelloWord;

public class EJBCilent { /** * * @param args */ public static void main(String[] args) { Properties properties = new Properties(); // java.naming.factory.initial 固定写法 有JNDI规定 也是JNDI也是java的一种规范 // org.jnp.interfaces.NamingContextFactory jboss的JNDI连接工厂 properties.setProperty(“java.naming.factory.initial”, “org.jnp.interfaces.NamingContextFactory”); // 设置连接命名服务器的url java.naming.provoder.url 也是由JNDI规定

//localhost:1099 jboss的连接字符串

//1099 jndi的端口 jboss的命名服务端口 不是jboss端口 测试该例子是 端口号是9090 自己修改 properties.setProperty(“java.naming.provider.url”, “localhost:1099”); /** * 如果应用服务器不是jboss的话 上面两项要查看应用服务器的帮助文档 看上面2个key对应的值 */ try { InitialContext initialContext = new InitialContext(properties); // 设置完JNDI得上下文信息之后 可以调用lookup方法 去寻找HelloWordBean/remote绑定的对象 并返回客户端 /** * 如果把EJB应用打包成*.jar文件后,默认的JNDI全局名称是 :<br> * 1 本地接口 EJB_CLASS_NAME/local <br> * 2:远程接口:EJB_CLASS_NAME/remote */ /** * 如果把EJB应用打包成*.ear的java企业应用文件 默认全局JNDI的名称是:<br> * 1:本地接口:EAR_FILE_BASE_NAME/EJB_CLASS_NAME/local<br> * 2:远程接口:EAR_FILE_BASE_NAME/EJB_CLASS_NAME/remote */ HelloWord helloWord = (HelloWord) initialContext .lookup(“HelloWordBean/remote”); System.out.println(helloWord.sayHello(“hxy”)); //为了测试helloWord对象不是本例的helloword类的实例对象 可输出代理对象的类名 结果是$Proxy0 HelloWordBean hello = new HelloWordBean(); System.out.println(helloWord.getClass().getName()); System.out.println(hello.getClass().getName()); } catch (NamingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

还可以通过一个properties属性文件来设置JNDI 在项目的src目录下创建jndi.properties文件 并写入

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory

java.naming.provider.url=localhost:1099

这样main方法就可以直接这样写了 它会自己默认去找jndi.properties文件 就像Struts.xml文件一样

public static void main(String[] args) { try { InitialContext initialContext = new InitialContext(); HelloWord helloWord = (HelloWord) initialContext .lookup(“HelloWordBean/remote”); System.out.println(helloWord.sayHello(“哈哈”)); } catch (NamingException e) { // TODO Auto-generated catch block e.printStackTrace(); } }

如果调用 HelloWord helloWord = (HelloWord) initialContext.lookup(“HelloWordBean/remote”)报错 空值或者异常找不到EJB 可以进入到jboss的localhost主页 在JMX console jboss栏位中的service=JNDIView java.lang.String list()栏位中 invoke按钮 在Global JNDI Namespace 栏位里可以找到自己发布的EJB应用 如果没有 就是EJB没发不好 如果有的话 就要看客户端的环境设置 和代码 还有就是把jboss的包全部在重新导入一遍

第二天:

EJB注解

@EJB EJB实现的接口 实例名称 如@EJB HelloWord helloword

如果以个接口被2个或者2个以上的EJB实现 那么可以用 @EJB(beanName=”EJBName”) EJB实现的接口 实例的名字 但是 如果一个接口被不在同一个包 但是EJB的类名是一样的 又该怎么注解呢 不过这种事情貌似不怎么会发生 蛋疼的问题 嘎嘎 如果要注解jboss自己内置的EJB的话 就要是使用@resource 命令 如 @Resource TimerService timerService @Resource(mappedName=”数据源的jndi名称 调用方法 java:xxxx”) DataSource datasource

配置jboss数据源 在jboss_home/docs/examples/jca 的文件夹下有各种数据源的配置方案 本例一mysql为例 复制一份mysql_ds.xml 并修改里面的配置项 像url uid pwd driver 这些相信都看的懂 里面的 jndi-name 就上上面dataSource中mappedName中 java:xxx xxxx的名字 这个可以自定义 还有不要mysql的jar包 一定要放在server里使用的那个服务器中的lib目录里而不是jboss_home的lib目录 配置*_ds.xml数据源文件之后放到server中使用服务器类型的deploy的目录里 这个文件包的名字也是有规则的 如mysql_ds.xml hxy_ds.xml jboss默认_ds.xml为默认的数据源配置 上面完成之后需要重新启动jboss 然后可以再控制台看到connectionManager’jboss.jca.service=dataSourceBinding,name=上面该文件jndi-name标签里的值’ to JNDI name’java:上面该文件jndi-name标签里的值’ jboss中 一java开头的JNDI 只能是就boos内部调用 重启jboss之后 进入到jboss的主页 在点击 jmx-console 在jboss.jca一栏中可以看到数据源的属性 在managerdConnectionPool可以对数据源进行详细的设置 如连接数 连接最大值 最小值等

怎么有两个:

20:37:58,591 INFO [DLQ] Bound to JNDI name: queue/DLQ 20:37:58,761 INFO [ConnectionFactoryBindingService]BoundConnectionManager’jboss.jca:service=ConnectionFactoryBinding,name=JmsXA’ to JNDI name ‘java:JmsXA’

20:37:58,815 INFO [ConnectionFactoryBindingService] BoundConnectionManager‘jboss.jca:service=DataSourceBinding,name=hxy_mysql_DS’ to JNDI name ‘java:hxy_mysql_DS’

20:37:59,311 INFO [JmxKernelAbstraction] creating wrapper delegate for: org.jboss.ejb3.stateless.StatelessContainer

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/187680.html原文链接:https://javaforall.cn

本文参与?腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月29日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体同步曝光计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com