Annotations | Lazy | Fetch |
---|---|---|
@[One|Many]ToOne](fetch=FetchType.LAZY) | @LazyToOne(PROXY) | @Fetch(SELECT) |
@[One|Many]ToOne](fetch=FetchType.EAGER) | @LazyToOne(FALSE) | @Fetch(JOIN) |
@ManyTo[One|Many](fetch=FetchType.LAZY) | @LazyCollection(TRUE) | @Fetch(SELECT) |
@ManyTo[One|Many](fetch=FetchType.EAGER) | @LazyCollection(FALSE) | @Fetch(JOIN) |
~存的注释写法如下,加在Entity的javacMQ?br />
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
~存的方式有四种Q分别ؓQ?/p>
此关键字让规则引擎知道,myGlobalList对象应该可以从规则中讉K.ruleQ定义了一个规?br />常用的属性:
rule "<name>"
<attribute>*
when
<conditional element>*
then
<action>*
end
<name> 即rule的名字标?br />
<attribute>:
lock-on-activeQtrue 可以看作是no-loop的加强版Q当条gl果更改后,不但修改此条件的规则不会重新执行Q文件中的Q何规则(?active-lock 属性被设ؓtrue
Q不会重新执行?/pre>salience
Q?00 使用它可以让规则执行引擎知道应该启动规则的结果语句的序。具有最高显著值的规则的结果语句首先执行;hW二高显著值的规则的结果语句第二执行,依此cL。当您需要让规则按预定义序启动Ӟq一炚w帔R要?br />
其他属性的解释误http://downloads.jboss.com/drools/docs/5.1.1.34858.FINAL/drools-expert/html_single/index.html#d0e2607
when:填写条g的地方,比如Q?br />Cheese( type == "stilton", price < 10, age == "mature" )?br />then:业务规则的地方,略?br />
Cheese( type == "stilton" && price < 10, age == "mature" )
2.用法
规则文g定义好后Q就该是怎么使用它了
如上图,file rule定义好后Q就该是如何使用它了。最重要的两个类RuleBase和WorkingMemory
下面是一个example:
public class RulesEngine {
private RuleBase rules;
private boolean debug = false;
public RulesEngine(String rulesFile) throws RulesEngineException {
super();
try {
// Read in the rules source file
Reader source = new InputStreamReader(RulesEngine.class
.getResourceAsStream("../../rules/" + rulesFile));
// Use package builder to build up a rule package
PackageBuilder builder = new PackageBuilder();
// This will parse and compile in one step
builder.addPackageFromDrl(source);
// Get the compiled package
Package pkg = builder.getPackage();
// Add the package to a rulebase (deploy the rule package).
rules = RuleBaseFactory.newRuleBase();
rules.addPackage(pkg);
} catch (Exception e) {
throw new RulesEngineException(
"Could not load/compile rules file: " + rulesFile, e);
}
}
public RulesEngine(String rulesFile, boolean debug)
throws RulesEngineException {
this(rulesFile);
this.debug = debug;
}
public void executeRules(WorkingEnvironmentCallback callback) {
WorkingMemory workingMemory = rules.newStatefulSession();
if (debug) {
workingMemory
.addEventListener(new DebugWorkingMemoryEventListener());
}
callback.initEnvironment(workingMemory);
workingMemory.fireAllRules();
}
}
RulesEngine构造方法演CZ如何去读入一个rule文g,q构Z一个RuleBase对象(RuleBase 是一个包含了rule文g的所有规则的集合)
executeRulesҎ定义了如何用规则文件中定义的那些内容,用RuleBase构徏一个WorkingMemory对象Q再执行fireAllRules()Ҏ?br /> WorkingMemory 代表了与rulebase链接的session会话Q也可以看作是工作内存空间。如果你要向内存中插入一个对象可以调用insert()Ҏ,同理Q更C个对象用update()Ҏ。WorkingMemoryq有一个setGlobal()ҎQ用来设|规则内可以引用的对?相当于规则的全局变量)?br />
3.技?/strong>
可以一ơ把所有的rule文g都蝲入内存中存放Q这样就不用每次执行都读取文件?br /> 如果规则文g被修改,也可以用q一个方法来判断是否需要重新蝲入rule文g
比如Q根据文件的最后修Ҏ_与内存中对应对象的时间做比较
public boolean hasChange(List<RuleFile> ruleFileList){
for(RuleFile ruleFile:ruleFileList){
if(!ruleFile.getLastModifyTime().equals(ruleFileMap.get(ruleFile.getFileName()).getLastModifyTime())){
return true;
}
}
return false;
}
注:具体的helloWorld 误http://www.ibm.com/developerworks/cn/java/j-drools/#listing12Q比我说得好多了?br />
]]>
写在前面的话Qspring的监听事件模型应该是观察者模式。本人项目里的应用在processҎ按日期同步某个库的数据,在方法最后publish一个event事gQ这个事件用于后l同步过来的数据处理。事件处理采用了spring的监听模?q样可以做到processҎ与event可以异步分离执行。(注:q个事g模型~省使用SyncTaskExecutor来执行listener的注册eventQ所有该listener注册的event事g?/span>同步执行的)?/p>
当然Qspring的这个机制还有很多应用的场景Q就不一一列D了?/p>
ApplicationEvent
事g抽象c,里面只有一个构造函数和一个timestamp?/p>
ApplicationListener
监听接口Q里面只有一个onApplicationEventҎ。需要用戯q写ApplicationListener的实现?/p>
ApplicationContext
spring上下?其publishEventҎ用于通知监听?ApplicationListener的实?注册event旉.
void publishEvent(ApplicationEvent event)
Notify all listeners registered with this application of an application event.
源码解读Q?br />
1.作ؓApplicationContext的实现AbstractApplicationContext.java的成员变?a name="181">applicationListenersQ是一个ArrayList,保存了所有的ApplicationListener
2.利用ApplicationEventMulticaster接口里的Ҏ来完成注册监?a class="r">addApplicationListener,U除监听removeApplicationListenerQ?/a>removeAllListenersQ以及通知监听注册事geventQ?/a>multicastEvent(ApplicationEvent event);
上面说到的publishEventҎ即用了multicastEventҎ
SimpleApplicationEventMultucaster作ؓApplicationEventMulticaster的一个实玎ͼ提供了multicastEvent的实C码,其实是q代所有的监听器,用SyncTaskExecutor同步执行listener的onApplicationEvent
public void multicastEvent(final ApplicationEvent event) {
for (Iterator it = getApplicationListeners().iterator(); it
final ApplicationListener listener = (ApplicationListener) it
getTaskExecutor().execute(new Runnable() {
listener.onApplicationEvent(event);
}
});
}
3.注意事项Q自q写ApplicationListener的实现时Q要注意不同的监听器处理不同的事Ӟ复写onApplicationEventQ。原因就?a name="181">multicastEvent的执行原理。它是P代执行所有的监听?/a>onApplicationEvent
q里?/a>ApplicationEventMulticaster的类分布?/a>
abstract public class AbstractApplicationEventMulticaster implements ApplicationEventMulticaster(Code)(Java Doc)
public interface ApplicationEventMulticaster (Code)(Java Doc)
public class SimpleApplicationEventMulticaster extends
q里是ApplicationContext的类分布?br />
public class DefaultResourceLoader implements ResourceLoader(Code)(Java Doc)
public interface ResourceLoader (Code)(Java Doc)
abstract public class AbstractApplicationContext extends
DefaultResourceLoader implements
ConfigurableApplicationContext,DisposableBean(Code)(Java Doc)
public interface ConfigurableApplicationContext extends ApplicationContext,Lifecycle(Code)(Java Doc)
public interface DisposableBean (Code)(Java Doc)
public class GenericApplicationContext extends AbstractApplicationContext implements BeanDefinitionRegistry(Code)(Java Doc)
public interface BeanDefinitionRegistry (Code)(Java Doc)
abstract public class AbstractRefreshableApplicationContext extends
下面是spring自n的事件应?br />
1) ContextRefreshedEventQ当ApplicationContext初始化或者刷新时触发该事件?br />
2) ContextClosedEventQ当ApplicationContext被关闭时触发该事件。容器被关闭Ӟ其管理的所有单例Bean都被销毁?br />
3) RequestHandleEventQ在Web应用中,当一个httphQrequestQ结束触发该事g?br />
4) ContestStartedEventQ当容器调用ConfigurableApplicationContext的Start()Ҏ开?重新开始容器时触发该事件?br />
5) ContestStopedEventQ当容器调用ConfigurableApplicationContext的Stop()Ҏ停止容器时触发该事g?
1.实体map.xml中配|?
主键获取方式配置,mysql
<selectKey resultClass="java.lang.Integer" keyProperty="id">
select LAST_INSERT_ID()
</selectKey>
动态拼接where条g
<dynamic prepend="where">
<isNotNull>
plateId=#value#
</isNotNull>
</dynamic>
2.config配置
typeAlias 定义cd别名
<typeAlias alias="Item" type="com.tudou.tudoupromotion.entity.Item"/>
typeHandler 自定义类型{?br />
比如Q将数据库中?Q?Q?格式的数据{换ؓjava 枚D
<typeHandler
javaType="com.tudou.tudoupromotion.entity.Plate"
callback="com.tudou.tudoupromotion.ext.ibatis.PlateHandler"/>
U程~存{配|?/p>
<settings
cacheModelsEnabled="true"
enhancementEnabled="true"
lazyLoadingEnabled="false"
maxRequests="32"
maxSessions="10"
maxTransactions="5"
useStatementNamespaces="true"
/>
cacheModelsEnabled="true" 是否启动~存机制
enhancementEnabled="true" 是否针对POJO启动字节码增强机制以提升getter/setter的调用效能避免用javaReflect所带来的性能开销。同时Lazy Loading带来极大的性能提升?br />
maxRequests最大ƈ发请求数(Statement?
maxTransactions最大ƈ发事务数
maxSessions最大Session敎ͼ卛_前最大允许的q发SqlMapCliect数maxSessions讑֮必须界于
maxTransactions和maxRequests之间.?nbsp;
maxTransactions>maxSessions>maxRequests
先下载couchdb安装文gQ版本ؓ0.9.1
http://couchdb.apache.org/downloads.html
1开始安装依赖包
sudo apt-get build-dep couchdb
sudo apt-get install libmozjs-dev libicu-dev libcurl4-gnutls-dev libtool
2.解压~?/p>
tar -zxvf apache-couchdb-0.9.1.tar.gz
3.开始安?/p>
cd apache-couchdb-0.9.1
./configure
make
sudo make install
4.启动couchdb
sudo couchdb
5.讉K:http://127.0.0.1:5984/_utils/
启动报错Q?/p>
$ bin/couchdb
Apache CouchDB 0.9.0a691361-incubating (LogLevel=info) is starting.
{"init terminating in do_boot",{{badmatch,{error,shutdown}},[{couch_server_sup,start_server,1},
{erl_eval,do_apply,5},{erl_eval,exprs,5},{init,start_it,1},{init,start_em,1}]}}
Crash dump was written to: erl_crash.dump
init terminating in do_boot ()
查了一下官方wiki:
原来是安装文件夹的权限问?br />
解决办法Q?br />
sudo adduser couchdb
chown -R couchdb:couchdb /usr/local/etc/couchdb
chown -R couchdb:couchdb /usr/local/var/lib/couchdb
chown -R couchdb:couchdb /usr/local/var/log/couchdb
chown -R couchdb:couchdb /usr/local/var/run
chmod -R 0770 /usr/local/etc/couchdb
chmod -R 0770 /usr/local/var/lib/couchdb
chmod -R 0770 /usr/local/var/log/couchdb
chmod -R 0770 /usr/local/var/run
再此启动Q看到欢q界面,所有的testsuite run success,大功告成Q?/pre>
文章来源:http://guming.blogbus.com/logs/45898514.html
]]>