Configuration
通过类ch.ralscha.extdirectspring.controller.Configuration可以方便的微调ExtDirectSpring。
RemotingProvider Configuration
可以通过三个属性timeout, maxRetries and enableBuffer配置RemotingProvider。
如果指定了这些参数,这些参数将会成为api.js的一部分。
上面配置调用api-debug.js的输出例子如下。
Ext.app.REMOTING_API = {
"url" : "/controller/router",
"type" : "remoting",
"actions" : {
"treeProvider" : [ {
"name" : "getTree",
"len" : 1
} ]
},
"timeout" : 12000,
"maxRetries" : 10,
"enableBuffer" : false
};
如果没有特殊配置api.js将不会包含这些属性。RemotingProvider将会用默认的配置:timeout=30000, maxRetries=1和enableBuffer=10
providerType (since 1.2.2)
可以全局设置Configuration.providerType属性。Extjs使用这个值找到对应的Provider"类"(第一个字母大写,加“Provider”)默认值是'remoting',并在Ext JS中创建一个Ext.direct.RemotingProvider的。
如下创建了Ext.direct.SampleProvider,并在Ext Direct调用。
输出api-debug.js如下:
Ext.app.REMOTING_API = {
"url" : "/demo/router",
"type" : "sample",
"actions" : {
...
} ]
}
};
synchronizeOnSession会话同步
默认为false。将此属性设置为true,将会一个同步块中调用一个@ ExtDirectMethod。这是非常有用的,当服务器的方法需要操纵会话对象。
除了全局开启此功能,每一个方法都可以单独指定synchronizeOnSession在@ExtDirectMethod注解。
@ExtDirectMethod(value = ExtDirectMethodType.STORE_MODIFY, synchronizeOnSession=true)
public List create(List newUsers) {
//...
}
FORM_POST方法不支持这个功能,如果你按老的格式写ExtDirect方法,如果你按新的1.2.1的格式支持。
streamResponse (since 1.1.0)
这个特性需要特殊指出的是 Jackson ObjectMapper应该像1.0.x的版本那样直接将返回写到http servlet response并且不设置http header Content-Length (**true**)。如果设置为false(默认值)ObjectMapper 先写返回到内部buffer,设置Content-Length header ,然后将要返回响应写道http servlet response。
除了可以全局开启这个功能设置,每个方法可以独立设置streamResponse属性在注释@ExtDirectMethod
Content-Type for api.js (since 1.2.1)
默认请求 api.js和api-debug.js的返回的Content-Type是"application/javascript"。这个值可以改变通过设置 jsContentType。
或用JavaConfig
@Bean
public ch.ralscha.extdirectspring.controller.Configuration configuration() {
ch.ralscha.extdirectspring.controller.Configuration config = new ch.ralscha.extdirectspring.controller.Configuration();
config.setJsContentType("application/x-javascript")
return config;
}
Error Messages
没有特殊配置,服务器发生异常,返回到客户端消息包含message“Server Error”和type“exception”。
[
{
"method": "method4",
"action": "remoteProviderSimple",
"tid": 2,
"message": "Server Error",
"type": "exception"
}
]
调整返回的消息需要增加一个bean id为“extDirectSpringConfiguration”和class为“ch.ralscha.extdirectspring.controller.Configuration”到spring上下文。
defaultExceptionMessage | Defines the default exception message. Field *message* in the response | Default: 'Server Error' |
sendExceptionMessage | If true sends exception.getMessage() back. Field *message* in the response | Default: false |
sendStacktrace | If true sends the whole stacktrace in the field *where* back | Default: false |
exceptionToMessage | Mapping from exception class (key) to message (value) | Default: empty |
消息返回规则:
1.如果有对应的exception在exceptionToMessage并且值不是null返回此值。
2.如果有对应的exception在exceptionToMessage并且值是null返回exception.getMessage()。
3.如果没有对应的exception在exceptionToMessage,并且sendExceptionMessage是true,返回exception.getMessage()。
4.如果没有对应的exception在exceptionToMessage,并且sendExceptionMessage是false,返回defaultExceptionMessage。
Concurrent execution of batched method calls 并发执行批处理方法调用
如果该功能被禁用(默认),在请求处理线程上一个一个执行批处理方法。这可能是一个问题,如果一个方法执行很长时间,后面的方法将会一直处于等待状态。
通过启用此功能可以解决这个问题,它可以并发执行方法。要启用它,设置并发batchedMethodsExecutionPolicy,与batchedMethodsExecutorService指定一个线程池。如果没有指定线程池,默认创建有5个线程(Executors.newFixedThreadPool(5))的线程池。
JavaConfig
@Bean
public ThreadPoolExecutorFactoryBean threadPoolExecutorFactoryBean() {
ThreadPoolExecutorFactoryBean factory = new ThreadPoolExecutorFactoryBean();
factory.setCorePoolSize(50);
factory.setMaxPoolSize(200);
factory.setQueueCapacity(5000);
return factory;
}
@Bean
public ch.ralscha.extdirectspring.controller.Configuration configuration() throws Exception {
ch.ralscha.extdirectspring.controller.Configuration config = new ch.ralscha.extdirectspring.controller.Configuration();
config.setBatchedMethodsExecutionPolicy(BatchedMethodsExecutionPolicy.CONCURRENT);
config.setBatchedMethodsExecutorService(threadPoolExecutorFactoryBean().getObject());
return config;
}
请注意,启用此功能会降低性能,在某些情况下,由于线程处理开销。没有做任何性能测试情况下不要启用此功能。如果启用此功能,客户端只有一个方法调用类库执行方法在请求处理线程,并且没有线程池。在那种情况下没有线程处理性能损失。
备注:Extjs不能批量调用表单post方法,因此对哪类方法没有批量调用支持。
Spring Security
如果你用Spring Security和并发方法执行,你必须添加下面的代码在某些地方,保证在程序启动时执行。
SecurityContextHolder.setStrategyName("MODE_INHERITABLETHREADLOCAL");