11. Lắng Nghe Sự Kiện Trên Repository (Observation)
11.1 Phát sinh sự kiện
Một sự kiện được phát sinh hay được kích hoạt (Fired) khi có sự thay đổi xảy ra và sự thay đổi này được cập nhật lên Repository. Cũng cần nhắc lại là có những thay
đổi chỉ xảy ra tạm thời và những thay đổi tạm thời này chỉ được cập nhật thực sự lên Repository khi gọi đến phương thức save của đối tượng thay đổi tạm thời.
Phát triển CMS module cho hệ thống Intranet cuả Công ty TMA
Sự kiện sẽ không được phát sinh khi những thay đổi tạm thời xảy ra mà chữa
được lưu xuống Repository. Đối với những phương thức mà khi thực hiện phương thức
đó, nội dung của Repository bị thay đổi ngay lập tức (chẳng hạn những phương thức Workspace.copy hay Workspace.move) thì sự kiện sẽ được tạo ra. Thông tin về sự kiện được phát sinh có thể tìm thấy thông qua các phương thức được khai báo trong giao diện javax.jcr.observation.Event.
11.2 Các loại sự kiện
Mỗi loại sự kiện phát sinh có một giá trị kiểu long đại diện và các giá trị này là các hằng sốđược định nghĩa trước trong giao diện javax.jcr.observation.EventType
javax.jcr.observation.EventType long ITEM_ADDED long ITEM_CHANGED long ITEM_REMOVED long ITEM_VERSIONED long ITEM_RESTORED long LABEL_ADDED long LABEL_REMOVED long ITEM_LOCKED long ITEM_UNLOCKED long LOCK_EXPIRED
Phát triển CMS module cho hệ thống Intranet cuả Công ty TMA
Các loại sự kiện này có thể phân thành các nhóm sau
• Nhóm sự kiện liên quan đến những thay đổi trên các Item của
Repository, bao gồm: ITEM_ADDED, ITEM_REMOVED,
ITEM_CHANGED.
• Nhóm sự kiện liên quan đến việc quản lý phiên bản trên Repository, bao
gồm: ITEM_VERSIONED, ITEM_RESTORED, LABEL_ADDED,
LABEL_REMOVED.
• Nhóm sự kiện liên quan đến việc quản lý khoá (Locking) trên Repository, bao gồm: ITEM_LOCKED, ITEM_UNLOCKED, LOCK_EXPIRED .
11.3 Đối tượng lắng nghe và xử lý sự kiện
Để có thể xử lý các sự kiện xảy ra trên Repository, ứng dụng cần phải đăng ký với Repository đối tượng dùng để lắng nghe sự kiện trên Repository. Các đối tượng lắng nghe sự kiện này phải hiện thực hóa giao diện EventListener hay giao diện VetoableEventListener.
javax.jcr.observation.EventListener
void onEvent(Event event)
Phương thức này được gọi khi sự kiện xảy ra.
javax.jcr.observation.VetoableEventListener
void onEvent(Event event)
Phát triển CMS module cho hệ thống Intranet cuả Công ty TMA
Đối tượng EventListener được thông báo sự kiện xảy ra trên Repository một cách bất đồng bộ (asynchoronous). Điều đó có nghĩa là khi sự kiện xảy ra trong một giao tác (transaction) và chỉ đến khi giao tác được ủy nhiệm thì đối tượng EventListener mới được thông báo sự kiện xảy ra.
Đối tượng VetoableEventListener được thông báo sự kiện xảy ra trên Repository một cách đồng bộ (synchoronous). Điều đó có nghĩa là khi sự kiện xảy ra trong một giao tác (transaction) thì ngay lập tức sự kiện này sẽđược thông báo đến cho
đối tượng VetoableEventListener mà không cần phải đợi đến lúc submit giao tác. Nếu sự kiện đã được đăng ký bởi đối tượng VetoableEventListener với Repository (có nghĩa là ứng dụng không muốn sự kiện đó xảy ra trên Repository khi ứng dụng thực hiện) và trong một giao tác, sự kiện này lại xảy ra thì khi thực hiện phương thức save
để cập nhật dữ liệu xuống Repository sẽ phát sinh lỗi ActionVetoedException và khi
đó giao tác này sẽđược RollBack.
11.4 Lựa chọn sự kiện để lắng nghe
Để giảm số lượng sự kiện mà một đối tượng nhận sự kiện phải lắng nghe trên Reporitory, khi đăng ký đối tượng nhận sự kiện với Reporitory, Ta có thể tạo thêm một
đối tượng dùng để lựa chọn chỉ lắng nghe và xử lý những sự kiện nào thực sự cần thiết cho ứng dụng đang xây dựng. Đối tượng này phải hiện thực hóa giao diện EventSelector.
11.5 Các sự kiện xảy ra đối với một hành động trên Repository
11.5.1 Hành động thêm một Item
Khi một Node hay một Property mới được thêm vào Repository thì các sự kiện sau sẽ xảy ra:
Phát triển CMS module cho hệ thống Intranet cuả Công ty TMA
• Sự kiện ChangeEvent tương ứng với Item mới được thêm vào. Trong đó
getType() trả về EventType.ITEM_ADDED
getItem() trả về Item vừa được thêm vào
getOldItem() trả về giá trị null
• Sự kiện ChangeEvent tương ứng với Node cha. Trong đó
getType() trả về EventType.ITEM_CHANGED
getItem() trả về Node cha của Item mới được thêm vào
getOldItem() trả về bản sao của Node cha trước khi thêm Item