1 つの ejb と 1 つの war モジュール、および dao やサービスなどの他のローカル jar 依存関係で構成される ear があります。
プロジェクトを github https://github.com/SunPj/spring-load-time-weavingに配置しました
バネ負荷時織りを使用しています。私のdaoアプリケーションコンテキストは次の行で構成されています
<tx:annotation-driven mode="aspectj"/>
<context:load-time-weaver aspectj-weaving="on"/>
私のキャッシュコンテキストは<cache:annotation-driven mode="aspectj"/>
私の Web モジュールにはコントローラーがあります
package ru.test.web;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import ru.test.service.TestService;
import java.util.Map;
@Controller
public class TestController {
@Autowired
TestService testService;
@RequestMapping("/userlist")
public String userList(Map<String, Object> model) {
String st = ArrayUtils.toString(testService.getUsers());
model.put("text", st);
return "main";
}
@RequestMapping("/remove-user")
public String removeUser(@RequestParam("userId") int userId, Map<String, Object> model) {
testService.removeUser(userId);
model.put("text", "Removed userid = "+userId);
return "main";
}
@RequestMapping("/remove-user-ex")
public String removeUserEx(@RequestParam("userId") int userId, Map<String, Object> model) {
try {
testService.removeUserWithException(userId);
} catch (RuntimeException e){
model.put("text", "Exception = "+e.getMessage());
}
return "main";
}
@RequestMapping("/random")
public String random(Map<String, Object> model) {
String s = new String();
for (int i = 0; i< 100; i++){
s = s + +testService.getRandom()+", ";
}
model.put("text", "Random = "+s);
return "main";
}
@RequestMapping({"/", "/home"})
public String index(Map<String, Object> model) {
model.put("text", "Home page!");
return "main";
}
@RequestMapping("/user-cache-evict")
public String userCacheEvict(Map<String, Object> model) {
testService.userCacheEvict();
model.put("text", "user cache evicted!");
return "main";
}
@RequestMapping("/data-cache-evict")
public String dataCacheEvict(Map<String, Object> model) {
testService.dataCacheEvict();
model.put("text", "data cache evicted!");
return "main";
}
}
サービスは次のようになります
@Service
@Transactional
public class TestServiceImpl implements TestService {
@Autowired
private TestDao testDao;
@Override
public String getUsers() {
return testDao.showUsers() + "( real count = "+testDao.getRealUsersCount()+")";
}
@Override
public void removeUser(int userId) {
testDao.removeUser(userId);
}
@Override
public void removeUserWithException(int userId) {
testDao.removeUser(userId);
throw new RuntimeException("ololo");
}
@Override
public int getRandom() {
return testDao.getRandom();
}
@Override
public void userCacheEvict() {
testDao.userCacheEvict();
}
@Override
public void dataCacheEvict() {
testDao.dataCacheEvict();
}
@Override
public int showUsers() {
return 1;
}
}
ダオ
@Repository
public class TestDaoImpl extends AbstractDao implements TestDao {
@Override
public void removeUser(int id) {
getJdbcTemplate().execute("DELETE FROM TABLE1 WHERE id = " + id);
}
@Override
public String showUsers() {
String users = ArrayUtils.toString(getJdbcTemplate().queryForList("SELECT name FROM TABLE1", String.class));
return users + ":" + getCachedUsersCount();
}
@Override
@Cacheable(value = "User")
public int getCachedUsersCount(){
int cnt = getJdbcTemplate().queryForInt("SELECT count(*)name FROM TABLE1");
return cnt;
}
@Override
public int getRealUsersCount(){
int cnt = getJdbcTemplate().queryForInt("SELECT count(*)name FROM TABLE1");
return cnt;
}
@Override
@CacheEvict(value = "User", allEntries = true)
public void userCacheEvict(){
}
@Override
@CacheEvict(value = "PermanentData", allEntries = true)
public void dataCacheEvict(){
}
@Override
@Cacheable(value = "PermanentData")
public int getRandom() {
return new Random().nextInt();
}
}
ejb にはサービス依存関係がないため、すべて正常に動作します。サービスの依存関係を ejb モジュール (some-ejb の pom) に追加するとすぐに、トランザクションが停止しました。
github の最後の 2 つのコミット (commit 973f48a9e0db11edc3675fd09b6930f05b98afc9 および commit e7d280cb93b2303bfcfbd5cd0b55d24b002be8fc) は、動作している状況と動作していない状況の両方を示しています。