记录使用Shark的API方式开发中遇到的问题和技巧,不定时更新
转载请注明出处(Cooper的专栏 http://blog.youkuaiyun.com/cooper_lyt)
- Shark的Demo:SharkJSPClient
这是Shark安装后自带的一个JSP的DEMO,不过要想运行起这个DEMO来要费点周章,Shark1.1的运行起来很方便,什么都不用动直接copy到tomcat目录中就可以使用了。但是Shark2就不是这样了,由于使用了JOTM,而它的demo的配置好像也不用来配到Tomcat中去的,所以要改到一些地方。改动方法可参见这篇文章:http://blog.youkuaiyun.com/JavaWHB/archive/2008/04/07/2257568.aspx
写的很好。照着做就行了(注意项目部署的物理路径最好不要有空格,我第一次部署就没有成功,后来重装的tomcat并把tomcat路径重设到了没有空格和特殊字符的目录后就没问题了)。如果有时间我会把我修改完的找地方上传一下供大家参考。
- 更改Shark使用的数据库
shark默认使用的数据库是HypersonicSQL,是文件型的数据库,这当然不行,shark支持几乎所有的主流关系型数据库(shark2.0还支持MSSQL2005)只要改一下配置,shark就会自动为你选择的数据库中生成工作流库,并把一些配置文件改为你所选择的数据库,也就是说如果你还使用hibernate的话那么选择什么库数据对程序来说是透明的,在项目开发完成后你可改任务更改你所选择的数据库而不用更改一句代码。
更改shark所使用的数据库的方法如下(shark1.1和shark2是一样的,只是shark1.1不支持msql2005):
1.准备你所使用的数据库驱动,并在你的数据库中建立名为“shark"的库。
2.修改你shark安装目录下的configure.properties文件
我选用的是MSSQL数据库,使用其它数据库根据你所选库设置(下面只列我更改的地方)
# database vendor, pick one of:
# db2, hsql, informix, msql, msql2005, mysql, oracle, postgresql, sybase
#可选项就在上面的注释中
db_loader_job=msql
......
# directory containing JDBC driver jar/zip files
#填入你放数据库驱动的路径,例如我的被我放到了shark的lib目录中去了,注意"/"而不是"/".
db_ext_dirs=C:/tws22/lib
......
# MSQL
msql_JdbcDriver=com.microsoft.jdbc.sqlserver.SQLServerDriver
#注意shark2.0配置文件中竞然把MSSQL的数据库驱动类的名子写错了注意修改
msql_Connection_Url=jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=shark;SelectMethod=cursor
msql_user=sa
msql_passwd=null
3.运行configure.bat .剩下的就是等待了。
Shark的Demo:SharkJSPClient
做完上述步骤后Shark会把你的JSPClient中的demo也重新按你的配置修改好并重新打包了,把Shark安装目录下的JSPClient中的sharkworklisthandler.war 拷到tomcat的项目目录 但还是不能直接运行的,还需要改到一下配置才能运行,shark1.1的比较方便,好像连DEMO中的那个shark.conf的配置也自动改了(有点记不清楚了),如果没改的话只要到Shark.conf中改动一下数据库驱动类名、数据库url、数据库用户名和密码就可以了,shark2.0就不这么方便了,因为使用了jotm所以要改动的地方比较多,
一开始我是按照上面我提到的文章中(只提到了oracler的配置方式)的方法改的,但是没有成功,报错如下javax.naming.NameNotFoundException
at org.objectweb.carol.jndi.enc.java.CompNamingContext.lookupCtx(CompNamingContext.java:689)...
后来我仔细研究了shark里面自带的jotm发现它使用用的是jotm自带的命名服务,设置如下:
carol.start.jndi=true
.......
carol.jndi.java.naming.factory.url.pkgs=org.objectweb.carol.jndi.enc
但是用这种方式我用自已的代码在命名服务器中都查找不到定义的数据源,所以我自已写了一份JOTM的配置放到了项的了CLASSPATH中去使用TOMCAT的命名服务,并修改了Shark配置中的命名按照tomcat的命名规则进行了修改。
另外我还重新编译了JOTM的carol库,因为这个库在jdk5.0以上的版本中使用会出现问题,从它配置文件的说明中可以看出,说明引用如下:
# IP address or network mask of the local network interface to use to send
# multicast messages
# Needed only when the server has several network interfaces and the multicast
# messages do not go through to interface you want them to use
# Works only on JDK 1.4
#carol.cmi.multicast.itf 192.168.25.0/24
具本的请参见我关于JOTM的文章。(http://blog.youkuaiyun.com/Cooper_Lyt/archive/2008/10/06/3022772.aspx) JTA 部分:使用JOTM
下面列出我主要修改的地方
context.xml:
-
- <?xml version='1.0' encoding='utf-8'?>
- <Context >
- <Resource name="sharkdb" auth="Container"
- type="javax.sql.DataSource"
- factory="org.objectweb.jndi.DataSourceFactory" maxWait="5000"
- maxActive="300" maxIdle="2" username="sa" password="null"
- driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"
- url="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=shark;SelectMethod=cursor" />
- <Transaction factory="org.objectweb.jotm.UserTransactionFactory"
- jotm.timeout="180" />
- </Context>
SharkJSPClient.conf:
XaUserTransactionLookupName=java:comp/UserTransaction
DatabaseManager.defaults.XATransactionManagerLookupName=java:comp/UserTransaction
DatabaseManager.DB.sharkdb.Connection.DataSourceName="java:comp/env/sharkdb"
SharkTxSynchronizationFactory.XATransactionManagerLookupName=java:comp/UserTransaction
carol.properties(这个太长只列我修改的部分):
carol.protocols.default=jrmp
# start or not all non started name services
carol.start.ns=false
# use carol rmi (Multi PRODelegate)
carol.start.rmi=true
# use carol naming (Multi JNDI)
carol.start.jndi=false
# local call optimization for jrmp
carol.jvm.rmi.local.call=true
......
carol.jndi.java.naming.factory.url.pkgs=org.apache.naming
各部分修改的意义请自已查阅JOTM相关资料