如何在EJB3中JNDI调用SessionBean

如何在EJB3中JNDI调用SessionBean,第1张

1,通过程序编码方式:

Java代码

public static InitialContext

getInitialContext() throws

NamingException{

Properties p = new

Properties();

pput(ContextINITIAL_CONTEXT_FACTORY,

"orgjnpinterfacesNamingContextFactory");

pput(ContextURL_PKG_PREFIXES,

"orgjbossnaming:orgjnpinterfaces");

pput(ContextPROVIDER_URL, "jnp://localhost:1099");

return new

InitialContext(p);

}

客户端通过调用InitialContext ctx=getInitialContext();的方式来获取上下文。

2、 通过配置属性文件的方式

在应用的src下新建一个jndiproperties的资源文件(注意文件名必须是jndiproperties)

内容:

javanamingfactoryinitial=orgjnpinterfacesNamingContextFactory

javanamingfactoryurlpkgs=orgjbossnaming:orgjnpinterfaces

javanamingproviderurl=localhost

客户端只要通过下面的方法就能获得上下文对象了

InitialContext ctx = new InitialContext();

为了方便在程序开发的过程中的测试,我们一般情况下会封装一个获得JNDI上下文的工具类来使用。比如我们构建的一个如下的EJBFinderjava的类:

Java代码

public class EJBFinder

{

public static InitialContext

getInitialContext() throws

NamingException{

Properties p = new

Properties();

pput("server",

"jboss");

pput(ContextINITIAL_CONTEXT_FACTORY,

"orgjnpinterfacesNamingContextFactory");

pput(ContextURL_PKG_PREFIXES,

"orgjbossnaming:orgjpninterfaces");

pput(ContextPROVIDER_URL, "jnp://localhost:1099");

InitialContext ctx = new

InitialContext(p);

return ctx;

}

public static Object findEJB(String

ejbname) throws

NamingException{

return

getInitialContext()lookup(ejbname);

}

}

在上一篇如何在EJB3中JNDI调用SessionBean(一)文章中我们解决了测试环境中统一调用JNDI的问题,但是当EJB组件开发完成后,正式部署到正式环境中,客户端调用EJB组件怎样去调用呢?现在我们分析这其中出现的问题。

1、 客户端不在同一个JVM环境中,应该怎样处理?

2、

SessionBean对于客户端是隐藏的,开发客户端的程序员怎么能非常方便的获得SessionBean的绑定名?怎么能方便的得到JNDI上下文呢?

3、 各EJB组件分别部署在不同的服务器上,我们怎么能方便的调用?

4、

各EJB组件如果运行在不同的EJB容器中,我们怎么能方便的得到对应的JNDI上下文环境?

针对这些问题,我们逐步的去分析解决。

客户端不在同一个JVM中这是普遍出现的情况,我们可能将web客户端运行在Tomcat上,而EJB运行在JBoss容器中,对于这种情况,我们如果采用上面介绍的第一种情况来获得JNDI上下文就非常不可行,因为EJB的环境的变化会导致太多程序代码的改动,为日后的维护埋下了隐患。所以只能采用第二种方式,将JNDI上下文信息配置在属性文件中,即使以后EJB的环境更换,也可以通过修改配置文件来实现这种改变。

通过JNDI的方式来调用EJB的SessionBean,必然少不了为SessionBean绑定JNDI名。默认的情况下(JBoss),容器会以实现类的类名作为JNDI名。比如getIntialContext()lookup(“LoginBean/remote”);

LoginBean就是Login接口的实现类的名字。

@Stateless

@Remote(Loginclass)

public class LoginBean implements Login{}

如果这样去做的话,我们开发客户端的程序员就必须要知道这个SessionBean接口的实现类是什么名字,这不是一种好的方式,违背了我们隐藏实现的编程思想。才开始大家建议,约定SessionBean的命名格式为接口+Bean后缀,这是一个比较可行的解决方案。但是一个约定好的命名格式,只能给我们的是一个已知的字符串,我们利用这个字符串所能做的事情太少了。我们利用@Stateless中的name属性,可以为Session

Bean起个别名,这个东西应该很好的利用起来。我们再一次讨论,对于客户端来说,什么是透明的呢?无疑是接口,我们能不能把接口的名字作为SessionBean的别名呢。这个主意不错,大家一致通过,看了网上的一些例子,好多人也是采用这种方式。但是也有不好的方面,如果一个SessionBean实现多个接口就不是很好处理了。我们只能再次约定,一个SessionBean只能对应着一个远程接口。这样我们只知道接口就能方便的调用EJB了。

但问题又接踵而至,我们使用EJB作为组件开发技术,很大程度上是利用它强大的分布式计算的能力,这就要求每个EJB组件有可能运行在不同的服务器上,我们调用这些EJB组件,只采用一套上下文配置的方式是非常不可行的。我们需要为每个组件配置各自的JNDI上下文环境。怎么去做呢?在客户端我们为每个组件建立一个Properties文件,里面包含了该组件的JNDI配置。我们调用不同的组件时,我们就去获取该组件的JNDI配置,这已经很好的解决了相关的问题,完全可以适应EJB分布式的环境,但是有没有更好的方法让用户不再去选择每个组件的配置,让他们感觉和本地调用一样简单呢。于是我们在Session

Bean接口上做了一些文章,通过自定义annotation的方式,来为每个接口标志相关的组件信息,通过程序解析annotation来获得组件的信息来进行相关的处理。我们定义一个@ComponentInfo的元数据来标注组件的相关信息。

@Target( { TYPE })

@Retention(RetentionPolicyRUNTIME)

public @interface ComponentInfo {

String name();

String description() default "";

}

name属性为组件的名字,description顾名思义就是组件的描述,通过作用在每个接口上的这个annotation,我们就可以获得组件名称。我们约定客户端的JNDI配置的属性文件的文件名要和这里的组件名称对应,这样我们就可以自动找到该组件需要的JNDI配置。

为了方便EJB组件的开发,我们可以为每个EJB组件做一个全局的接口。将该annotation作用在最上层父类的TYPE上,而该组件所有的SessionBean接口都继承这个接口。

问题都解决了吗?我们不断地寻找问题。

现在问题来了,不同的容器存在自己特有的lookup实现方式,太郁闷了,这样就要将EJB组件和容器绑死了,这为以后EJB组件的移植设置了巨大的障碍。

那么我们该如何解决呢?

这样的一个工具类给我们测试EJB组件提供了很大的方便,不用我们再去重复的去构建JNDI上下文的环境。但是当EJB组件开发完成后,正式部署到正式环境中,客户端调用EJB组件怎样去调用呢?

在如何在EJB3中JNDI调用SessionBean(二)中,我们初步解决了分布式调用EJB组件的问题,但是问题又出现了,我们在这里不得不对我们尊敬的SUN一口恶骂,为什么不统一标准,让所有的EJB容器都采用同样格式的JNDI获取方式。现在问题来了,不同的容器存在自己特有的lookup实

现方式,太郁闷了,这样就要将EJB组件和容器绑死了,这为以后EJB组件的移植设置了巨大的障碍。我们思考着,这个问题似曾相识,对,用工厂模式来解决

这种移植性的问题,对不同的实现通过工厂的方式进行集中管理,从而方便系统的移植。说干就干,我们建立一个公共的接口:

Java代码

public interface JNDIFinder

{

public Object

lookup(InitialContext ctx, Class clazz)

throws

NamingException;

}

我们为每个容器建立自己的JNDI查找实现类:JbossJNDIFinderImpljava,WeblogicJNDIFinderImpljava

然后再建立JNDIFinder的工厂来进行管理和获取:JNDIFactoryjava

Java代码

public static JNDIFinder

getFinder(String server) {

if

(JBOSS_SERVERequals(server)) {

return new

JbossJNDIFinderImpl();

} else if

(WEBLOGIC_SERVERequals(server)) {

return new

WeblogicJNDIFinderImpl();

}

return new

JbossJNDIFinderImpl();// 默认返回jboss的实现

}

而getFinder(String

server)中的server我们可以将它配置到我们的JNDI配置文件中:

server=jboss

javanamingfactoryinitial=orgjnpinterfacesNamingContextFactory

javanamingfactoryurlpkgs=orgjbossnaming:orgjpninterfaces

javanamingproviderurl=jnp://localhost:1099

万事俱备只欠东风了,我们最后把这些要统一封装成一个最简单方法来进行调用。我们建立一个工具类JNDIUtiljava,在该类中,我们向外暴露一个静态方法:

public static Object lookup(Class clazz) throws NamingException

大功告成了,现在只需要一个简单的调用Login login

=(Login)JNDIUtillookup(Loginclass);

就解决了上面提出的相关问题,实现了跨EJB服务器的分布式EJB组件的调用。(后面将附上该方案的相关源代码)

当然,这个解决方案还需要经过实际开发的检验,我们也将不断地优化该方案,也希望更多人讨论交流,提出宝贵的意见,目的是为了更好的解决该问题。

1更新节点配置文件(Linux 和 UNIX)

节点配置文件(db2nodescfg)位于实例所有者的主目录中,它包含一些配置信息,告诉 DB2有哪些服务器参与分区数据库环境的实例。分区数据库环境中的每个实例都有一个 db2nodescfg 文件。

对于每个参与实例的服务器,db2nodescfg 文件必须包含一个条目。当创建实例时,会自动创建 db2nodescfg 文件并对拥有实例的服务器添加条目。

例如,在拥有实例的服务器 ServerA 上使用“DB2 安装”向导创建了 DB2 实例时,db2nodescfg 文件将被更新为如下所示:

0 ServerA 0

此任务提供了一些步骤,以将 db2nodescfg 文件更新为包括参与的计算机的条目。

要更新 db2nodescfg 文件:

1)作为实例所有者登录(在本示例,db2inst1 是实例所有者)。

2)输入以下命令确保已停止 DB2 实例:

INSTHOME/sqllib/adm/db2stop,

其中 INSTHOME 是实例所有者的主目录(db2nodescfg 文件在实例运行时被锁定,并且仅当实例停止时才可以编辑该文件)。

例如,如果实例主目录为 /db2home/db2inst1,则输入以下命令:

/db2home/db2inst1/sqllib/adm/db2stop

3) 对于每个 DB2 实例,向 rhosts 文件添加一个条目。通过添加以下项来更新文件:

<hostname> <db2instance>

其中 <hostname> 是数据库服务器的 TCP/IP 主机名,<db2instance> 是用来访问数据库服务器的实例的名称。

4) 向每个参与的服务器的 db2nodescfg 文件添加一个条目。当第一次查看 db2nodescfg 文件时,它应该包含类似于以下内容的条目:

0 ServerA 0

此条目包括数据库分区服务器号(节点号)、数据库分区服务器驻留的服务器的 TCP/IP 主机名以及数据库分区服务器的逻辑端口号。

如果正在对安装概述中所描述的分区配置(有四台计算机,每台计算机上安装一个数据库分区服务器)进行安装,则应该出现类似如下的更新 db2nodescfg:

0 ServerA 0

1 ServerB 0

2 ServerC 0

3 ServerD 0

5) 当完成更新 db2nodescfg 文件时,输入 INSTHOME/sqllib/adm/db2start 命令,其中 INSTHOME 是实例所有者的主目录。例如,如果实例主目录为 /db2home/db2inst1,则输入以下命令:

/db2home/db2inst1/sqllib/adm/db2start

6) 注销。

2启动DB2 First Steps

1)建议用实例拥有者的用户登录,这样会有更多功能可以使用。

2)将默认环境设置调入(初学的时候有必要进行)

source /home/db2inst1/sqllib/db2profile

当然要想每次启动就进行环境配置则在profile, bashrc内加入该句

3)查看环境变量是否已经设置完毕

set | grep DB2

4)查看DB2实例是否运行:

ps lax | grep db2sysc | grep –v grep

5)启动First Steps

db2fs(需要绝对路径,一般在形如/home/db2inst1/sqllib/,或/opt/ibm/db2/v91/bin下。

6)使用DB2FS,你可以使用它进行一下尝试~

kafka的配置分为 broker、producter、consumer三个不同的配置

一 BROKER 的全局配置

最为核心的三个配置 brokerid、logdir、zookeeperconnect 。

------------------------------------------- 系统 相关 -------------------------------------------

##每一个broker在集群中的唯一标示,要求是正数。在改变IP地址,不改变brokerid的话不会影响consumers

brokerid =1

##kafka数据的存放地址,多个地址的话用逗号分割 /tmp/kafka-logs-1,/tmp/kafka-logs-2

logdirs = /tmp/kafka-logs

##提供给客户端响应的端口

port =6667

##消息体的最大大小,单位是字节

messagemaxbytes =

## broker 处理消息的最大线程数,一般情况下不需要去修改

numnetworkthreads =3

## broker处理磁盘IO 的线程数 ,数值应该大于你的硬盘数

numiothreads =8

## 一些后台任务处理的线程数,例如过期消息文件的删除等,一般情况下不需要去做修改

backgroundthreads =4

## 等待IO线程处理的请求队列最大数,若是等待IO的请求超过这个数值,那么会停止接受外部消息,算是一种自我保护机制

queuedmaxrequests =500

##broker的主机地址,若是设置了,那么会绑定到这个地址上,若是没有,会绑定到所有的接口上,并将其中之一发送到ZK,一般不设置

hostname

## 打广告的地址,若是设置的话,会提供给producers, consumers,其他broker连接,具体如何使用还未深究

advertisedhostname

## 广告地址端口,必须不同于port中的设置

advertisedport

## socket的发送缓冲区,socket的调优参数SO_SNDBUFF

socketsendbufferbytes =1001024

## socket的接受缓冲区,socket的调优参数SO_RCVBUFF

socketreceivebufferbytes =1001024

## socket请求的最大数值,防止serverOOM,messagemaxbytes必然要小于socketrequestmaxbytes,会被topic创建时的指定参数覆盖

socketrequestmaxbytes =10010241024

------------------------------------------- LOG 相关 -------------------------------------------

## topic的分区是以一堆segment文件存储的,这个控制每个segment的大小,会被topic创建时的指定参数覆盖

logsegmentbytes =102410241024

## 这个参数会在日志segment没有达到logsegmentbytes设置的大小,也会强制新建一个segment 会被 topic创建时的指定参数覆盖

logrollhours =247

## 日志清理策略 选择有:delete和compact 主要针对过期数据的处理,或是日志文件达到限制的额度,会被 topic创建时的指定参数覆盖

logcleanuppolicy = delete

## 数据存储的最大时间 超过这个时间 会根据logcleanuppolicy设置的策略处理数据,也就是消费端能够多久去消费数据

## logretentionbytes和logretentionminutes任意一个达到要求,都会执行删除,会被topic创建时的指定参数覆盖

logretentionminutes=7days

指定日志每隔多久检查看是否可以被删除,默认1分钟

logcleanupintervalmins=1

## topic每个分区的最大文件大小,一个topic的大小限制 = 分区数logretentionbytes 。-1没有大小限制

## logretentionbytes和logretentionminutes任意一个达到要求,都会执行删除,会被topic创建时的指定参数覆盖

logretentionbytes=-1

## 文件大小检查的周期时间,是否处罚 logcleanuppolicy中设置的策略

logretentioncheckintervalms=5minutes

## 是否开启日志压缩

logcleanerenable=false

## 日志压缩运行的线程数

logcleanerthreads =1

## 日志压缩时候处理的最大大小

logcleaneriomaxbytespersecond=None

## 日志压缩去重时候的缓存空间 ,在空间允许的情况下,越大越好

logcleanerdedupebuffersize=50010241024

## 日志清理时候用到的IO块大小 一般不需要修改

logcleaneriobuffersize=5121024

## 日志清理中hash表的扩大因子 一般不需要修改

logcleaneriobufferloadfactor =09

## 检查是否处罚日志清理的间隔

logcleanerbackoffms =15000

## 日志清理的频率控制,越大意味着更高效的清理,同时会存在一些空间上的浪费,会被topic创建时的指定参数覆盖

logcleanermincleanableratio=05

## 对于压缩的日志保留的最长时间,也是客户端消费消息的最长时间,同logretentionminutes的区别在于一个控制未压缩数据,一个控制压缩后的数据。会被topic创建时的指定参数覆盖

logcleanerdeleteretentionms =1day

## 对于segment日志的索引文件大小限制,会被topic创建时的指定参数覆盖

logindexsizemaxbytes =1010241024

## 当执行一个fetch *** 作后,需要一定的空间来扫描最近的offset大小,设置越大,代表扫描速度越快,但是也更好内存,一般情况下不需要搭理这个参数

logindexintervalbytes =4096

## log文件"sync"到磁盘之前累积的消息条数

## 因为磁盘IO *** 作是一个慢 *** 作,但又是一个"数据可靠性"的必要手段

## 所以此参数的设置,需要在"数据可靠性"与"性能"之间做必要的权衡

## 如果此值过大,将会导致每次"fsync"的时间较长(IO阻塞)

## 如果此值过小,将会导致"fsync"的次数较多,这也意味着整体的client请求有一定的延迟

## 物理server故障,将会导致没有fsync的消息丢失

logflushintervalmessages=None

## 检查是否需要固化到硬盘的时间间隔

logflushschedulerintervalms =3000

## 仅仅通过interval来控制消息的磁盘写入时机,是不足的

## 此参数用于控制"fsync"的时间间隔,如果消息量始终没有达到阀值,但是离上一次磁盘同步的时间间隔

## 达到阀值,也将触发

logflushintervalms = None

## 文件在索引中清除后保留的时间 一般不需要去修改

logdeletedelayms =60000

## 控制上次固化硬盘的时间点,以便于数据恢复 一般不需要去修改

logflushoffsetcheckpointintervalms =60000

------------------------------------------- TOPIC 相关 -------------------------------------------

## 是否允许自动创建topic ,若是false,就需要通过命令创建topic

autocreatetopicsenable =true

## 一个topic ,默认分区的replication个数 ,不得大于集群中broker的个数

defaultreplicationfactor =1

## 每个topic的分区个数,若是在topic创建时候没有指定的话 会被topic创建时的指定参数覆盖

numpartitions =1

实例 --replication-factor3--partitions1--topic replicated-topic :名称replicated-topic有一个分区,分区被复制到三个broker上。

----------------------------------复制(Leader、replicas) 相关 ----------------------------------

## partition leader与replicas之间通讯时,socket的超时时间

controllersockettimeoutms =30000

## partition leader与replicas数据同步时,消息的队列尺寸

controllermessagequeuesize=10

## replicas响应partition leader的最长等待时间,若是超过这个时间,就将replicas列入ISR(in-sync replicas),并认为它是死的,不会再加入管理中

replicalagtimemaxms =10000

## 如果follower落后与leader太多,将会认为此follower[或者说partition relicas]已经失效

## 通常,在follower与leader通讯时,因为网络延迟或者链接断开,总会导致replicas中消息同步滞后

## 如果消息之后太多,leader将认为此follower网络延迟较大或者消息吞吐能力有限,将会把此replicas迁移

## 到其他follower中

## 在broker数量较少,或者网络不足的环境中,建议提高此值

replicalagmaxmessages =4000

##follower与leader之间的socket超时时间

replicasockettimeoutms=301000

## leader复制时候的socket缓存大小

replicasocketreceivebufferbytes=641024

## replicas每次获取数据的最大大小

replicafetchmaxbytes =10241024

## replicas同leader之间通信的最大等待时间,失败了会重试

replicafetchwaitmaxms =500

## fetch的最小数据尺寸,如果leader中尚未同步的数据不足此值,将会阻塞,直到满足条件

replicafetchminbytes =1

## leader 进行复制的线程数,增大这个数值会增加follower的IO

numreplicafetchers=1

## 每个replica检查是否将最高水位进行固化的频率

replicahighwatermarkcheckpointintervalms =5000

## 是否允许控制器关闭broker ,若是设置为true,会关闭所有在这个broker上的leader,并转移到其他broker

controlledshutdownenable =false

## 控制器关闭的尝试次数

controlledshutdownmaxretries =3

## 每次关闭尝试的时间间隔

controlledshutdownretrybackoffms =5000

## 是否自动平衡broker之间的分配策略

autoleaderrebalanceenable =false

## leader的不平衡比例,若是超过这个数值,会对分区进行重新的平衡

leaderimbalanceperbrokerpercentage =10

## 检查leader是否不平衡的时间间隔

leaderimbalancecheckintervalseconds =300

## 客户端保留offset信息的最大空间大小

offsetmetadatamaxbytes

----------------------------------ZooKeeper 相关----------------------------------

##zookeeper集群的地址,可以是多个,多个之间用逗号分割 hostname1:port1,hostname2:port2,hostname3:port3

zookeeperconnect = localhost:2181

## ZooKeeper的最大超时时间,就是心跳的间隔,若是没有反映,那么认为已经死了,不易过大

zookeepersessiontimeoutms=6000

## ZooKeeper的连接超时时间

zookeeperconnectiontimeoutms =6000

## ZooKeeper集群中leader和follower之间的同步实际那

zookeepersynctimems =2000

配置的修改

其中一部分配置是可以被每个topic自身的配置所代替,例如

新增配置

bin/kafka-topicssh --zookeeper localhost:2181--create --topic my-topic --partitions1--replication-factor1--config maxmessagebytes=64000--config flushmessages=1

修改配置

bin/kafka-topicssh --zookeeper localhost:2181--alter --topic my-topic --config maxmessagebytes=128000

删除配置 :

bin/kafka-topicssh --zookeeper localhost:2181--alter --topic my-topic --deleteConfig maxmessagebytes

二 CONSUMER 配置

最为核心的配置是groupid、zookeeperconnect

## Consumer归属的组ID,broker是根据groupid来判断是队列模式还是发布订阅模式,非常重要

 groupid

## 消费者的ID,若是没有设置的话,会自增

 consumerid

## 一个用于跟踪调查的ID ,最好同groupid相同

 clientid = group id value

## 对于zookeeper集群的指定,可以是多个 hostname1:port1,hostname2:port2,hostname3:port3 必须和broker使用同样的zk配置

 zookeeperconnect=localhost:2182

## zookeeper的心跳超时时间,查过这个时间就认为是dead消费者

 zookeepersessiontimeoutms =6000

## zookeeper的等待连接时间

 zookeeperconnectiontimeoutms =6000

## zookeeper的follower同leader的同步时间

 zookeepersynctimems =2000

## 当zookeeper中没有初始的offset时候的处理方式 。smallest :重置为最小值 largest:重置为最大值 anythingelse:抛出异常

 autooffsetreset = largest

## socket的超时时间,实际的超时时间是:maxfetchwait + sockettimeoutms

 sockettimeoutms=301000

## socket的接受缓存空间大小

 socketreceivebufferbytes=641024

##从每个分区获取的消息大小限制

 fetchmessagemaxbytes =10241024

## 是否在消费消息后将offset同步到zookeeper,当Consumer失败后就能从zookeeper获取最新的offset

 autocommitenable =true

## 自动提交的时间间隔

 autocommitintervalms =601000

## 用来处理消费消息的块,每个块可以等同于fetchmessagemaxbytes中数值

 queuedmaxmessagechunks =10

## 当有新的consumer加入到group时,将会reblance,此后将会有partitions的消费端迁移到新

## 的consumer上,如果一个consumer获得了某个partition的消费权限,那么它将会向zk注册

##"Partition Owner registry"节点信息,但是有可能此时旧的consumer尚没有释放此节点,

## 此值用于控制,注册节点的重试次数

 rebalancemaxretries =4

## 每次再平衡的时间间隔

 rebalancebackoffms =2000

## 每次重新选举leader的时间

 refreshleaderbackoffms

## server发送到消费端的最小数据,若是不满足这个数值则会等待,知道满足数值要求

 fetchminbytes =1

## 若是不满足最小大小(fetchminbytes)的话,等待消费端请求的最长等待时间

 fetchwaitmaxms =100

## 指定时间内没有消息到达就抛出异常,一般不需要改

 consumertimeoutms = -1

三 PRODUCER 的配置

比较核心的配置:metadatabrokerlist、requestrequiredacks、producertype、serializerclass

## 消费者获取消息元信息(topics, partitions and replicas)的地址,配置格式是:host1:port1,host2:port2,也可以在外面设置一个vip

 metadatabrokerlist

##消息的确认模式

 ##0:不保证消息的到达确认,只管发送,低延迟但是会出现消息的丢失,在某个server失败的情况下,有点像TCP

 ##1:发送消息,并会等待leader 收到确认后,一定的可靠性

 ## -1:发送消息,等待leader收到确认,并进行复制 *** 作后,才返回,最高的可靠性

 requestrequiredacks =0

## 消息发送的最长等待时间

 requesttimeoutms =10000

## socket的缓存大小

 sendbufferbytes=1001024

## key的序列化方式,若是没有设置,同serializerclass

 keyserializerclass

## 分区的策略,默认是取模

 partitionerclass=kafkaproducerDefaultPartitioner

## 消息的压缩模式,默认是none,可以有gzip和snappy

 compressioncodec = none

## 可以针对默写特定的topic进行压缩

 compressedtopics=null

## 消息发送失败后的重试次数

 messagesendmaxretries =3

## 每次失败后的间隔时间

 retrybackoffms =100

## 生产者定时更新topic元信息的时间间隔 ,若是设置为0,那么会在每个消息发送后都去更新数据

 topicmetadatarefreshintervalms =6001000

## 用户随意指定,但是不能重复,主要用于跟踪记录消息

 clientid=""

------------------------------------------- 消息模式 相关 -------------------------------------------

 ## 生产者的类型 async:异步执行消息的发送 sync:同步执行消息的发送

 producertype=sync

## 异步模式下,那么就会在设置的时间缓存消息,并一次性发送

 queuebufferingmaxms =5000

## 异步的模式下 最长等待的消息数

 queuebufferingmaxmessages =10000

## 异步模式下,进入队列的等待时间 若是设置为0,那么要么进入队列,要么直接抛弃

 queueenqueuetimeoutms = -1

## 异步模式下,每次发送的最大消息数,前提是触发了queuebufferingmaxmessages或是queuebufferingmaxms的限制

 batchnummessages=200

## 消息体的系列化处理类 ,转化为字节流进行传输

 serializerclass= kafkaserializerDefaultEncoder

1。Java基本语法、类、继承、方法、接口、Java面向对象程序设计、Java用户界面(GUI)、Java-JDBC对数据库进行访问了解面向对象、封装、抽象、继承,掌握Java语法、GUI编程、JDBC,GUI访问数据库60课时

2。JavaWEB应用实战WEB服务器安装、配置、SQLServer数据库使用,JDBC、JavaScript、Servlet、JSP技术,JSP-Servlet-JavaBean三层架构70课时

3。JAVA与数据库实战(Oracle、DB2、SQLServer)WebLogic服务器安装配置,Oracle、DB2、SQLServer数据库管理,连接池、数据源、JNDI技术,Java和各种数据库交互实例50课时

4。JBuilder-WebLogic-EJB-Oracle企业级应用WebLogic、Jbuilder、Oracle集成配置,Java分布式平台技术,连接池、数据源配置,RMI与JNDI技术,中间件概念,会话Bean、实体Bean,开发《购物车》实例全面了解J2EE架构、掌握WebLogic服务器、Jbuilder开发工具,EJB组件以及JDBC、JNDI分布式平台技术50课时

5。Struts技术揭密及WEB开发实例Struts框架安装配置,M-V-C模型,Struts控制器模型组件、视图组件,标记库原理,数据源配置Struts开发实例50课时

6Linux-Apache-Tomcat-MYSQL集成环境高级应用Linux *** 作系统安装,Linux各种命令用法、各种服务配置,Linux系统下WEB服务器配置;MySQL数据库安装及管理;Java和MySQL进行交互40课时

7。UML-Rose建模实战统一建模语言(UML)概述、概述、健壮性分析,用例和用例图、用例和角色、识别和角色、边界、力度、类图。40课时

8。J2EE框架技术实战(表示层:Struts,业务层:Spring,持久层:hibernate)表示层:Struts技术业务层:Spring技术数据持久层:hibernate技术、ibatis(sqlmap)技术。60课时

9日语与Java编程经过两个月日语强化培训,掌握生活常用的日语,特别是Java编程中经常使用的计算机日语,具有一定日语表达能力。

1、先学学JSP,用纯JSP做个日记本简单的小系统,纯粹从语言层面上了解一些基础知识,把tomcat玩熟了,就用记事本编就行,主要是熟悉,能够理解jsp运行机制。然后学学java,看本基础的书,都是那种讲讲语法的,变量怎么定义,流程控制语句怎么写,怎么编写函数,怎么处理表单元素,处理字符串,连接数据库,会一种就行。这些都是浮在语言表面,你编写的程序还是结构化的,跟你以前用asp编的程序没什么区别,但是这很重要。你可以直接选择目前公司里都在使用的Eclips来开发,但是你要区分IDE和Java的区别,不要被IDE邦死了。这些都熟了之后看《thinkinginjava》,看完之后,看corejava两卷,深入了解到java本身。看这些书的时候你可能就懵懂的进入oo世界了,估计还不太明白。可以配合一些oo的理论方面的书,oo不过就是那几个特点,封装分配,多态性,继承,第一个要理解的当然是对象。看完这些后就可以学习UML建模了,主要会画三种图,用例图,类图,序列图,三种图就足够了。不要期望自己一下就学会UML,就会建模,得跟java学习联系起来,编个几万行代码,慢慢就会设计对象了。然后看GOF《设计模式》,对你的面向对象思想一个巨大的提升,这时你一定会去重读继承,接口,抽象类的相关的细节了,并且你会发现你的理解能力上了一个台阶。然后看看三层结构的知识,这时候编程考虑使用jspservletjavabean,分出表示层,业务层和数据访问层,这是基础。

2、以上都是J2SE,然后看thinkinginenterprisejava,学习j2ee基础知识,你慢慢就会明白持久层的一些机制了,后面的什么各种新鲜的东西,CMP的东西本质是什么,你都很好理解了。当然你要不断编码,把书里的概念都变成实践,只有自己动手做,才能理解,看会不等于学会,学会不等于学精,学好技术不等于会设计,层次会越来越高。实践是认识的唯一来源!!!一定要实践。

3、编码时你可以考虑看看《重构》这本书,觉得很好,同时还可以看看ThinkinginDesignPatternwithjava,会使你的代码越来越漂亮。

4、现在你的代码已经很专业了,而且可以分出不同的层次,因为你知道了最基本的原则,那就是要高内聚,低耦合,要不断地解耦,但是怎么更好的解耦,什么是最佳实践,你可能并不知道,虽然你看了下面这本书,你会发现你有些做法已经是最佳实践了,但是依然会存在这种情况,有些你并不确定,那就看看corejavapattern吧,都是14年以上开发经验的架构师和众多java大师的经验总结,书中序言所写,看完这本书,你将成为Java架构师。

5、这些知道之后,你已经对分层的本质很理解了,你可以知道Struts不过是框架而已,只是运用了页面助手,前端控制器,应用控制器等这些表示层或者表示层和业务层(Tier)中间连接层(Layer)的模式,对于标签的理解你也是深刻的。而到集成层,采取不同的策略和模式,数据持久化的理论和经验,框架不过是把大家都用得着的东西做好了给你用,没有框架的话很多事需要你自己做,仅此而已,跟那些伟大的思想相比,它们太简单了。至于到具体的容器,DAO策略还是CMP,BMP,在具体使用怎样的ORM工具,都是更简单的事情了。但是看spring,struts这些框架时你会重新阅读前面的java教程的,因为spring用到了java的反射机制等。

6、到此为止,你会发现你OOP时,想到的就会是性能,到底用数组还是ArryList,还是用HashMap,OOD时,你会考虑并发性,扩展性,复用性,现有框架,池,事务等方面,你会发现每一个问题,你都有好几种选择方案,你会不断重构你的代码,改良你的设计。

7、下一步是OOA,那就看一本《分析模式》吧,会教你很多分析的现成方法。

此时,你已经是OO方面的专家了,构架一个大型系统应该没有问题了,而且你的能力可以很轻易的学会WebService,AJAX等这些时髦的东西,你编程的时候可能最常翻的书是JDKAPI,但是你会遇到新的问题,就是让你设计一套股票系统,可是你对股票一无所知,现学,这是必须的,但是这时你会发现你基础好差,所以在学技术的同时,多看看各个领域的书吧,其实都是有模式的,比如ERP选型,CRM的几种样子,电子商务的几种模式,看多了你也就会了,所以要学会域建模,因为你是要为商务,政务服务的,是为人服务的。

我觉得这在技术方面就算到头了,如果你想学管理,当然前提是技术,要不你不知道完成一个项目到底要多久花多少钱。你必须了解开发方法,迭代开发,XP等,当你有了技术,再看这些很容易,因为你会明白为什么要测试先行,在技术上怎么实现技术先行;你也会知道结对编码的意义。学习了这些你会是项目经理。

但是你可能还需要多看看经济领域的书和法律书,还包括中国政府的报告等等,要政治敏感,这样你才能成为比尔盖茨。这离主题有点远了。

总的原则是:

1、先从语言层面掌握Java(很多说Java容易的人都是只掌握了语言层面的人,当你面对如何解耦,怎样利用线程,如何更好复用,面向对象时,你就会觉得它好复杂好难)然后再到深入理解Java,先学J2SE再学J2EE。

2、理论和实践相结合,先看 *** 作,理解本质和原理,然后做,然后翻过来看理论,你会觉得这件事做起来就是顺理成章的了,因为当初理论就是这么被推出来的。

3、高处着眼,有了基础后,你可以从本质上去跟上时髦的东西,比如ORM,更细点说就是Hibernate等,比如各层框架,Spring,Struts等,都很简单。

4、学好理论,你用到多线程时可能会觉得自己对于线程机制不慎了解,对对象在内存中的生命周期不清楚,对于JUnit断言的不理解,对调试程序的原理不明白,去看计算机组成原理吧;可能搞不清楚数组的本质,去看数据结构,这时你会发现自己线性代数太差;去讨论Java自带的排序算法和你自己编写的算法,可能觉得自己对一个简单的函数都看不懂,设计复杂的函数就更不会了,去看计算方法吧,这时你可能会感到你的高等数学太差了;不理解>

5、学好外语,因为你会发现很多资料很多问题的答案很多调试错误的解释都是外文的,这时google是最好的工具,但是你的英文要起码可以读懂人家说什么;还有研究Webservice,SOA之类的东西,往往都是英文的。

学好我说的这些,大约需要3年,但是学好JAVA,达到语言层面,只需要1周,达到内部,需要半年,达到会设计,需要做3个以前项目,达到架构师,估计得2到3年,同时那些基础中的基础,你更需要好好学,那些是最慢的。

学到语言层面只需要两样东西:玩会IDE拿一本包含我所说的那些基本语法的书。玩会IDE你要做到会简单配置,能运行出东西,会调试(不会调试就没法编程),然后拿本JDKAPI,打开google和百度,有了错误就去搜索,这样学习Java真的很简单。

Linux也是要先会玩,要能上网,会下载东西,安装软件,写文档,然后就是能听歌看**,就够了。接下来在编程,关键要会shell那些命令。看看多用户 *** 作系统的书,建立一个理论高度,就OK了

最后说一句,中国大多数程序都停留在语言层面,很多人都是在懵懂中编程,可能调不通程序,突然改了个东西就通了,但是深层原因并不知道,很多都是东试西试试验出来的,都是黑箱编程,总感觉隔着雾看程序,我身边很多人写了一万行代码,还不理解equals和==的区别呢,还不知道Classobject=newClass()等号左右两边各代表什么呢。但是他们一样能编程,一样能开发出系统,很多人都以为这样就算Java高手了,什么都能编并不等于编的好,当然什么都能编是个前提。所以要学,就学深入,起码一种语言要学深,在web开发方面,我推荐java学深,或者说沿着java路学深,这样去研究C#,Net平台就很容易,再看ASP和PHP就觉得大家都一样了,上升到高度不过也就是设计模式的问题了,殊途同归。

1 在jakarta-tomcat-559\conf\Catalina\localhost目录下拷贝一个managerxml文件,在另一个盘中修改成(工程名xml)如:myjndixml文件:

2 把myjndixml文件的内容修改

<Context docBase="F:\myjndi\WebRoot"

privileged="true" antiResourceLocking="false" antiJARLocking="false">

<!-- Link to the user database we will get roles from -->

<ResourceLink name="users" global="UserDatabase"

type="orgapachecatalinaUserDatabase"/>

<Resource name="jdbc/pubs"

auth="Container"

type="javaxsqlDataSource"

driverClassName="commicrosoftjdbcsqlserverSQLServerDrive" url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs"

username="sa"

password=""

maxActive="20"

maxIdle="10"

maxWait="10000"/>

</Context>

3.然后在webxml文件中添加以下内容:

<resource-ref>

<res-ref-name>jdbc/pubs</res-ref-name>

<res-type>javaxsqlDataSource</res-type>

<res-auth>Container</res-auth>

</resource-ref>

4.如何获取Connection对象具体代码如下:

package comjwdb;

import javasqlConnection;

import javasqlDriverManager;

import javaxnaming;

import javaxsqlDataSource;

publicclass Dbmanager {

private Connection con;

private Context ctx;

public Connection getcon() {

try {

ctx = new InitialContext();

DataSource ds = (DataSource) ctxlookup("java:comp/env/jdbc/pubs");

con = dsgetConnection();

returncon;

} catch (Exception e) {

// TODO Auto-generated catch block

eprintStackTrace();

returnnull;

}

}

}

代码:

/

获取数据库连接方法

/

public Connection getConn() throws

Exception {

Connection conn = null;

try {

//connection原始的连接方式可以转换为OracleConnection

Connection con =

thiscommonDaogetCurrentConnection();

Connection conWas = null;

if(thiswasConnection){//使用tomcat请把biz-context-financexml中的wasConnection的值设置为false

注释掉biz-context-corexml中的id="websphereForOracleConnection"内容

WebSphereNativeJdbcExtractor websphereForOracleConnection =

(WebSphereNativeJdbcExtractor)SpringUtilsgetSpringBean("websphereForOracleConnection");

conWas = websphereForOracleConnectiongetNativeConnection(con);

}else{

conWas = con;

}

conWassetAutoCommit(false);

conn =

conWasgetMetaData()getConnection();

} catch (DaoException e) {

eprintStackTrace();

}

return conn;

}

<Resource name="jdbc/oa" auth="Container" type="javaxsqlDataSource"/>

<ResourceParams name="jdbc/oa">

<parameter>

<name>factory</name>

<value>orgapachecommonsdbcpBasicDataSourceFactory</value>

</parameter>

<parameter>

<name>username</name>

<value>abc</value>

</parameter>

<parameter>

<name>password</name>

<value>xyz</value>

</parameter>

<parameter>

<name>driverClassName</name>

<value>oraclejdbcOracleDriver</value>

</parameter>

<parameter>

<name>url</name>

<value>jdbc:oracle:thin:@127001:1521:orcl10</value>

</parameter>

</ResourceParams>

采用JNDI。

采用JNDI的方式获取配置在tomcat里conf下contentxml。

Tomcat是Apache软件基金会(ApacheSoftwareFoundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。

以上就是关于如何在EJB3中JNDI调用SessionBean全部的内容,包括:如何在EJB3中JNDI调用SessionBean、如何配置db2kettle的jndi、kafkak配置仅允许受信任的JNDI连接如何配置等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9675019.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存