text:
Mở đầu
Thói quen ở nhiều nơi có các cửa hàng nhỏ là nắm được các khách hàng đã xếp hàng bằng cách gán cho họ các số thứ tự sát với thứ tự mà họ tới cửa hàng. Các số thứ tự này thường được in trên các mảnh giấy nhỏ và được phân phối từ một bộ phân phối cơ khí vật lý duy nhất. Nếu có nhiều khách hàng đến đồng thời, mối quan hệ này dễ dàng bị phá vỡ bởi phép xã giao và phép lịch sự thông thường.
Các vấn đề tương tự thường phát sinh trong các hệ thống phần mềm. Một hệ thống thường cần gán các số cho các việc nào đó với đảm bảo rằng các số đó là duy nhất và theo một số mô hình. Có một số giải pháp chung cho vấn đề này, nhưng các hệ thống phân phối làm phức tạp các vấn đề. Hầu như không chắc rằng bạn sẽ sử dụng một hệ thống ECM để gán các số cho các khách hàng tại một hiệu bánh ở góc phố. (Nhưng nếu bạn đã quan tâm về điều đó, tôi có thể nối bạn với một người bán hàng có thiện ý!) Tuy nhiên, bạn có thể cần gán các số theo trường hợp hoặc các số mã định danh (ID) khách hàng hoặc các số bộ phận hoặc một cái gì đó đơn giản hơn. Các nhà cung cấp cơ sở dữ liệu triển khai thực hiện các kiểu cột số thứ tự chỉ dùng cho loại vấn đề này. Tuy nhiên, P8 không cung cấp truy cập trực tiếp vào các kiểu số thứ tự cơ sở dữ liệu, vì vậy bạn phải sử dụng các cơ chế khác.
Trong bài này, chúng ta sẽ việc xem xét cách giải quyết vấn đề này trong một môi trường P8. Hãy tóm tắt các yêu cầu:
- Chúng ta cần gán các số được bảo đảm tuyệt đối là duy nhất. Hoàn toàn không chấp nhận gán hai lần với cùng một số.
- Chúng ta muốn các số đi theo một vài mô hình. Chúng ta không muốn có những cách quãng trong việc gán số. Mô hình có thể có nhiều thứ, nhưng với các mục đích của mình chúng ta sẽ chỉ sử dụng mô hình tăng dần đơn giản. Số tiếp theo mà chúng ta nhận được sẽ là một số lớn hơn số đứng trước.
- Chúng ta muốn tất cả điều này hoạt động tin cậy và có hiệu năng tốt trong một môi trường P8 có nhiều luồng, nhiều bộ xử lý, nhiều máy chủ, nhiều tầng và nhiều người dùng.
- Trong khi chúng ta đang ở đó, chúng ta cần khoảng một chục bánh nướng nhỏ màu đỏ trông rất ngon có lớp phủ kem pho mát!
Trước khi mô tả việc triển khai thực hiện ưa thích của mình, đầu tiên chúng ta sẽ xem xét một vài kỹ thuật hoặc không làm việc hoặc không làm việc rất tốt. Ngay cả khi bạn chưa bao giờ có nhu cầu triển khai thực hiện trường hợp sử dụng cụ thể này, hầu hết các điểm được minh họa trong bài này có thể áp dụng cho nhiều lĩnh vực lập trình P8.
Đồng bộ Java hay .NET
Nếu bạn là người mới đến với công việc phát triển doanh nghiệp hay phát
triển phân phối nói chung, bạn có thể nghĩ ngay đến việc sử dụng một đối
tượng đơn lẻ có một số kiểu truy cập đồng bộ hóa đến phần cập nhật bộ đếm.
Trong Java, đó sẽ là một phương thức
synchronized (đã đồng bộ) hoặc khối mã. Trong C#, sẽ là một
phương thức đánh dấu là đã đồng bộ hoặc một khối mã được bảo vệ bằng một
lock(). Các vùng mã có truy cập đồng bộ đôi
khi được gọi là các phần tới hạn. Liệt kê 1 cho thấy một trong nhiều cách
để thực hiện điều này.
Liệt kê 1. Khối mã đồng bộ
/** * *** DON'T DO IT THIS WAY *** */ public class Dispenser { /** static access only, so private constructor */ private Dispenser() {} private static int counter = 0; public static final synchronized int getNextValue() { return ++counter; } }
Việc sử dụng mã đồng bộ là tốt cho các vấn đề cụ thể, nhưng với trường hợp
sử dụng của chúng ta các nhược điểm là khá rõ. Vì giá trị của bộ đếm chỉ
tồn tại trong bộ nhớ của chương trình đang chạy, nên các giá trị này sẽ
bắt đầu lại khi chương trình được khởi động lại. Bạn có thể thay đổi lớp
Dispenser (Bộ phân phối) để lưu các giá trị đã
cập nhật vào một tệp, nhưng điều đó sẽ dẫn đến các vấn đề mới do không thể
phối hợp đồng bộ qua các ranh giới của quá trình. Các ứng dụng chạy độc
lập khác nhau (hoặc các bản sao của cùng một ứng dụng), ngay cả khi chúng
đang sử dụng lớp
Dispenser, có thể đã xen kẽ
đọc và viết vào tệp. Tệ hơn nữa, chúng có thể đang truy cập vào một tệp có
cùng tên trên các máy tính khác nhau. Cả hai tình huống đó đều dẫn đến các
điều kiện vi phạm các yêu cầu của trường hợp sử dụng của chúng ta.
Dưới đây là một ví dụ về những rắc rối có thể do các việc đọc và viết xen kẽ. Giả sử giá trị hiện tại được ghi trong tệp là 7 và sau đó các việc sau đây diễn ra:
- A đọc giá trị 7 từ tệp này.
- B đọc giá trị 7 từ tệp này.
- A viết giá trị 8 vào tệp này.
- C đọc giá trị 8 từ tệp này.
- C viết giá trị 9 vào tệp này.
- B viết giá trị 8 vào tệp này.
Lúc này, cả hai A và B có cùng một số mà họ tin là duy nhất với họ. Người đọc tệp tiếp theo sẽ kết thúc bằng một giá trị giống như C đã có. Bạn có thể có một vài ý tưởng về việc sử dụng khóa tệp hoặc các thủ thuật cụ thể của hệ điều hành khác để đồng bộ hóa truy cập vào một tệp trong một môi trường phân phối. Tuy nhiên, những khó khăn với kiểu giải pháp đó cũng khá dễ hiểu trong hầu hết ngành khoa học máy tính và quả là rất khó khăn để nhận diện chính xác nó, do đó, chúng ta không cần chỉ trích kịch bản này quá nhiều. Nếu bạn cần có sức thuyết phục hơn, hãy sử dụng máy tìm kiếm ưa thích của mình để nghiên cứu "vấn đề khóa NFS".
Đối tượng bộ phân phối P8
Một giải pháp phổ biến cho những vấn đề này là sử dụng một cơ sở dữ liệu để duy trì bộ phân phối. Các cơ sở dữ liệu quan hệ có sẵn cho doanh nghiệp vốn đã phân phối tài nguyên với ngữ nghĩa khóa tin cậy. Trong kiến trúc P8, các ứng dụng không thể truy cập trực tiếp vào các cơ sở dữ liệu phía sau. Nói cách khác, việc truy cập cơ sở dữ liệu phải được bố trí riêng cho các ứng dụng này, cho dù nó thông qua các nguồn dữ liệu J2EE, nhằm vào các kết nối JDBC, hoặc các phương tiện khác. Việc này có thể làm việc tốt trong một số kịch bản, nhưng nói chung thật là phiền toái để làm việc này chỉ để truy cập dữ liệu bộ phân phối.
Một điều mà chúng ta biết là tất cả các ứng dụng dựa vào P8 có quyền truy
cập đến ObjectStores và các đối tượng P8, phải chịu các sự kiểm tra truy
cập do P8 bắt buộc. Do đó chúng ta có thể mô hình hóa bộ phân phối như là
một đối tượng P8. Cụ thể, chúng ta có thể tạo ra một cá thể của một lớp
con của
CustomObject gọi là
WjcDispenser với một đặc tính tùy chỉnh số
nguyên được gọi là
WjcCounter. (Gắn cho các tên
tiền tố tùy ý "Wjc" này để tránh các xung đột với tên lớp và tên thuộc
tính khác). Hình 1 cho thấy một biểu đồ UML cho lớp con đơn giản này.
Hình 1. Biểu đồ
UML cho
WjcDispenser
Chúng ta giả định rằng truy cập an toàn đến đối tượng này có thể được bố trí thuận tiện cho tất cả người dùng của tất cả các ứng dụng cần sử dụng nó. Bây giờ, chúng ta sẽ giả định rằng bất cứ ai cũng có thể kết nối tới ObjectStore và cập nhật đối tượng bộ phân phối. Xem thanh bên Sử dụng một servlet J2EE để có một cách tiếp cận thú vị tới tình huống an toàn này.
Hơn nữa, chúng ta sẽ che đậy việc tạo đối tượng bộ phân phối ban đầu. Một
kỹ thuật tốt sẽ là có các lớp Java và .NET kèm theo để phát hiện xem đối
tượng bộ phân phối có còn thiếu không và tạo nó theo yêu cầu hoặc trong bộ
khởi tạo tĩnh cho lớp đó. Hai kỹ thuật phổ biến để định vị đối tượng bộ
phân phối là sử dụng một giá trị ID được định sẵn hoặc để lưu trữ đối
tượng này trong một đường dẫn được định sẵn trong ObjectStore. Cũng có thể
sử dụng một truy vấn để tìm ra tất cả các cá thể của lớp
WjcDispenser. Với các ví dụ tiếp theo, chúng ta
giả định rằng việc nhận dạng ObjectStore và vị trí cụ thể của đối tượng bộ
phân phối dù thế nào đi nữa cũng được cấu hình cho ứng dụng này.
Các khóa hợp tác của Máy nội dung (CE) FileNet
Khi sử dụng một đối tượng bộ phân phối dựa trên P8, ý tưởng dựa trên khái niệm để nhận được một số thứ tự là giống nhau: đọc giá trị cũ, cập nhật và lưu giá trị mới và trả về giá trị mới cho người gọi. Rõ ràng, các quá trình thực hiện cụ thể thay đổi. Tất cả các nhược điểm về đồng bộ hóa Java hoặc .NET vẫn tiếp tục áp dụng.
Máy chủ CE và các API triển khai thực hiện một tính năng gọi là khóa hợp
tác. Tính năng này ban đầu được triển khai thực hiện để cung cấp ngữ nghĩa
khóa hợp tác tương thích với RFC-2518 (WebDAV). Các lớp API cho
Folder (Thư mục),
Document (Tài liệu) và
CustomObject (Đối tượng tùy chỉnh) có các
phương thức để khóa và mở khóa các đối tượng đó. Vì đây là một tính năng
P8 tích hợp sẵn được triển khai thực hiện tại máy chủ, nên bạn có thể phát
triển một việc thực hiện tương tự như những gì được thể hiện trong Liệt kê
2. Ví dụ này cho thấy một phương thức nội bộ và giả định một số đoạn mã
khác đã nhận biết đối tượng bộ phân phối.
Liệt kê 2. Khóa hợp tác P8
private static final String COUNTER_PROPERTY_NAME = "WjcCounter"; /** * *** DON'T DO IT THIS WAY *** */ private static int getNextValue(CustomObject dispenser) { final Properties dispenserProperties = dispenser.getProperties(); // Object might be locked by someone else, so try a few times for (int attemptNumber=0; attemptNumber<10; ++attemptNumber) { dispenser.lock(15, null); // LOCK the object for 15 seconds try { // Because we use a refreshing save, the counter property // value will be returned. dispenser.save(RefreshMode.REFRESH); // R/T break; } catch (EngineRuntimeException ere) { ExceptionCode ec = ere.getExceptionCode(); if (ec != ExceptionCode.E_OBJECT_LOCKED) { // If we get an exception for any reason other than // the object already being locked, rethrow it. throw ere; } // already locked; try again after a little sleep try { Thread.sleep(100); // milliseconds } catch (InterruptedException e) { /* don't worry about this rarity */ } continue; } } int oldValue = dispenserProperties.getInteger32Value(COUNTER_PROPERTY_NAME); int newValue = oldValue + 1; dispenserProperties.putValue(COUNTER_PROPERTY_NAME, newValue); dispenser.unlock(); // UNLOCK the object dispenser.save(RefreshMode.NO_REFRESH); // R/T return newValue; }
Giả sử rằng đối tượng bộ phân phối được khởi tạo theo cách không tìm nạp
(có nghĩa là, thông qua một phương thức
Factory.CustomObject.getInstance()), kỹ thuật
này trị giá một chuyến đi khứ hồi đến máy chủ CE để áp dụng khóa và tìm
nạp giá trị thuộc tính hiện tại. Nếu đối tượng đã bị khóa, chúng ta sẽ
không nhận được giá trị hiện tại, vì vậy chúng ta lặp lại một vài lần để
nhận được thay đổi của mình lúc khóa bộ phân phối. Nó trị giá một chuyến
đi khứ hồi khác đến máy chủ CE để lưu trữ giá trị bộ đếm mới. Đó là một
chi phí hiệu năng hợp lý cho điều này và cũng hợp lý cho việc sử dụng toàn
bộ tính năng khóa/mở khóa.
Vấn đề chính của việc sử dụng khóa hợp tác P8 cho trường hợp sử dụng này là nó chỉ là khóa hợp tác. Máy chủ CE sẽ không ngăn cấm bất kỳ thay đổi nào do chỉ là sự hiện diện của một khóa. Lạc quan là, bạn có thể giả định rằng tất cả các ứng dụng sẽ đi theo trình tự khóa hợp tác. Thực tế, bạn vẫn phải tính đến khả năng các lỗi ứng dụng bỏ qua việc khóa. Thật dễ dàng để tưởng tượng ai đó viết một đoạn mã độc lập sử dụng đối tượng bộ phân phối nhưng bỏ qua thực hiện việc khóa.
Gắn với trình xử lý sự kiện
Đó là một lưu ý một phía, nhưng nếu bạn xem cuộc thảo luận về khóa hợp tác trong phần trước, bạn thấy rằng phải mất ít nhất hai chuyến đi khứ hồi đến máy chủ để chắc chắn có được một số thứ tự. Có thể thực hiện nó chỉ với một chuyến đi khứ hồi không? Để thực hiện ý tưởng đó, chúng ta sẽ cần ít nhất một phần tính toán được thực hiện trên máy chủ CE. Cơ chế CE cho điều đó là các trình xử lý sự kiện. Dưới đây là một thử nghiệm tư duy:
- Khởi tạo theo cách không tìm nạp đối tượng bộ phân phối (không có chuyến đi khứ hồi).
- Chúng ta cần phải thực hiện một số kiểu thay đổi cho đối tượng bộ phân
phối sao cho một sự kiện sẽ được bắt đầu. CE có một tính năng cho phép
bạn định nghĩa các sự kiện tùy chỉnh. Trên thực tế, lớp này được gọi
là
CustomEvent. Như là một phần của việc thiết lập một lần cho tất cả những điều này, hãy định nghĩa một sự kiện tùy chỉnh mới và duy trì nó trong ObjectStore đang giữ đối tượng bộ phân phối.
- Thay vì đưa ra như là một hiệu ứng phụ của một cái gì đó khác, một sự
kiện tùy chỉnh được kích hoạt khi bất kỳ ai gọi phương thức
raiseEvent()trên một đối tượng đăng ký được. Trên máy chủ, việc xử lý đăng ký và sự kiện cũng giống như với các sự kiện do hệ thống định nghĩa. Hãy gọi
raiseEvent()trên đối tượng bộ phân phối và sau đó gọi
save()có làm mới (để có được giá trị hiện tại của WjcCounter).
save()sẽ kích hoạt
CustomEvent.
- Như là một phần của việc thiết lập một lần, hãy cung cấp một trình xử
lý sự kiện được đăng ký với kiểu
CustomEventcụ thể đó trên cá thể hoặc lớp
WjcDispenser. Trình xử lý sự kiện sẽ tính toán và lưu các giá trị mới cho đặc tính
WjcCounter. Do không thể cập nhật các đặc tính trong một trình xử lý sự kiện đồng bộ, nên chúng ta sẽ thực hiện trình xử lý sự kiện không đồng bộ (đồng bộ hoặc không đồng bộ được quy định lúc đăng ký).
- Ứng dụng khách biết cách trình xử lý sự kiện sẽ cập nhật
WjcCounter, vì thế, nó thực hiện một tính toán tương tự để dự báo giá trị mới của
WjcCounter.
Trong thử nghiệm tư duy này, bạn tính rằng các cập nhật cho đối tượng bộ
phân phối sẽ xảy ra một lần tại một thời điểm, cho dù có bao nhiêu ứng
dụng khách độc lập đang yêu cầu nó đi nữa. Máy chủ CE thì không "tối ưu
hóa ngay" các cập nhật trung gian (dự phòng). Bạn hãy nhớ rằng cần bảo đảm
các trình xử lý sự kiện không đồng bộ được thực hiện. Trên thực tế, bạn
thậm chí có thể nhớ là đã nghe ở đâu đó rằng các trình xử lý sự kiện không
đồng bộ được xử lý qua hàng đợi (đó là đúng). Tất cả điều đó dường như
thêm vào một cập nhật duy nhất, tin cậy và dự báo được tới
WjcCounter cho mỗi chuyến đi khứ hồi của máy
khách đến máy chủ CE.
Bạn có thể đã đoán được từ giọng điệu mô tả ở trên là có một số vấn đề bí
mật ở đây. Trên thực tế, có hai vấn đề. Thứ nhất, có một khoảng thời gian
ngắn giữa việc cập nhật đối tượng bộ phân phối trong ObjectStore và việc
thực hiện trình xử lý sự kiện không đồng bộ. Nếu có nhiều máy khách độc
lập tình cờ thực hiện cấp nhật cùng một lúc, thì tất cả chúng sẽ thấy cùng
một giá trị được làm mới của
WjcCounter và tính
toán giá trị cập nhật giống nhau. Thậm chí nếu bạn có thể khắc phục điều
đó và bằng cách nào đó buộc các hoạt động
save() của máy khách cụ thể vào khởi động cụ
thể trình xử lý sự kiện, thì sẽ có một vấn đề thứ hai. Vấn đề thứ hai là
mặc dù các sự kiện không đồng bộ được xử lý thực sự thông qua một hàng
đợi, cần có nhiều thiết bị đọc hàng đợi. Vì vậy, không có gì bảo đảm rằng
các trình xử lý sự kiện không đồng bộ sẽ thực hiện theo thứ tự giống như
các cập nhật thực hiện nhanh.
Người viết đầu tiên sẽ thắng
Máy chủ CE có một tính năng tích hợp sẵn để phát hiện tin cậy các cập nhật
xen kẽ. CE triển khai thực hiện một chính sách gọi là người viết đầu
tiên sẽ thắng. Điều đó có nghĩa rằng nếu có hai yêu cầu đang cập
nhật cùng một đối tượng, yêu cầu đầu tiên sẽ thành công còn yêu cầu thứ
hai sẽ thất bại. Với việc cập nhật thất bại này, máy chủ sẽ đưa ra một
EngineRuntimeException với một
ExceptionCode của
E_OBJECT_MODIFIED. Thông báo ngoại lệ đi kèm là "Đối tượng ...
đã được sửa đổi vì nó đã được lấy ra". Thế điều đó có nghĩa gì?
Mỗi đối tượng có thể tồn tại độc lập trong một ObjectStore được đánh dấu
bằng một Số thứ tự cập nhật (USN - Update Sequence Number). Đây không phải
là một đặc tính theo nghĩa thông thường, nhưng giá trị của nó được trưng
ra qua phương thức
IndependentlyPersistableObject.getUpdateSequenceNumber(). Máy
chủ CE tự động gia tăng USN bất cứ khi nào một đối tượng được cập nhật
trong ObjectStore. Khi bạn tìm nạp một đối tượng từ máy chủ, USN cũng được
tìm nạp và được đưa đến phía máy khách. Các API gửi USN đó trở về máy chủ
như là một phần của đối tượng
save(). Nếu giá
trị USN đã gửi đi không khớp với giá trị USN hiện tại đã có trong kho lưu
trữ, thì máy chủ CE biết rằng đã có một sự thay đổi xảy ra (bởi một số
người gọi khác) kể từ khi đối tượng này đã được tìm nạp. Điều này biểu thị
một dạng đơn giản của cái mà thế giới cơ sở dữ liệu gọi là khóa lạc quan.
Cụ thể là máy chủ CE phát hiện những thay đổi xen kẽ này, đó là logic để khai thác điều đó hơn là tính năng khóa hợp tác tự nguyện hoàn toàn. Thông qua các API của CE, bạn có thể sử dụng một cái gì đó gọi là khởi tạo không tìm nạp (fetchless instantiation), mà chúng ta đã đề cập ở đâu đó, để bỏ qua việc kiểm tra máy chủ, nhưng bạn phải thoát khỏi cách làm việc đó của mình với trường hợp sử dụng này. Khi bạn khởi tạo tại chỗ một đối tượng trong API mà không cần tìm nạp nó từ máy chủ, thì đó chính là khởi tạo không tìm nạp. Trong trường hợp này, giá trị USN có một giá trị đặc biệt để báo hiệu cho máy chủ CE biết bỏ qua việc kiểm tra USN. Điều này đôi khi được gọi là một cập nhật không được bảo vệ. Nếu sau đó bạn tìm nạp hay làm mới bất kỳ đặc tính nào từ máy chủ, thì cũng thu được USN hiện tại.
Tuy nhiên, trong trường hợp sử dụng của chúng ta, để thực hiện khởi tạo không tìm nạp tiếp theo bằng một cập nhật không được bảo vệ thì chẳng ý nghĩa gì với một ai đó. Để nhận giá trị hiện tại của đặc tính bộ đếm, dù cách nào đi nữa cũng phải tìm nạp nó từ máy chủ. Sẽ có khả năng cho một ai đó làm hỏng một cách ác ý đặc tính bộ đếm thông qua một cập nhật không được bảo vệ, trừ phi những người cùng tham gia có ác ý ấy đã có thể làm điều tương tự với một chu kỳ cập nhật bình thường. Vì vậy, không có nguy hiểm mới nào ở đây. Do ngữ nghĩa của trường hợp sử dụng này, nên lợi thế này là thấp đối với một ai đó làm điều này thông qua một lỗi mã hóa.
Để tận dụng lợi thế của việc kiểm tra USN và chính sách người viết-đầu tiên- sẽ thắng của máy chủ CE, bạn cần cố gắng cập nhật bộ đếm trong đối tượng bộ phân phối này và phát hiện lỗi được ghi lại với một thay đổi xen kẽ. Liệt kê 3 cho thấy một ví dụ về cách làm điều này.
Liệt kê 3. Người viết đầu tiên sẽ thắng
private static final String COUNTER_PROPERTY_NAME = "WjcCounter"; /** * This property filter is used to minimize data returned in fetches and refreshes. */ private static final PropertyFilter PF_COUNTER = new PropertyFilter(); static { PF_COUNTER.addIncludeProperty(1, null, null, COUNTER_PROPERTY_NAME, null); } /** * Get the next value efficiently by exploiting First Writer Wins */ public int getNextValue(boolean feelingUnlucky) { final Properties dispenserProperties = dispenser.getProperties(); // Object might be updated by someone else, so try a few times for (int attemptNumber=0; attemptNumber<10; ++attemptNumber) { // If cached data invalid, fetch the current value // from the server. This also covers the fetchless // instantiation case. if (feelingUnlucky || dispenser.getUpdateSequenceNumber() == null || !dispenserProperties.isPropertyPresent(COUNTER_PROPERTY_NAME)) { // fetchProperties will fail if the USN doesn't match, so null it out dispenser.setUpdateSequenceNumber(null); dispenser.fetchProperties(PF_COUNTER); // R/T } int oldValue = dispenserProperties.getInteger32Value(COUNTER_PROPERTY_NAME); int newValue = oldValue + 1; dispenserProperties.putValue(COUNTER_PROPERTY_NAME, newValue); try { // Because we use a refreshing save, the counter property's // new value will be returned from the server. dispenser.save(RefreshMode.REFRESH, PF_COUNTER); // R/T return newValue; } catch (EngineRuntimeException ere) { ExceptionCode ec = ere.getExceptionCode(); if (ec != ExceptionCode.E_OBJECT_MODIFIED) { // If we get an exception for any reason other than // the object being concurrently modified, rethrow it. throw ere; } // Someone else modified it. Invalidate our cached data and try again. dispenser.setUpdateSequenceNumber(null); dispenserProperties.removeFromCache(COUNTER_PROPERTY_NAME); continue; } } // too many iterations without success throw new RuntimeException("Oops"); } /** * Set by constructor or some other means. * Fetchless instantiation is OK. */ private final CustomObject dispenser;
Thoạt nhìn, điều này dường như có hai chuyến đi khứ hồi giống nhau của máy
chủ như mã khóa hợp tác nêu trên của chúng ta. Điều đó đúng với việc cập
nhật bộ đếm đầu tiên. Chúng ta phải tìm nạp giá trị bộ đếm hiện tại từ máy
chủ, nhưng nên nhớ trạng thái bộ đếm sau một cập nhật thành công. Nếu
không có ai khác đã cập nhật đối tượng bộ phân phối vào lúc này, thì các
cập nhật cuối của chúng ta sẽ chỉ trả tiền cho một chuyến đi khứ hồi. Mặt
khác, nếu một cặp ứng dụng đang thay đổi việc cập nhật bộ phân phối này,
thì có lẽ như một số loại cân bằng tải, trạng thái đã nhớ đó gây tác dụng
ngược với chúng ta. Trong trường hợp đó, sẽ luôn trả tiền cho ba chuyến đi
khứ hồi để thực hiện một cập nhật (cố gắng cập nhật đã thất bại ban đầu,
tìm nạp giá trị bộ đếm hiện tại và cập nhật thành công cuối cùng). Chi phí
phát sinh này phải chịu thêm ngay cả khi các ứng dụng cạnh tranh đang thực
hiện các cập nhật với nhiều loại thời gian khác nhau giữa chúng (ví dụ, A
nhận được một giá trị bộ đếm trên cơ sở một giờ còn B nhận được một giá
trị bộ đếm trên cơ sở nửa giờ). Liệu bạn sẽ phải trả chi phí thêm hay
không tùy thuộc vào việc bạn có bao nhiều ứng dụng đọc độc lập, chúng
chồng chéo lên nhau như thế nào và v.v. Tham số Boolean
feelingUnlucky điều khiển phương thức trả chi
phí cho một trình tự cập nhật hai chuyển đi khứ hồi hay đặt cược vào trình
tự cập nhật một-hoặc-ba chuyển đi khứ hồi.
Các lý do khác
Dưới đây là một số điều bổ sung để xem xét về việc thực hiện và triển khai của bạn.
USN thay cho đặc tính
Do mỗi đối tượng tiếp tục tồn tại độc lập trong một kho lưu trữ đã có một Số thứ tự cập nhật (USN) tăng đều, tại sao không sử dụng số đó thay vì một đặc tính tuỳ chỉnh cho giá trị bộ đếm? Bạn có thể làm điều này nếu bạn đang định chấp nhận một số thỏa hiệp, nhưng khác với việc tránh định nghĩa về bản thân đặc tính bộ đếm, bạn sẽ không thực sự tiết kiệm được nhiều.
- Sự tiến triển bình thường của USN là được tăng lên một. Nếu bạn cần một số mô hình tiến trình khác cho các số thứ tự của bạn, bạn sẽ không gặp may đâu.
- Trên thực tế, mô hình phát triển CE cho USN chỉ được xác định một cách mơ hồ. Việc sử dụng chính thức trên thực tế mà bạn có thể thực hiện với nó là so sánh nó dựa vào giá trị bằng không hoặc so sánh hai USN với các giá trị nhỏ hơn, lớn hơn hoặc bằng. Có khả năng là hành vi tăng-lên-một có thể thay đổi trong một phiên bản CE tương lai, mặc dù nó vẫn sẽ là hành vi tăng đều.
- Nói đúng ra, sự tăng lên của USN là không theo sự điều khiển của bạn. Máy chủ CE tăng USN bất cứ khi nào đối tượng đã tồn tại được cập nhật, chứ không chỉ khi một ai đó đã yêu cầu một số thứ tự mới.
- Bạn sẽ vẫn phải thực hiện số các chuyến đi khứ hồi của máy chủ giống nhau để cập nhật đối tượng bộ phân phối hoặc tìm nạp giá trị USN. Không có lợi thế về hiệu năng nào.
Nhiều bộ phân phối
Bất kể kỹ thuật mà bạn sử dụng cho mã thực hiện, việc cập nhật liên tục một đối tượng duy nhất có thể gây ra một điểm nóng hiệu năng trong kho lưu trữ nếu khối lượng cập nhật cao. Với cao, chúng ta muốn nói là cao theo các tiêu chuẩn cơ sở dữ liệu. Vì vậy, ngay cả vài ngàn lần cập nhật mỗi ngày cũng không chắc là một vấn đề. Với các khối lượng rất cao, bạn có thể muốn làm cho nhiều thứ có thể mở rộng hơn bằng cách dùng nhiều đối tượng bộ phân phối với nhau mỗi bộ chịu trách nhiệm về một số dải giá trị. Nói cách khác, các giá trị được phân phối bởi các cá thể bộ phân phối khác nhau vẫn là duy nhất theo tổng thể.
Về API phiên bản Java 3.x
API phiên bản Java 3.x của CE không để lộ ra Số thứ tự cập nhật được sử dụng ở trên. Trên thực tế, với hầu hết các hoạt động, mà API chuyển những thứ này lên phần đầu của chúng và sử dụng một chính sách người viết-sau cùng-sẽ thắng. Điều đó là có thể, nhưng quả khá là khó để viết một bộ phân phối vừa đúng chức năng lại vừa đúng hiệu năng trong API phiên bản Java 3.x . Nếu các ràng buộc nghiệp vụ của bạn cho phép nó, thì điều tốt nhất để bạn làm sẽ là di chuyển một phần (hoặc tất cả) ứng dụng của bạn theo các API phiên bản 4.x của CE.
Suy nghĩ cuối cùng
Bài viết này đã trình bày nhiều kỹ thuật để triển khai thực hiện một bộ phân phối số thứ tự. Giống như mọi thứ khác, có bao nhiêu vấn đề mà bạn muốn tiếp tục là tùy thuộc một phần vào các yêu cầu nghiệp vụ và bất cứ điều gì khác mà bạn có trong lịch trình thực hiện của mình. Nếu ai đó hỏi tôi triển khai thực hiện điều này theo một cách cởi mở, hoàn toàn mạ vàng, thì nó sẽ giống như thế này:
- Sử dụng mã người viết-đầu tiên-thắng cuộc tương tự như trong Liệt kê 3.
- Đặt mã đó trong một servlet J2EE đơn giản. Bằng cách triển khai nó trong một thùng chứa Web J2EE, chúng ta sẽ tự động có được việc điều chỉnh quy mô, dự phòng lỗi, cách ly và các lợi ích khác của cơ sở hạ tầng J2EE.
- Hạn chế quyền truy cập viết P8 vào đối tượng hoặc các đối tượng bộ phân phối sao cho những người dùng bình thường không thể bỏ qua servlet để cập nhật giá trị đó.
- Cấu hình servlet với một vai trò RunAs có các quyền của Máy nội dung (CE) để cập nhật các đối tượng bộ phân phối. (Xem thanh bên Sử dụng một servlet J2EE).
- Nếu cần, hãy triển khai thực hiện một số lược đồ để xác minh rằng những người yêu cầu có quyền đòi hỏi bộ phân phối cho một số. Điều này sẽ chỉ thú vị nếu có một mối quan tâm về các số bị lãng phí.
- Hãy bắt đầu servlet với một giả định lạc quan rằng một chuyến đi khứ
hồi sẽ có chi phí thông thường để nhận được một số từ một bộ phân
phối. Nói cách khác, hãy bắt đầu với
feelingUnluckylà sai. Hãy theo dõi xem bao lâu thì điều đó chuyển thành sai trên thực tế. Khi nó sai nhiều hơn một tỷ lệ phần trăm thời gian, hãy chuyển sang khung nhìn bi quan để luôn trả tiền cho chi phí hai chuyến đi khứ hồi. Theo định kỳ hãy chuyển trở lại khung nhìn lạc quan để xem mọi thứ đã thay đổi chưa.
- Khi cần thiết, hãy cung cấp mã tiện ích phía máy khách để thực hiện các cuộc gọi đến servlet để nhận được các số thứ tự.
Không cần phải nói, tôi cũng sẽ yêu cầu thanh toán về các bánh nướng nhỏ này. Ngon tuyệt!
Tài nguyên
Học tập
- Có một số Sách Đỏ của IBM liên quan đến các sản phẩm IBM FileNet. Những quyển sách này cũng đi vượt ra ngoài các API CE và PE, là trọng tâm của loạt bài này, nhưng dù sao chúng là vô giá để đạt được những hiểu biết sâu sắc về các bộ sản phẩm này. Chúng tôi đề xuất nên bắt đầu với Các khuyến nghị và các cách làm tốt nhất về triển khai thực hiện quản lý nội dung của IBM FileNet và Giới thiệu Nhà quản lý quy trình nghiệp vụ của IBM FileNet. Hãy tìm thêm chi tiết về các sách Đỏ của IBM bằng cách tìm kiếm các trang web có từ filenet. Có thể tải về các sách Đỏ của IBM điện tử miễn phí hoặc mua sách in.
- IBM developerWorks chứa các tư liệu khác nhau liên quan đến các sản phẩm IBM FileNet của nhiều tác giả. Bạn có thể tìm thấy nội dung này bằng cách tìm kiếm trang web IBM developerWorks có từ FileNet. Dưới đây là một vài bài viết cụ thể mà chúng tôi khuyên bạn nên đọc thêm.
- Hướng dẫn Phát triển các ứng dụng bằng cách sử dụng các API Java Quản lý nội dung doanh nghiệp của IBM với Nhà phát triển ứng dụng Rational của IBM so sánh các kỹ thuật mã hóa với các API cho các sản phẩm ECM khác nhau của IBM, bao gồm Nhà quản lý nội dung FileNet của IBM.
- Bài Nâng cấp từ FileNet P8 3.5 lên 4.0: Một sự chuyển dịch kiến trúc nêu bật một số trong khía cạnh quan trọng về cách nền tảng P8 tích hợp với J2EE như thế nào. Hiểu về tích hợp kiến trúc của P8 với J2EE là chìa khóa để hiểu cách phát triển các giải pháp tùy chỉnh.
- Loạt bài Phát triển các thành phần tùy chỉnh FileNet P8 BPM 4.0 khi sử dụng Eclipse cho thấy các thủ thuật và các phím tắt trong quá trình phát triển một thành phần tùy chỉnh cho BPM của IBM FileNet.
- Loạt bài Xây dựng các ứng dụng BPM bằng cách sử dụng FileNet đưa ra một mô tả cụ thể về cách xây dựng một loại hình rất phổ biến của giải pháp bằng cách sử dụng Khung công tác quy trình nghiệp vụ (BPF) FileNet của IBM.
Lấy sản phẩm và công nghệ
- Điểm xuất phát của bạn để có thông tin về các đề xuất IBM ECM là Quản lý nội dung doanh nghiệp. Trong vùng Thư viện, bạn sẽ tìm thấy nhiều trang trắng, các bản tóm tắt sản phẩm, các báo cáo phân tích và thông tin sản phẩm khác. Toàn bộ tài liệu nền tảng P8, cho các API và các khía cạnh khác, có sẵn tại Tài liệu sản phẩm cho Nền tảng P8 của FileNet.
Thảo luận
- Có nhiều diễn đàn của developerWorks liên quan đến ECM bao gồm một số diễn đàn nhỏ liên quan đặc biệt đến các sản phẩm FileNet của IBM. Cụ thể, hãy truy cập vào diễn đàn IBM FileNet Content Manager và diễn đàn FileNet Business Process Manager (Nhà quản lý quy trình nghiệp vụ FileNet). Các diễn đàn này chủ yếu dẫn dắt bởi cộng đồng và không thay thế cho các cơ chế hỗ trợ sản phẩm chính thức.
Bình luận
-
Vùng dữ liệu trên developerWorks
Khám phá các bài viết xoay quanh lĩnh vực dữ liệu, Quản lý hệ thống thông tin
-
Vùng mã nguồn mở trên developerWorks
Xem các bài viết về HTML, CSS, JavaScript,...
-
Điện toán đám mây
Tìm hiểu về điện toán đám mây

markdown:
## Mở đầu
Thói quen ở nhiều nơi có các cửa hàng nhỏ là nắm được các khách hàng đã xếp hàng bằng cách gán cho họ các số thứ tự sát với thứ tự mà họ tới cửa hàng. Các số thứ tự này thường được in trên các mảnh giấy nhỏ và được phân phối từ một bộ phân phối cơ khí vật lý duy nhất. Nếu có nhiều khách hàng đến đồng thời, mối quan hệ này dễ dàng bị phá vỡ bởi phép xã giao và phép lịch sự thông thường.
Các vấn đề tương tự thường phát sinh trong các hệ thống phần mềm. Một hệ thống thường cần gán các số cho các việc nào đó với đảm bảo rằng các số đó là duy nhất và theo một số mô hình. Có một số giải pháp chung cho vấn đề này, nhưng các hệ thống phân phối làm phức tạp các vấn đề. Hầu như không chắc rằng bạn sẽ sử dụng một hệ thống ECM để gán các số cho các khách hàng tại một hiệu bánh ở góc phố. (Nhưng nếu bạn đã quan tâm về điều đó, tôi có thể nối bạn với một người bán hàng có thiện ý!) Tuy nhiên, bạn có thể cần gán các số theo trường hợp hoặc các số mã định danh (ID) khách hàng hoặc các số bộ phận hoặc một cái gì đó đơn giản hơn. Các nhà cung cấp cơ sở dữ liệu triển khai thực hiện các kiểu cột số thứ tự chỉ dùng cho loại vấn đề này. Tuy nhiên, P8 không cung cấp truy cập trực tiếp vào các kiểu số thứ tự cơ sở dữ liệu, vì vậy bạn phải sử dụng các cơ chế khác.
Trong bài này, chúng ta sẽ việc xem xét cách giải quyết vấn đề này trong một môi trường P8. Hãy tóm tắt các yêu cầu:
- Chúng ta cần gán các số được bảo đảm tuyệt đối là duy nhất. Hoàn toàn không chấp nhận gán hai lần với cùng một số.
- Chúng ta muốn các số đi theo một vài mô hình. Chúng ta không muốn có những cách quãng trong việc gán số. Mô hình có thể có nhiều thứ, nhưng với các mục đích của mình chúng ta sẽ chỉ sử dụng mô hình tăng dần đơn giản. Số tiếp theo mà chúng ta nhận được sẽ là một số lớn hơn số đứng trước.
- Chúng ta muốn tất cả điều này hoạt động tin cậy và có hiệu năng tốt trong một môi trường P8 có nhiều luồng, nhiều bộ xử lý, nhiều máy chủ, nhiều tầng và nhiều người dùng.
- Trong khi chúng ta đang ở đó, chúng ta cần khoảng một chục bánh nướng nhỏ màu đỏ trông rất ngon có lớp phủ kem pho mát!
Trước khi mô tả việc triển khai thực hiện ưa thích của mình, đầu tiên chúng ta sẽ xem xét một vài kỹ thuật hoặc không làm việc hoặc không làm việc rất tốt. Ngay cả khi bạn chưa bao giờ có nhu cầu triển khai thực hiện trường hợp sử dụng cụ thể này, hầu hết các điểm được minh họa trong bài này có thể áp dụng cho nhiều lĩnh vực lập trình P8.
## Đồng bộ Java hay .NET
Nếu bạn là người mới đến với công việc phát triển doanh nghiệp hay phát
triển phân phối nói chung, bạn có thể nghĩ ngay đến việc sử dụng một đối
tượng đơn lẻ có một số kiểu truy cập đồng bộ hóa đến phần cập nhật bộ đếm.
Trong Java, đó sẽ là một phương thức
synchronized (đã đồng bộ) hoặc khối mã. Trong C#, sẽ là một
phương thức đánh dấu là đã đồng bộ hoặc một khối mã được bảo vệ bằng một
lock(). Các vùng mã có truy cập đồng bộ đôi
khi được gọi là các phần tới hạn. Liệt kê 1 cho thấy một trong nhiều cách
để thực hiện điều này.
##### Liệt kê 1. Khối mã đồng bộ
/** * *** DON'T DO IT THIS WAY *** */ public class Dispenser { /** static access only, so private constructor */ private Dispenser() {} private static int counter = 0; public static final synchronized int getNextValue() { return ++counter; } }
Việc sử dụng mã đồng bộ là tốt cho các vấn đề cụ thể, nhưng với trường hợp
sử dụng của chúng ta các nhược điểm là khá rõ. Vì giá trị của bộ đếm chỉ
tồn tại trong bộ nhớ của chương trình đang chạy, nên các giá trị này sẽ
bắt đầu lại khi chương trình được khởi động lại. Bạn có thể thay đổi lớp
Dispenser (Bộ phân phối) để lưu các giá trị đã
cập nhật vào một tệp, nhưng điều đó sẽ dẫn đến các vấn đề mới do không thể
phối hợp đồng bộ qua các ranh giới của quá trình. Các ứng dụng chạy độc
lập khác nhau (hoặc các bản sao của cùng một ứng dụng), ngay cả khi chúng
đang sử dụng lớp
Dispenser, có thể đã xen kẽ
đọc và viết vào tệp. Tệ hơn nữa, chúng có thể đang truy cập vào một tệp có
cùng tên trên các máy tính khác nhau. Cả hai tình huống đó đều dẫn đến các
điều kiện vi phạm các yêu cầu của trường hợp sử dụng của chúng ta.
Dưới đây là một ví dụ về những rắc rối có thể do các việc đọc và viết xen kẽ. Giả sử giá trị hiện tại được ghi trong tệp là 7 và sau đó các việc sau đây diễn ra:
- A đọc giá trị 7 từ tệp này.
- B đọc giá trị 7 từ tệp này.
- A viết giá trị 8 vào tệp này.
- C đọc giá trị 8 từ tệp này.
- C viết giá trị 9 vào tệp này.
- B viết giá trị 8 vào tệp này.
Lúc này, cả hai A và B có cùng một số mà họ tin là duy nhất với họ. Người đọc tệp tiếp theo sẽ kết thúc bằng một giá trị giống như C đã có. Bạn có thể có một vài ý tưởng về việc sử dụng khóa tệp hoặc các thủ thuật cụ thể của hệ điều hành khác để đồng bộ hóa truy cập vào một tệp trong một môi trường phân phối. Tuy nhiên, những khó khăn với kiểu giải pháp đó cũng khá dễ hiểu trong hầu hết ngành khoa học máy tính và quả là rất khó khăn để nhận diện chính xác nó, do đó, chúng ta không cần chỉ trích kịch bản này quá nhiều. Nếu bạn cần có sức thuyết phục hơn, hãy sử dụng máy tìm kiếm ưa thích của mình để nghiên cứu "vấn đề khóa NFS".
## Đối tượng bộ phân phối P8
Một giải pháp phổ biến cho những vấn đề này là sử dụng một cơ sở dữ liệu để duy trì bộ phân phối. Các cơ sở dữ liệu quan hệ có sẵn cho doanh nghiệp vốn đã phân phối tài nguyên với ngữ nghĩa khóa tin cậy. Trong kiến trúc P8, các ứng dụng không thể truy cập trực tiếp vào các cơ sở dữ liệu phía sau. Nói cách khác, việc truy cập cơ sở dữ liệu phải được bố trí riêng cho các ứng dụng này, cho dù nó thông qua các nguồn dữ liệu J2EE, nhằm vào các kết nối JDBC, hoặc các phương tiện khác. Việc này có thể làm việc tốt trong một số kịch bản, nhưng nói chung thật là phiền toái để làm việc này chỉ để truy cập dữ liệu bộ phân phối.
Một điều mà chúng ta biết là tất cả các ứng dụng dựa vào P8 có quyền truy
cập đến ObjectStores và các đối tượng P8, phải chịu các sự kiểm tra truy
cập do P8 bắt buộc. Do đó chúng ta có thể mô hình hóa bộ phân phối như là
một đối tượng P8. Cụ thể, chúng ta có thể tạo ra một cá thể của một lớp
con của
CustomObject gọi là
WjcDispenser với một đặc tính tùy chỉnh số
nguyên được gọi là
WjcCounter. (Gắn cho các tên
tiền tố tùy ý "Wjc" này để tránh các xung đột với tên lớp và tên thuộc
tính khác). Hình 1 cho thấy một biểu đồ UML cho lớp con đơn giản này.
##### Hình 1. Biểu đồ
UML cho
WjcDispenser
![ Biểu đồ UML hiển thị WjcDispenser như một lớp con của CustomObject](wjcdispenser.gif)
Chúng ta giả định rằng truy cập an toàn đến đối tượng này có thể được bố
trí thuận tiện cho tất cả người dùng của tất cả các ứng dụng cần sử dụng
nó. Bây giờ, chúng ta sẽ giả định rằng bất cứ ai cũng có thể kết nối tới
ObjectStore và cập nhật đối tượng bộ phân phối. Xem thanh bên
[Sử dụng một servlet J2EE](#sidebarj2eeservlet) để có một cách
tiếp cận thú vị tới tình huống an toàn này.
Hơn nữa, chúng ta sẽ che đậy việc tạo đối tượng bộ phân phối ban đầu. Một
kỹ thuật tốt sẽ là có các lớp Java và .NET kèm theo để phát hiện xem đối
tượng bộ phân phối có còn thiếu không và tạo nó theo yêu cầu hoặc trong bộ
khởi tạo tĩnh cho lớp đó. Hai kỹ thuật phổ biến để định vị đối tượng bộ
phân phối là sử dụng một giá trị ID được định sẵn hoặc để lưu trữ đối
tượng này trong một đường dẫn được định sẵn trong ObjectStore. Cũng có thể
sử dụng một truy vấn để tìm ra tất cả các cá thể của lớp
WjcDispenser. Với các ví dụ tiếp theo, chúng ta
giả định rằng việc nhận dạng ObjectStore và vị trí cụ thể của đối tượng bộ
phân phối dù thế nào đi nữa cũng được cấu hình cho ứng dụng này.
## Các khóa hợp tác của Máy nội dung (CE) FileNet
Khi sử dụng một đối tượng bộ phân phối dựa trên P8, ý tưởng dựa trên khái niệm để nhận được một số thứ tự là giống nhau: đọc giá trị cũ, cập nhật và lưu giá trị mới và trả về giá trị mới cho người gọi. Rõ ràng, các quá trình thực hiện cụ thể thay đổi. Tất cả các nhược điểm về đồng bộ hóa Java hoặc .NET vẫn tiếp tục áp dụng.
Máy chủ CE và các API triển khai thực hiện một tính năng gọi là khóa hợp
tác. Tính năng này ban đầu được triển khai thực hiện để cung cấp ngữ nghĩa
khóa hợp tác tương thích với RFC-2518 (WebDAV). Các lớp API cho
Folder (Thư mục),
Document (Tài liệu) và
CustomObject (Đối tượng tùy chỉnh) có các
phương thức để khóa và mở khóa các đối tượng đó. Vì đây là một tính năng
P8 tích hợp sẵn được triển khai thực hiện tại máy chủ, nên bạn có thể phát
triển một việc thực hiện tương tự như những gì được thể hiện trong Liệt kê
2. Ví dụ này cho thấy một phương thức nội bộ và giả định một số đoạn mã
khác đã nhận biết đối tượng bộ phân phối.
##### Liệt kê 2. Khóa hợp tác P8
private static final String COUNTER_PROPERTY_NAME = "WjcCounter"; /** * *** DON'T DO IT THIS WAY *** */ private static int getNextValue(CustomObject dispenser) { final Properties dispenserProperties = dispenser.getProperties(); // Object might be locked by someone else, so try a few times for (int attemptNumber=0; attemptNumber<10; ++attemptNumber) { dispenser.lock(15, null); // LOCK the object for 15 seconds try { // Because we use a refreshing save, the counter property // value will be returned. dispenser.save(RefreshMode.REFRESH); // R/T break; } catch (EngineRuntimeException ere) { ExceptionCode ec = ere.getExceptionCode(); if (ec != ExceptionCode.E_OBJECT_LOCKED) { // If we get an exception for any reason other than // the object already being locked, rethrow it. throw ere; } // already locked; try again after a little sleep try { Thread.sleep(100); // milliseconds } catch (InterruptedException e) { /* don't worry about this rarity */ } continue; } } int oldValue = dispenserProperties.getInteger32Value(COUNTER_PROPERTY_NAME); int newValue = oldValue + 1; dispenserProperties.putValue(COUNTER_PROPERTY_NAME, newValue); dispenser.unlock(); // UNLOCK the object dispenser.save(RefreshMode.NO_REFRESH); // R/T return newValue; }
Giả sử rằng đối tượng bộ phân phối được khởi tạo theo cách không tìm nạp
(có nghĩa là, thông qua một phương thức
Factory.CustomObject.getInstance()), kỹ thuật
này trị giá một chuyến đi khứ hồi đến máy chủ CE để áp dụng khóa và tìm
nạp giá trị thuộc tính hiện tại. Nếu đối tượng đã bị khóa, chúng ta sẽ
không nhận được giá trị hiện tại, vì vậy chúng ta lặp lại một vài lần để
nhận được thay đổi của mình lúc khóa bộ phân phối. Nó trị giá một chuyến
đi khứ hồi khác đến máy chủ CE để lưu trữ giá trị bộ đếm mới. Đó là một
chi phí hiệu năng hợp lý cho điều này và cũng hợp lý cho việc sử dụng toàn
bộ tính năng khóa/mở khóa.
Vấn đề chính của việc sử dụng khóa hợp tác P8 cho trường hợp sử dụng này
là nó chỉ là
*khóa hợp tác*. Máy chủ CE sẽ không ngăn cấm bất kỳ thay
đổi nào do chỉ là sự hiện diện của một khóa. Lạc quan là, bạn có thể giả
định rằng tất cả các ứng dụng sẽ đi theo trình tự khóa hợp tác. Thực tế,
bạn vẫn phải tính đến khả năng các lỗi ứng dụng bỏ qua việc khóa. Thật dễ
dàng để tưởng tượng ai đó viết một đoạn mã độc lập sử dụng đối tượng bộ
phân phối nhưng bỏ qua thực hiện việc khóa.
## Gắn với trình xử lý sự kiện
Đó là một lưu ý một phía, nhưng nếu bạn xem cuộc thảo luận về khóa hợp tác trong phần trước, bạn thấy rằng phải mất ít nhất hai chuyến đi khứ hồi đến máy chủ để chắc chắn có được một số thứ tự. Có thể thực hiện nó chỉ với một chuyến đi khứ hồi không? Để thực hiện ý tưởng đó, chúng ta sẽ cần ít nhất một phần tính toán được thực hiện trên máy chủ CE. Cơ chế CE cho điều đó là các trình xử lý sự kiện. Dưới đây là một thử nghiệm tư duy:
- Khởi tạo theo cách không tìm nạp đối tượng bộ phân phối (không có chuyến đi khứ hồi).
- Chúng ta cần phải thực hiện một số kiểu thay đổi cho đối tượng bộ phân
phối sao cho một sự kiện sẽ được bắt đầu. CE có một tính năng cho phép
bạn định nghĩa các sự kiện tùy chỉnh. Trên thực tế, lớp này được gọi
là
CustomEvent. Như là một phần của việc thiết lập một lần cho tất cả những điều này, hãy định nghĩa một sự kiện tùy chỉnh mới và duy trì nó trong ObjectStore đang giữ đối tượng bộ phân phối.
- Thay vì đưa ra như là một hiệu ứng phụ của một cái gì đó khác, một sự
kiện tùy chỉnh được kích hoạt khi bất kỳ ai gọi phương thức
raiseEvent()trên một đối tượng đăng ký được. Trên máy chủ, việc xử lý đăng ký và sự kiện cũng giống như với các sự kiện do hệ thống định nghĩa. Hãy gọi
raiseEvent()trên đối tượng bộ phân phối và sau đó gọi
save()có làm mới (để có được giá trị hiện tại của WjcCounter).
save()sẽ kích hoạt
CustomEvent.
- Như là một phần của việc thiết lập một lần, hãy cung cấp một trình xử
lý sự kiện được đăng ký với kiểu
CustomEventcụ thể đó trên cá thể hoặc lớp
WjcDispenser. Trình xử lý sự kiện sẽ tính toán và lưu các giá trị mới cho đặc tính
WjcCounter. Do không thể cập nhật các đặc tính trong một trình xử lý sự kiện đồng bộ, nên chúng ta sẽ thực hiện trình xử lý sự kiện không đồng bộ (đồng bộ hoặc không đồng bộ được quy định lúc đăng ký).
- Ứng dụng khách biết cách trình xử lý sự kiện sẽ cập nhật
WjcCounter, vì thế, nó thực hiện một tính toán tương tự để dự báo giá trị mới của
WjcCounter.
Trong thử nghiệm tư duy này, bạn tính rằng các cập nhật cho đối tượng bộ
phân phối sẽ xảy ra một lần tại một thời điểm, cho dù có bao nhiêu ứng
dụng khách độc lập đang yêu cầu nó đi nữa. Máy chủ CE thì không "tối ưu
hóa ngay" các cập nhật trung gian (dự phòng). Bạn hãy nhớ rằng cần bảo đảm
các trình xử lý sự kiện không đồng bộ được thực hiện. Trên thực tế, bạn
thậm chí có thể nhớ là đã nghe ở đâu đó rằng các trình xử lý sự kiện không
đồng bộ được xử lý qua hàng đợi (đó là đúng). Tất cả điều đó dường như
thêm vào một cập nhật duy nhất, tin cậy và dự báo được tới
WjcCounter cho mỗi chuyến đi khứ hồi của máy
khách đến máy chủ CE.
Bạn có thể đã đoán được từ giọng điệu mô tả ở trên là có một số vấn đề bí
mật ở đây. Trên thực tế, có hai vấn đề. Thứ nhất, có một khoảng thời gian
ngắn giữa việc cập nhật đối tượng bộ phân phối trong ObjectStore và việc
thực hiện trình xử lý sự kiện không đồng bộ. Nếu có nhiều máy khách độc
lập tình cờ thực hiện cấp nhật cùng một lúc, thì tất cả chúng sẽ thấy cùng
một giá trị được làm mới của
WjcCounter và tính
toán giá trị cập nhật giống nhau. Thậm chí nếu bạn có thể khắc phục điều
đó và bằng cách nào đó buộc các hoạt động
save() của máy khách cụ thể vào khởi động cụ
thể trình xử lý sự kiện, thì sẽ có một vấn đề thứ hai. Vấn đề thứ hai là
mặc dù các sự kiện không đồng bộ được xử lý thực sự thông qua một hàng
đợi, cần có nhiều thiết bị đọc hàng đợi. Vì vậy, không có gì bảo đảm rằng
các trình xử lý sự kiện không đồng bộ sẽ thực hiện theo thứ tự giống như
các cập nhật thực hiện nhanh.
## Người viết đầu tiên sẽ thắng
Máy chủ CE có một tính năng tích hợp sẵn để phát hiện tin cậy các cập nhật
xen kẽ. CE triển khai thực hiện một chính sách gọi là
*người viết đầu
tiên sẽ thắng*. Điều đó có nghĩa rằng nếu có hai yêu cầu đang cập
nhật cùng một đối tượng, yêu cầu đầu tiên sẽ thành công còn yêu cầu thứ
hai sẽ thất bại. Với việc cập nhật thất bại này, máy chủ sẽ đưa ra một
EngineRuntimeException với một
ExceptionCode của
E_OBJECT_MODIFIED. Thông báo ngoại lệ đi kèm là "Đối tượng ...
đã được sửa đổi vì nó đã được lấy ra". Thế điều đó có nghĩa gì?
Mỗi đối tượng có thể tồn tại độc lập trong một ObjectStore được đánh dấu
bằng một Số thứ tự cập nhật (USN - Update Sequence Number). Đây không phải
là một đặc tính theo nghĩa thông thường, nhưng giá trị của nó được trưng
ra qua phương thức
IndependentlyPersistableObject.getUpdateSequenceNumber(). Máy
chủ CE tự động gia tăng USN bất cứ khi nào một đối tượng được cập nhật
trong ObjectStore. Khi bạn tìm nạp một đối tượng từ máy chủ, USN cũng được
tìm nạp và được đưa đến phía máy khách. Các API gửi USN đó trở về máy chủ
như là một phần của đối tượng
save(). Nếu giá
trị USN đã gửi đi không khớp với giá trị USN hiện tại đã có trong kho lưu
trữ, thì máy chủ CE biết rằng đã có một sự thay đổi xảy ra (bởi một số
người gọi khác) kể từ khi đối tượng này đã được tìm nạp. Điều này biểu thị
một dạng đơn giản của cái mà thế giới cơ sở dữ liệu gọi là khóa lạc quan.
Cụ thể là máy chủ CE phát hiện những thay đổi xen kẽ này, đó là logic để
khai thác điều đó hơn là tính năng khóa hợp tác tự nguyện hoàn toàn. Thông
qua các API của CE, bạn có thể sử dụng một cái gì đó gọi là
*khởi tạo
không tìm nạp* (fetchless instantiation), mà chúng ta đã đề cập ở
đâu đó, để bỏ qua việc kiểm tra máy chủ, nhưng bạn phải thoát khỏi cách
làm việc đó của mình với trường hợp sử dụng này. Khi bạn khởi tạo tại chỗ
một đối tượng trong API mà không cần tìm nạp nó từ máy chủ, thì đó chính
là khởi tạo không tìm nạp. Trong trường hợp này, giá trị USN có một giá
trị đặc biệt để báo hiệu cho máy chủ CE biết bỏ qua việc kiểm tra USN.
Điều này đôi khi được gọi là một cập nhật không được bảo vệ. Nếu sau đó
bạn tìm nạp hay làm mới bất kỳ đặc tính nào từ máy chủ, thì cũng thu được
USN hiện tại.
Tuy nhiên, trong trường hợp sử dụng của chúng ta, để thực hiện khởi tạo không tìm nạp tiếp theo bằng một cập nhật không được bảo vệ thì chẳng ý nghĩa gì với một ai đó. Để nhận giá trị hiện tại của đặc tính bộ đếm, dù cách nào đi nữa cũng phải tìm nạp nó từ máy chủ. Sẽ có khả năng cho một ai đó làm hỏng một cách ác ý đặc tính bộ đếm thông qua một cập nhật không được bảo vệ, trừ phi những người cùng tham gia có ác ý ấy đã có thể làm điều tương tự với một chu kỳ cập nhật bình thường. Vì vậy, không có nguy hiểm mới nào ở đây. Do ngữ nghĩa của trường hợp sử dụng này, nên lợi thế này là thấp đối với một ai đó làm điều này thông qua một lỗi mã hóa.
Để tận dụng lợi thế của việc kiểm tra USN và chính sách người viết-đầu tiên- sẽ thắng của máy chủ CE, bạn cần cố gắng cập nhật bộ đếm trong đối tượng bộ phân phối này và phát hiện lỗi được ghi lại với một thay đổi xen kẽ. Liệt kê 3 cho thấy một ví dụ về cách làm điều này.
##### Liệt kê 3. Người viết đầu tiên sẽ thắng
private static final String COUNTER_PROPERTY_NAME = "WjcCounter"; /** * This property filter is used to minimize data returned in fetches and refreshes. */ private static final PropertyFilter PF_COUNTER = new PropertyFilter(); static { PF_COUNTER.addIncludeProperty(1, null, null, COUNTER_PROPERTY_NAME, null); } /** * Get the next value efficiently by exploiting First Writer Wins */ public int getNextValue(boolean feelingUnlucky) { final Properties dispenserProperties = dispenser.getProperties(); // Object might be updated by someone else, so try a few times for (int attemptNumber=0; attemptNumber<10; ++attemptNumber) { // If cached data invalid, fetch the current value // from the server. This also covers the fetchless // instantiation case. if (feelingUnlucky || dispenser.getUpdateSequenceNumber() == null || !dispenserProperties.isPropertyPresent(COUNTER_PROPERTY_NAME)) { // fetchProperties will fail if the USN doesn't match, so null it out dispenser.setUpdateSequenceNumber(null); dispenser.fetchProperties(PF_COUNTER); // R/T } int oldValue = dispenserProperties.getInteger32Value(COUNTER_PROPERTY_NAME); int newValue = oldValue + 1; dispenserProperties.putValue(COUNTER_PROPERTY_NAME, newValue); try { // Because we use a refreshing save, the counter property's // new value will be returned from the server. dispenser.save(RefreshMode.REFRESH, PF_COUNTER); // R/T return newValue; } catch (EngineRuntimeException ere) { ExceptionCode ec = ere.getExceptionCode(); if (ec != ExceptionCode.E_OBJECT_MODIFIED) { // If we get an exception for any reason other than // the object being concurrently modified, rethrow it. throw ere; } // Someone else modified it. Invalidate our cached data and try again. dispenser.setUpdateSequenceNumber(null); dispenserProperties.removeFromCache(COUNTER_PROPERTY_NAME); continue; } } // too many iterations without success throw new RuntimeException("Oops"); } /** * Set by constructor or some other means. * Fetchless instantiation is OK. */ private final CustomObject dispenser;
Thoạt nhìn, điều này dường như có hai chuyến đi khứ hồi giống nhau của máy
chủ như mã khóa hợp tác nêu trên của chúng ta. Điều đó đúng với việc cập
nhật bộ đếm đầu tiên. Chúng ta phải tìm nạp giá trị bộ đếm hiện tại từ máy
chủ, nhưng nên nhớ trạng thái bộ đếm sau một cập nhật thành công. Nếu
không có ai khác đã cập nhật đối tượng bộ phân phối vào lúc này, thì các
cập nhật cuối của chúng ta sẽ chỉ trả tiền cho một chuyến đi khứ hồi. Mặt
khác, nếu một cặp ứng dụng đang thay đổi việc cập nhật bộ phân phối này,
thì có lẽ như một số loại cân bằng tải, trạng thái đã nhớ đó gây tác dụng
ngược với chúng ta. Trong trường hợp đó, sẽ luôn trả tiền cho ba chuyến đi
khứ hồi để thực hiện một cập nhật (cố gắng cập nhật đã thất bại ban đầu,
tìm nạp giá trị bộ đếm hiện tại và cập nhật thành công cuối cùng). Chi phí
phát sinh này phải chịu thêm ngay cả khi các ứng dụng cạnh tranh đang thực
hiện các cập nhật với nhiều loại thời gian khác nhau giữa chúng (ví dụ, A
nhận được một giá trị bộ đếm trên cơ sở một giờ còn B nhận được một giá
trị bộ đếm trên cơ sở nửa giờ). Liệu bạn sẽ phải trả chi phí thêm hay
không tùy thuộc vào việc bạn có bao nhiều ứng dụng đọc độc lập, chúng
chồng chéo lên nhau như thế nào và v.v. Tham số Boolean
feelingUnlucky điều khiển phương thức trả chi
phí cho một trình tự cập nhật hai chuyển đi khứ hồi hay đặt cược vào trình
tự cập nhật một-hoặc-ba chuyển đi khứ hồi.
## Các lý do khác
Dưới đây là một số điều bổ sung để xem xét về việc thực hiện và triển khai của bạn.
### USN thay cho đặc tính
Do mỗi đối tượng tiếp tục tồn tại độc lập trong một kho lưu trữ đã có một Số thứ tự cập nhật (USN) tăng đều, tại sao không sử dụng số đó thay vì một đặc tính tuỳ chỉnh cho giá trị bộ đếm? Bạn có thể làm điều này nếu bạn đang định chấp nhận một số thỏa hiệp, nhưng khác với việc tránh định nghĩa về bản thân đặc tính bộ đếm, bạn sẽ không thực sự tiết kiệm được nhiều.
- Sự tiến triển bình thường của USN là được tăng lên một. Nếu bạn cần một số mô hình tiến trình khác cho các số thứ tự của bạn, bạn sẽ không gặp may đâu.
- Trên thực tế, mô hình phát triển CE cho USN chỉ được xác định một cách mơ hồ. Việc sử dụng chính thức trên thực tế mà bạn có thể thực hiện với nó là so sánh nó dựa vào giá trị bằng không hoặc so sánh hai USN với các giá trị nhỏ hơn, lớn hơn hoặc bằng. Có khả năng là hành vi tăng-lên-một có thể thay đổi trong một phiên bản CE tương lai, mặc dù nó vẫn sẽ là hành vi tăng đều.
- Nói đúng ra, sự tăng lên của USN là không theo sự điều khiển của bạn. Máy chủ CE tăng USN bất cứ khi nào đối tượng đã tồn tại được cập nhật, chứ không chỉ khi một ai đó đã yêu cầu một số thứ tự mới.
- Bạn sẽ vẫn phải thực hiện số các chuyến đi khứ hồi của máy chủ giống nhau để cập nhật đối tượng bộ phân phối hoặc tìm nạp giá trị USN. Không có lợi thế về hiệu năng nào.
### Nhiều bộ phân phối
Bất kể kỹ thuật mà bạn sử dụng cho mã thực hiện, việc cập nhật liên tục một đối tượng duy nhất có thể gây ra một điểm nóng hiệu năng trong kho lưu trữ nếu khối lượng cập nhật cao. Với cao, chúng ta muốn nói là cao theo các tiêu chuẩn cơ sở dữ liệu. Vì vậy, ngay cả vài ngàn lần cập nhật mỗi ngày cũng không chắc là một vấn đề. Với các khối lượng rất cao, bạn có thể muốn làm cho nhiều thứ có thể mở rộng hơn bằng cách dùng nhiều đối tượng bộ phân phối với nhau mỗi bộ chịu trách nhiệm về một số dải giá trị. Nói cách khác, các giá trị được phân phối bởi các cá thể bộ phân phối khác nhau vẫn là duy nhất theo tổng thể.
### Về API phiên bản Java 3.x
API phiên bản Java 3.x của CE không để lộ ra Số thứ tự cập nhật được sử dụng ở trên. Trên thực tế, với hầu hết các hoạt động, mà API chuyển những thứ này lên phần đầu của chúng và sử dụng một chính sách người viết-sau cùng-sẽ thắng. Điều đó là có thể, nhưng quả khá là khó để viết một bộ phân phối vừa đúng chức năng lại vừa đúng hiệu năng trong API phiên bản Java 3.x . Nếu các ràng buộc nghiệp vụ của bạn cho phép nó, thì điều tốt nhất để bạn làm sẽ là di chuyển một phần (hoặc tất cả) ứng dụng của bạn theo các API phiên bản 4.x của CE.
## Suy nghĩ cuối cùng
Bài viết này đã trình bày nhiều kỹ thuật để triển khai thực hiện một bộ phân phối số thứ tự. Giống như mọi thứ khác, có bao nhiêu vấn đề mà bạn muốn tiếp tục là tùy thuộc một phần vào các yêu cầu nghiệp vụ và bất cứ điều gì khác mà bạn có trong lịch trình thực hiện của mình. Nếu ai đó hỏi tôi triển khai thực hiện điều này theo một cách cởi mở, hoàn toàn mạ vàng, thì nó sẽ giống như thế này:
- Sử dụng mã người viết-đầu tiên-thắng cuộc tương tự như trong Liệt kê 3.
- Đặt mã đó trong một servlet J2EE đơn giản. Bằng cách triển khai nó trong một thùng chứa Web J2EE, chúng ta sẽ tự động có được việc điều chỉnh quy mô, dự phòng lỗi, cách ly và các lợi ích khác của cơ sở hạ tầng J2EE.
- Hạn chế quyền truy cập viết P8 vào đối tượng hoặc các đối tượng bộ phân phối sao cho những người dùng bình thường không thể bỏ qua servlet để cập nhật giá trị đó.
- Cấu hình servlet với một vai trò RunAs có các quyền của Máy nội dung
(CE) để cập nhật các đối tượng bộ phân phối. (Xem thanh bên
[Sử dụng một servlet J2EE](#sidebarj2eeservlet)).
- Nếu cần, hãy triển khai thực hiện một số lược đồ để xác minh rằng những người yêu cầu có quyền đòi hỏi bộ phân phối cho một số. Điều này sẽ chỉ thú vị nếu có một mối quan tâm về các số bị lãng phí.
- Hãy bắt đầu servlet với một giả định lạc quan rằng một chuyến đi khứ
hồi sẽ có chi phí thông thường để nhận được một số từ một bộ phân
phối. Nói cách khác, hãy bắt đầu với
feelingUnluckylà sai. Hãy theo dõi xem bao lâu thì điều đó chuyển thành sai trên thực tế. Khi nó sai nhiều hơn một tỷ lệ phần trăm thời gian, hãy chuyển sang khung nhìn bi quan để luôn trả tiền cho chi phí hai chuyến đi khứ hồi. Theo định kỳ hãy chuyển trở lại khung nhìn lạc quan để xem mọi thứ đã thay đổi chưa.
- Khi cần thiết, hãy cung cấp mã tiện ích phía máy khách để thực hiện các cuộc gọi đến servlet để nhận được các số thứ tự.
Không cần phải nói, tôi cũng sẽ yêu cầu thanh toán về các bánh nướng nhỏ này. Ngon tuyệt!
## Tài nguyên
### Học tập
- Có một số Sách Đỏ của IBM liên quan đến
các sản phẩm IBM FileNet. Những quyển sách này cũng đi vượt ra ngoài các
API CE và PE, là trọng tâm của loạt bài này, nhưng dù sao chúng là vô giá
để đạt được những hiểu biết sâu sắc về các bộ sản phẩm này. Chúng tôi đề
xuất nên bắt đầu với
[Các khuyến nghị và các cách làm tốt nhất về triển khai thực hiện quản lý nội dung của IBM FileNet](http://www.redbooks.ibm.com/abstracts/sg247547.html)và [Giới thiệu Nhà quản lý quy trình nghiệp vụ của IBM FileNet](http://www.redbooks.ibm.com/abstracts/sg247509.html). Hãy tìm thêm chi tiết về các sách Đỏ của IBM bằng cách tìm kiếm các trang web có từ [filenet](http://www.redbooks.ibm.com/cgi-bin/searchsite.cgi?query=filenet). Có thể tải về các sách Đỏ của IBM điện tử miễn phí hoặc mua sách in.
- IBM developerWorks chứa các tư liệu khác
nhau liên quan đến các sản phẩm IBM FileNet của nhiều tác giả. Bạn có thể
tìm thấy nội dung này bằng cách tìm kiếm trang web IBM developerWorks có
từ
[FileNet](http://www.ibm.com/developerworks/search/searchResults.jsp?searchType=1&searchSite=dW&searchScope=dW&query=filenet&Search=Search&S_TACT=105AGY75). Dưới đây là một vài bài viết cụ thể mà chúng tôi khuyên bạn nên đọc thêm.
- Hướng dẫn
[Phát triển các ứng dụng bằng cách sử dụng các API Java Quản lý nội dung doanh nghiệp của IBM với Nhà phát triển ứng dụng Rational của IBM](http://www.ibm.com/developerworks/edu/dm-dw-dm-0804hulme-i.html?S_TACT=105AGY75&S_CMP=FP)so sánh các kỹ thuật mã hóa với các API cho các sản phẩm ECM khác nhau của IBM, bao gồm Nhà quản lý nội dung FileNet của IBM.
- Bài
[Nâng cấp từ FileNet P8 3.5 lên 4.0: Một sự chuyển dịch kiến trúc](http://www.ibm.com/developerworks/db2/library/techarticle/dm-0802grosse/index.html?S_TACT=105AGY75)nêu bật một số trong khía cạnh quan trọng về cách nền tảng P8 tích hợp với J2EE như thế nào. Hiểu về tích hợp kiến trúc của P8 với J2EE là chìa khóa để hiểu cách phát triển các giải pháp tùy chỉnh.
- Loạt bài
[Phát triển các thành phần tùy chỉnh FileNet P8 BPM 4.0 khi sử dụng Eclipse](http://www.ibm.com/developerworks/data/library/techarticle/dm-0812dang/?S_TACT=105AGY75)cho thấy các thủ thuật và các phím tắt trong quá trình phát triển một thành phần tùy chỉnh cho BPM của IBM FileNet.
- Loạt bài
[Xây dựng các ứng dụng BPM bằng cách sử dụng FileNet](http://www.ibm.com/developerworks/views/db2/libraryview.jsp?search_by=bpm%20filenet%20series&S_TACT=105AGY75)đưa ra một mô tả cụ thể về cách xây dựng một loại hình rất phổ biến của giải pháp bằng cách sử dụng Khung công tác quy trình nghiệp vụ (BPF) FileNet của IBM.
### Lấy sản phẩm và công nghệ
- Điểm xuất phát của
bạn để có thông tin về các đề xuất IBM ECM là
[Quản lý nội dung doanh nghiệp](http://www.ibm.com/software/ecm). Trong vùng [Thư viện](http://www-01.ibm.com/software/data/content-management/library.html), bạn sẽ tìm thấy nhiều trang trắng, các bản tóm tắt sản phẩm, các báo cáo phân tích và thông tin sản phẩm khác. Toàn bộ tài liệu nền tảng P8, cho các API và các khía cạnh khác, có sẵn tại [Tài liệu sản phẩm cho Nền tảng P8 của FileNet](http://www-01.ibm.com/support/docview.wss?rs=3278&uid=swg27010422).
### Thảo luận
- Có nhiều diễn đàn của developerWorks
[liên quan đến ECM](http://www.ibm.com/developerworks/db2/community/index.html#ecm?S_TACT=105AGY75)bao gồm một số diễn đàn nhỏ liên quan đặc biệt đến các sản phẩm FileNet của IBM. Cụ thể, hãy truy cập vào diễn đàn [IBM FileNet Content Manager](http://www.ibm.com/developerworks/forums/forum.jspa?forumID=1165&S_TACT=105AGY75)và diễn đàn [FileNet Business Process Manager](http://www.ibm.com/developerworks/forums/forum.jspa?forumID=1124&S_TACT=105AGY75)(Nhà quản lý quy trình nghiệp vụ FileNet). Các diễn đàn này chủ yếu dẫn dắt bởi cộng đồng và không thay thế cho các cơ chế hỗ trợ sản phẩm chính thức.
## Bình luận
[Vùng dữ liệu trên developerWorks](http://www.ibm.com/developerworks/vn/views/data/libraryview.jsp)
Khám phá các bài viết xoay quanh lĩnh vực dữ liệu, Quản lý hệ thống thông tin
[Vùng mã nguồn mở trên developerWorks](http://www.ibm.com/developerworks/vn/views/opensource/libraryview.jsp)
Xem các bài viết về HTML, CSS, JavaScript,...
[Điện toán đám mây](http://www.ibm.com/developerworks/vn/views/cloud/libraryview.jsp)
Tìm hiểu về điện toán đám mây

Content-Language: en-US


text:
Danh Mục Chính
CÁC MẪU ĐƠN
Mẫu Xin Cầu An
Mẫu Xin Cầu Siêu
Mẫu Ký Tự Hương Linh
Mẫu Xin Quy Y Tam Bảo
Ghi Danh Học Tiếng Việt
CÂU HỎI PHẬT PHÁP
Đức Phật nói Kinh gì cuối cùng ?
Kinh Bát Nhã
Kinh Di Giáo
Kinh Phạm Võng
Kinh Di Đà
Kết quả
Những thăm dò khác
Bài trả lời
291
Thành viên có mặt
Khách:
002
Thành viên:
000
Tổng cộng
002
Hits
026233973
Kho Lưu Bài Viết
Tháng Một 2015
T2
T3
T4
T5
T6
T7
CN
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
≤
<
≡
>
≥
TÌM KIẾM (SEARCH)
Music
»
Nhạc Quê Hương
»
Hát Về Miền Trung
30.01.2015 06:54
Hát Về Miền Trung
Nhạc sỹ:
Uy Thi Ca
Ca sỹ:
Bảo Yến
Album:
Hát Về Miền Trung
Thể loại:
Nhạc Quê Hương
Số lượt nghe:
11232
Số lượt download:
172
Đánh giá
5 sao
4 sao
3 sao
2 sao
1 sao
Gửi cho bạn bè qua Chat,bạn copy link này:
Yêu thích
Gửi tặng
Cảm nhận
Đăng nhạc
Tải về
Báo lỗi
Các nhạc phẩm trong album
Một Trái Tim Một Quê Hương
Lam Trường
Em Lễ Chùa
Kim Ngọc
Về Thăm Chùa Huế
Thùy Dương
Hoài Cố Đô
Vân Khánh
Nhớ Mái Chùa Xưa
Việt Hùng
Nhớ Chùa
Trọng Nghĩa
Từ Đàm Quê Hương Tôi
Hồng Vân
Hát Về Miền Trung
Bảo Yến
Các nhạc phẩm của nhạc sỹ Uy Thi Ca
Vu Lan Nhạc Khúc
Bích Phượng
Tình Mẹ
Trang Mỹ Dung
Hát Về Miền Trung
Bảo Yến
Nhớ Mùa Hoa Mận
Như Quỳnh
Về Với Mẹ
Bảo Yến
Umdambara
Chưa biết
Các nhạc phẩm do Bảo Yến Trình bày
Chuyển Pháp Luân
Võ Tá Hân
Chú Vãng Sanh
Võ Tá Hân
Phúc Mệnh
Võ Tá Hân
Sám Thập Phương
Võ Tá Hân
Khai Dòng Thánh Sử
Võ Tá Hân
Vặn Nước Rửa Tay
Thi Kệ Thích Nhất Hạnh
Bước Chân Hoa Nở
Võ Tá Hân
Tiếng Chuông Mùa Xuân
Giác An
Thoát Tục
Võ Tá Hân
Hát Về Miền Trung
Uy Thi Ca
Ngàn Mắt Ngàn Tay
Nguyên Hạnh
Mẹ Hiền Về Giữa Mùa Xuân
Nguyễn Đức Cường
Về Với Mẹ
Uy Thi Ca
Cúng Hương Tán Phật
Võ Tá Hân
Âm Nhạc Phật Giáo
Nhạc Phật Đản
Nhạc Vu Lan
Nhạc Tình Cha Mẹ
Nhạc Mẹ Hiền Quan Âm
Nhạc Lễ Phật Giáo
Nhạc Thiền
Nhạc Sinh Hoạt
Nhạc Phật Giáo Tổng Hợp
Nhạc Quê Hương
Cổ Nhạc Phật Giáo
Cải Lương Phật Giáo (Video)
Ngâm Thơ - Thi Ca
Nhạc Chưa Có Trong Album
Pháp Âm và Nghi Lễ
Kinh Tụng
Pháp Thoại
Truyện Đọc
Nghi Lễ Tán Tụng
Chẩn Tế và Bạt Độ (Video)
Phim Truyện
Tìm kiếm
Tìm theo
Nhạc phầm
Ca sỹ
Nhạc sỹ
Lời bài hát
Nhạc phẩm bắt đầu bằng:
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
10 Tác phẩm mới nhất
Mùa Xuân Em Đi Lễ Chùa
Tuyết Nhung
Xin Cho Em Mùa Xuân
Huy Bảo
Xin Chúc Mừng Xuân
Hoàng Thúc
Xuân Bốn Mùa
Tố Ny
Xuân Còn Mãi Nhân Gian
Hồ Bích Ngọc
Bảo Lụt Tại Queensland
Sơn Ca & Hoàng Minh
Bảo Lụt Tại Queensland
Hoàng Minh
Người Con Đức Phật
Hợp Ca
Hình Bóng Thầy
Hoàng Kim
Hạnh Nguyện Cưu Mang
Hồ Cẩm Nghi
10 Tác phẩm nghe nhiều nhất
Ánh Đạo Vàng
Thùy Dương
Mẹ Hiền Quan Thế Âm Bồ Tát
Phương Thủy
Đêm Tụng Kinh Pháp Hoa
Phương Thanh
Thích Ca Mâu Ni Phật
Phượng Bằng
Ai Bảo Ăn Chay Là Khổ
Chí Tâm
Mừng Ngày Phật Đản
Hà Thanh
Mẹ Từ Bi
Mai Thành
Tâm Sự Người Cài Hoa Trắng
Cao Duy
Thiền Hành
Nhã Phương
Tình Pháp Duyên Tăng
Chí Tâm
10 Bài Nghi Lễ nghe nhiều nhất
Tụng Chú Đại Bi
Quý Thầy (Điệu Huế)
Tụng Chú Phổ Am
Quý Thầy (Điệu Huế)
Tán rơi bài Dương Chi Tịnh Thủy
Quý Thầy (Điệu Huế)
Câu chung bảng, 3 hồi chuông trống Bát Nhã
Quý Thầy (Điệu Huế)
Tụng chú Thất Phật Diệt Tội Chơn Ngôn
Quý Thầy (Điệu Huế)
Thỉnh Tam Bảo
Quý Thầy (Điệu Huế)
Nhạc niêm hương (Bài Long Ngâm)
Quý Thầy (Điệu Huế)
Nhạc Thỉnh Sư (bài Đăng Đàn Kép)
Quý Thầy (Điệu Huế)
Khai 3 Hồi Chuông Báo Chúng
Quý Thầy (Điệu Huế)
Tụng Tựa Lăng Nghiêm
Quý Thầy (Điệu Huế)
Mọi ý kiến xây dựng, đóng góp hoặc gửi tin tức, bài vở xin liên lạc: • e-mail:
banbientap@phoquang.org
Hỗ trợ kỷ thuật xin liên lạc • e-mail:
webmaster@phoquang.org

WARC-Type: response

Content-Type: application/http; msgtype=response

WARC-Truncated: length

Server: Apache

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

Pragma: no-cache

Set-Cookie: lang=vietnamese; expires=Sat, 30-Jan-2016 13:54:13 GMT; path=/

Connection: close

Content-Type: text/html; charset=utf-8


text:
Để tiện các bạn có thể liên hệ thuận lợi với cơ quan thuế có thẩm quyền để thực hiện các thủ tục thành chính thuế, www.tapchithue.com cung cấp thông tin về hệ thống địa chỉ của cơ quan thuế có thẩm quyền tại trung ương cũng như địa phương của 63 tỉnh, thành phố..
Địa chỉ: Đường 1 A - Phường Tân Thành- Thị xã Ninh Bình
Điện thoại 030 - 872.595
® Thiet ke web: V&A Vietnam © Bản quyền TapChiThue.com® Ghi rõ "Nguồn: TapChiThue.com" khi phát hành lại thông tin từ website này

Vary: Accept-Encoding

Content-Encoding: gzip

Content-Type: text/html


text:
1. Trà Tam thất – Xạ đen là sản phẩm độc đáo của Học viện quân y, giúp hỗ trợ điều trị ung thư
Cây xạ đen còn được gọi là cây dây gối, quả nâu, dân tộc Mường gọi là cây ung thư, tên khoa học gọi là Celastrus hindsu Benth. Thân cây dạng dây dài 3-10m. Cành tròn , lúc non có màu xám nhạt, sau chuyển sang màu nâu, có lông, về sau có màu xanh. Cây xạ đen được phân bố ở nhiều nước như : Trung Quốc, Việt Nam, Myanmar, Thái-lan... Ở Trung Quốc, loại cây này thường mọc ở độ cao từ 1.000 - 1.500 m. Còn ở nước ta, xạ đen phân bố chủ yếu tại các tỉnh Hà Nam, Quảng Ninh, Ninh Bình, Hòa Bình, Vườn quốc gia Cúc Phương, Vườn quốc gia Ba Vì, Thừa Thiên - Huế, Gia Lai... Công dụng: Phòng chống ung thư, lở ngứa, mụn nhọt; Điều trị, ức chế và ngăn ngừa sự phát triển của tế bào ung thư, tiêu hạch, tiêu độc, thanh nhiệt, mát gan, hành thủy, điều hòa hoạt huyết, giảm đau, an thần, tăng cường sức đề kháng cho cơ thể;
Tam thất có hai tác dụng chính là cầm máu và bổ dưỡng do chứa saponin triterpen là ginsenozid, một hoạt chất quý của nhân sâm. Gần đây, tam thất còn được dùng trong một số trường hợp ung thư (phổi, tuyến tiền liệt, vòm họng, vú) với kết quả tốt.
Xạ đen đã được các nhà khoa học của Học Viện Quân Y chọn lọc, nghiên cứu, nuôi trồng theo tiêu chuẩn sạch và bào chế trên dây truyền công nghệ hiện đại làm nên sản phẩm trà Tam Thất- Xạ đen. Cùng với xạ đen, tam thất cũng là các dược liệu quý hiếm có trong Trà Tam thất - Xạ đen. Trà Tam thất – Xạ đen là sản phẩm được tiếp thu chọn lọc tinh hoa của Y học cổ truyền, từ những vị thuốc quý hiếm có công dụng đặc hiệu đáp ứng nhu cầu phòng và hỗ trợ điều trị những chứng nan y phát sinh trong thời đại công nghiệp.
2. Kết quả nghiên cứu dược liệu sản xuất trà Tam Thất – Xạ Đen
Nhiều chục năm trước, cây xạ đen (hay xạ đen cuống, tiếng Mường gọi là Xạ cái) từng được lương y dân tộc Mường Bùi Thị Bẻn (bệnh nhân thường gọi là mế Hậu, ở huyện Kim Bôi, Hoà Bình) đặt tên là cây ung thư, chuyên dùng để chữa các loại u khối. Bài thuốc cây xạ đen, dù sau đó được mế tặng cho Hội Đông y tỉnh Hoà Bình, vẫn ít người biết đến; Chỉ kể từ năm 1987, khi được đoàn bác sĩ Học viện Quân y (do GS.TSKH Lê Thế Trung - Chủ tịch Hội Ung thư TP.Hà Nội dẫn đầu) phát hiện trong chuyến sưu tầm các bài thuốc quý trong dân gian, cây xạ đen mới bắt đầu thu hút sự chú ý của giới khoa học và được đưa về cơ sở này để nghiên cứu. Sau 12 năm nghiên cứu, hiện Học Viện Quân Y đã chiết suất được từ loài cây này một loại tinh thể có khả năng ức chế sự phát triển của tế bào ung thư; Qua nghiên cứu về thực vật học, hoá dược, dược lý, nghiên cứu thực nghiệm trên động vật được gây ung thư (theo đề tài cấp Bộ về xạ đen do GS. Lê Thế Trung làm chủ nhiệm), các bác sĩ đã phát hiện ở loài cây này tác dụng hạn chế sự phát triển của khối u ác tính.
Tam thất là rễ của cây tam thất, còn gọi là sâm tam thất. Trước đây được coi như vị thuốc “giả nhân sâm”, ý nói có thể thay nhân sâm. Chính vì vậy mà ngay tên khoa học của nó cũng phản ánh được điều này: Panax pseudo ginseng Wall. Ở đây từ Panax mang ý nghĩa tên "chi" của nhân sâm (về phân loại thực vật), xuất phát từ tiếng Hy Lạp Panacen, tức là chữa được rất nhiều loại bệnh. Còn pseudo, có nghĩa là giả và ginseng là phiên âm từ nhân sâm. Ngày nay tên khoa học của tam thất là Panax Notoginseng (Bark.) F.H. Chen, họ nhân sâm Araliaceae (ngũ gia bì). Trong Đông y, tam thất còn được gọi là "kim bất hoán", "kim", tức là vàng, bất hoán, là không đổi được; có nghĩa là vị thuốc tam thất rất quý, đến mức có vàng cũng không thể đổi được. Tác dụng sinh học của tam thất: Tam thất có tác dụng tăng lực rất tốt, tác dụng này giống với tác dụng của nhân sâm; rút ngắn thời gian đông máu; tiêu máu ứ và tăng lưu lượng máu ở động mạch vành của động vật thí nghiệm. Làm tăng sức co bóp cơ tim ở liều thấp; tác dụng kích dục, đối với chức năng nội tiết sinh dục nữ, thể hiện ở các hoạt tính oestrogen và hướng sinh dục; giãn mạch ngoại vi và không ảnh hưởng đến huyết áp và hệ thần kinh trung ương; điều hòa miễn dịch; kích thích tâm thần, chống trầm uất. Tại sao tam thất lại tác dụng tốt như vậy: Tam thất cũng chứa các hợp chất giống như nhân sâm. Các bộ phận của cây như rễ con, lá, hoa tam thất đều chứa các hợp chất saponosid nhóm dammaran. Ngoài ra còn phải kể đến các thành phần có giá trị khác như các acid amin, các chất polyacetylen và panaxytriol… Sự kết hợp giữa Xạ đen- một thành phần có tác dụng ức chế sự phát triển của ung thư, hạn chế sự phát triển của khối u ác tính với Tam thất- một thành phần tăng lực và điều hoà miễn dịch đã được các nhà khoa học của Học Viện Quân Y nghiên cứu kỹ lưỡng, tạo nên một sản phẩm Trà có tác dụng hỗ trợ điều trị ung thư tốt- Trà Tam Thất –Xạ đen.
3. Công dụng của trà Tam Thất – Xạ Đen
Trà Tam thất – Xạ đen giúp tăng cường sức đề kháng của cơ thể. Hạn chế sự hình thành và phát triển của khối u, tế bào ung bướu. Hỗ trợ điều trị ung bướu.
4. Tại sao nên dùng trà Tam Thất – Xạ Đen hàng ngày ?
Dược liệu bào chế trà Tam Thất – Xạ đen đã được các giáo sư, các nhà khoa học của Học Viện Quân Y nghiên cứu kỹ lưỡng khẳng định không có độc tính, có thể sử dụng lâu dài không ảnh hưởng đến chức năng sinh lý. Các thành phần trong trà Tam Thất – Xạ đen có tác dụng tăng cường sức đề kháng của cơ thể. Hạn chế sự hình thành và phát triển của khối u, tế bào ung bướu. Hỗ trợ điều trị ung bướu.
Dùng trà Tam thất – Xạ đen một thời gian sẽ thấy hiệu quả, sức khỏe ổn định và không có tác dụng phụ.
5. Những lưu ý khi dùng trà Tam Thất – Xạ Đen
Trà Tam Thất – Xạ Đen không dùng thay thế thuốc chữa bệnh.
6. Cách dùng
Cho gói trà vào cốc hoặc ấm pha trà, hãm bằng nước đun sôi, sau 3 phút rồi uống. Uống mỗi ngày cho sức khỏe tuyệt vời.

markdown:
**1. Trà Tam thất – Xạ đen ** **là sản phẩm độc đáo của Học viện quân y, giúp hỗ trợ ** **điều trị ung thư**
Cây xạ đen còn được gọi là cây dây gối, quả nâu, dân tộc Mường gọi là cây ung thư, tên khoa học gọi là Celastrus hindsu Benth. Thân cây dạng dây dài 3-10m. Cành tròn , lúc non có màu xám nhạt, sau chuyển sang màu nâu, có lông, về sau có màu xanh. Cây xạ đen được phân bố ở nhiều nước như : Trung Quốc, Việt Nam, Myanmar, Thái-lan... Ở Trung Quốc, loại cây này thường mọc ở độ cao từ 1.000 - 1.500 m. Còn ở nước ta, xạ đen phân bố chủ yếu tại các tỉnh Hà Nam, Quảng Ninh, Ninh Bình, Hòa Bình, Vườn quốc gia Cúc Phương, Vườn quốc gia Ba Vì, Thừa Thiên - Huế, Gia Lai... Công dụng: Phòng chống ung thư, lở ngứa, mụn nhọt; Điều trị, ức chế và ngăn ngừa sự phát triển của tế bào ung thư, tiêu hạch, tiêu độc, thanh nhiệt, mát gan, hành thủy, điều hòa hoạt huyết, giảm đau, an thần, tăng cường sức đề kháng cho cơ thể;
Tam thất có hai tác dụng chính là cầm máu và bổ dưỡng do chứa saponin triterpen là ginsenozid, một hoạt chất quý của nhân sâm. Gần đây, tam thất còn được dùng trong một số trường hợp ung thư (phổi, tuyến tiền liệt, vòm họng, vú) với kết quả tốt.
Xạ đen đã được các nhà khoa học của Học Viện Quân Y chọn lọc, nghiên cứu, nuôi trồng theo tiêu chuẩn sạch và bào chế trên dây truyền công nghệ hiện đại làm nên sản phẩm trà Tam Thất- Xạ đen. Cùng với xạ đen, tam thất cũng là các dược liệu quý hiếm có trong Trà Tam thất - Xạ đen. Trà Tam thất – Xạ đen là sản phẩm được tiếp thu chọn lọc tinh hoa của Y học cổ truyền, từ những vị thuốc quý hiếm có công dụng đặc hiệu đáp ứng nhu cầu phòng và hỗ trợ điều trị những chứng nan y phát sinh trong thời đại công nghiệp.
**2. Kết quả nghiên cứu dược liệu ** **sản xuất trà ** **Tam Thất – Xạ Đen**
Nhiều chục năm trước, cây xạ đen (hay xạ đen cuống, tiếng Mường gọi là Xạ cái) từng được lương y dân tộc Mường Bùi Thị Bẻn (bệnh nhân thường gọi là mế Hậu, ở huyện Kim Bôi, Hoà Bình) đặt tên là cây ung thư, chuyên dùng để chữa các loại u khối. Bài thuốc cây xạ đen, dù sau đó được mế tặng cho Hội Đông y tỉnh Hoà Bình, vẫn ít người biết đến; Chỉ kể từ năm 1987, khi được đoàn bác sĩ Học viện Quân y (do GS.TSKH Lê Thế Trung - Chủ tịch Hội Ung thư TP.Hà Nội dẫn đầu) phát hiện trong chuyến sưu tầm các bài thuốc quý trong dân gian, cây xạ đen mới bắt đầu thu hút sự chú ý của giới khoa học và được đưa về cơ sở này để nghiên cứu. Sau 12 năm nghiên cứu, hiện Học Viện Quân Y đã chiết suất được từ loài cây này một loại tinh thể có khả năng ức chế sự phát triển của tế bào ung thư; Qua nghiên cứu về thực vật học, hoá dược, dược lý, nghiên cứu thực nghiệm trên động vật được gây ung thư (theo đề tài cấp Bộ về xạ đen do GS. Lê Thế Trung làm chủ nhiệm), các bác sĩ đã phát hiện ở loài cây này tác dụng hạn chế sự phát triển của khối u ác tính.
Tam thất là rễ của cây tam thất, còn gọi là sâm tam thất. Trước đây được coi như vị thuốc “giả nhân sâm”, ý nói có thể thay nhân sâm. Chính vì vậy mà ngay tên khoa học của nó cũng phản ánh được điều này: Panax pseudo ginseng Wall. Ở đây từ Panax mang ý nghĩa tên "chi" của nhân sâm (về phân loại thực vật), xuất phát từ tiếng Hy Lạp Panacen, tức là chữa được rất nhiều loại bệnh. Còn pseudo, có nghĩa là giả và ginseng là phiên âm từ nhân sâm. Ngày nay tên khoa học của tam thất là Panax Notoginseng (Bark.) F.H. Chen, họ nhân sâm Araliaceae (ngũ gia bì). Trong Đông y, tam thất còn được gọi là "kim bất hoán", "kim", tức là vàng, bất hoán, là không đổi được; có nghĩa là vị thuốc tam thất rất quý, đến mức có vàng cũng không thể đổi được. Tác dụng sinh học của tam thất: Tam thất có tác dụng tăng lực rất tốt, tác dụng này giống với tác dụng của nhân sâm; rút ngắn thời gian đông máu; tiêu máu ứ và tăng lưu lượng máu ở động mạch vành của động vật thí nghiệm. Làm tăng sức co bóp cơ tim ở liều thấp; tác dụng kích dục, đối với chức năng nội tiết sinh dục nữ, thể hiện ở các hoạt tính oestrogen và hướng sinh dục; giãn mạch ngoại vi và không ảnh hưởng đến huyết áp và hệ thần kinh trung ương; điều hòa miễn dịch; kích thích tâm thần, chống trầm uất. Tại sao tam thất lại tác dụng tốt như vậy: Tam thất cũng chứa các hợp chất giống như nhân sâm. Các bộ phận của cây như rễ con, lá, hoa tam thất đều chứa các hợp chất saponosid nhóm dammaran. Ngoài ra còn phải kể đến các thành phần có giá trị khác như các acid amin, các chất polyacetylen và panaxytriol… Sự kết hợp giữa Xạ đen- một thành phần có tác dụng ức chế sự phát triển của ung thư, hạn chế sự phát triển của khối u ác tính với Tam thất- một thành phần tăng lực và điều hoà miễn dịch đã được các nhà khoa học của Học Viện Quân Y nghiên cứu kỹ lưỡng, tạo nên một sản phẩm Trà có tác dụng hỗ trợ điều trị ung thư tốt- Trà Tam Thất –Xạ đen.
**3. Công dụng của trà Tam Thất – Xạ Đen**
Trà Tam thất – Xạ đen giúp tăng cường sức đề kháng của cơ thể. Hạn chế sự hình thành và phát triển của khối u, tế bào ung bướu. Hỗ trợ điều trị ung bướu.
**4. Tại sao nên dùng trà Tam Thất – Xạ Đen hàng ngày ?**
Dược liệu bào chế trà Tam Thất – Xạ đen đã được các giáo sư, các nhà khoa học của Học Viện Quân Y nghiên cứu kỹ lưỡng khẳng định không có độc tính, có thể sử dụng lâu dài không ảnh hưởng đến chức năng sinh lý. Các thành phần trong trà Tam Thất – Xạ đen có tác dụng tăng cường sức đề kháng của cơ thể. Hạn chế sự hình thành và phát triển của khối u, tế bào ung bướu. Hỗ trợ điều trị ung bướu.
Dùng trà Tam thất – Xạ đen một thời gian sẽ thấy hiệu quả, sức khỏe ổn định và không có tác dụng phụ.
**5. Những lưu ý khi dùng trà Tam Thất – Xạ Đen**
Trà Tam Thất – Xạ Đen không dùng thay thế thuốc chữa bệnh.
**6. Cách dùng**
Cho gói trà vào cốc hoặc ấm pha trà, hãm bằng nước đun sôi, sau 3 phút rồi uống. Uống mỗi ngày cho sức khỏe tuyệt vời.

Set-Cookie: history_product=2003126%7C0; path=/

Content-Type: text/html; charset=UTF-8


text:
Gian hàng bán
Rao vặt
Hỏi đáp
Thêm
Danh sách gian hàng
Tin tức từ Vatgia.com
Để kinh doanh Online thành công
Đánh giá sản phẩm
BaoKim.vn
CucRe.vn
MyTour.vn
Nhanh.vn
WebBNC.net
Sản phẩm
Sản phẩm
Rao vặt
Hỏi đáp
Cửa hàng
Tìm trong danh mục
Sách
Thiết bị giáo dục
Thiết bị văn phòng
Văn phòng phẩm
Hỗ trợ
Tuyển dụng
Nạp tiền
Đăng ký
Đăng ký thành viên
Đăng ký gian hàng
Đăng nhập
Tên truy cập:
Mật khẩu:
Nhớ mật khẩu
Quên mật khẩu
Toàn bộ danh mục
Bộ sách giáo khoa lớp 1 (14 cuốn)
Báo lỗi sản phẩm
So sánh với sản phẩm khác
Thông số kỹ thuật
Xem chi tiết
Loại sách:
Sách giáo khoa - Cấp I
Số trang:
616
Kích cỡ:
17x24cm
Nhà xuất bản:
Giáo Dục
Tìm theo vần:
B
Hình thức bìa:
Bìa mềm
Người mua xem sản phẩm này thường xem thêm.
Panasonic KX-BP0385
Liên hệ gian hàng...
Bảng ghim vải bố 40 x 60cm
377.000₫ / cái
Tủ bảo mật 2 lớp TS2L2C...
5.000.000₫
Bộ sách lớp 1 - Chương trình...
180.000₫
Cùng Loại sách
Giải vở bài tập toán 4 - tập 2
15.000₫
Bộ sách giáo khoa lớp 1
125.000₫
Bộ sgk lớp 2 (14 cuốn)
130.000₫
Bộ sách giáo khoa lớp 3
140.000₫
Mô hình kỹ thuật môn kỹ thuật...
54.000₫
Bộ thực hành tiếng việt và...
64.000₫
Bộ dụng cụ kỹ thuật: cắt,...
64.000₫
Bộ đồ dùng học toán thực hành...
28.000₫
Bộ sách khoa lớp 4 ( trọn bộ...
148.000₫
Có
77.523
sản phẩm
Sách, đồ văn phòng
Sách (Xem tất cả)
Tìm kiếm nâng cao
Theo khoảng giá (VNĐ)
Từ :
Đến :
Theo Tỉnh/ Thành phố
Hà Nội
(67344)
Hồ Chí Minh
(2046)
Đồng Nai
(393)
Hải Phòng
(2)
Đà Nẵng
(7)
An Giang
(2)
Bà Rịa - Vũng Tàu
(13)
Bắc Ninh
(12)
Hà Nội 2
(5)
Hải Dương
(4)
Khánh Hòa
(2)
Quảng Trị
(392)
Thái Bình
(2)
Tuyên Quang
(7)
... Xem thêm
Loại sách
Kinh tế
(4669)
Sách tham khảo
(8406)
Thiếu nhi
(8800)
Truyện tranh
(13255)
Văn học nước ngoài
(6546)
Văn học việt nam
(4651)
Bí quyết, cẩm nang
(1710)
Chính trị - Lịch sử - Địa Lý
(2068)
Ngoại ngữ
(2904)
Tâm lý
(1869)
Y học
(1611)
Âm nhạc
(647)
Ẩm thực
(134)
Báo chí-Phát thanh-Truyền hình
(97)
Bộ đề thi
(14)
Các chủ đề khác
(445)
Công nghệ thông tin
(1169)
Danh nhân
(1190)
Du lịch
(495)
Khám phá
(7)
Khảo cứu
(62)
Khoa học cơ bản
(494)
Khoa học kỹ thuật
(1483)
Khoa học thần bí
(982)
Khoa học xã hội
(140)
Kiến trúc
(649)
Mỹ thuật
(481)
Nghệ thuật
(8)
Nhiếp ảnh
(17)
Nông, lâm, ngư nghiệp
(599)
Nữ công gia chánh
(330)
Pháp luật
(1435)
Sách Công Đoàn
(2)
Sách Danh nhân
(47)
Sách dạy nghề
(94)
Sách Giáo dục
(116)
Sách giáo khoa
(1126)
Sách học làm người
(743)
Sách Kinh Tế
(71)
Sách nấu ăn
(859)
Sách tôn giáo
(1276)
Sách đảng
(2)
Tài liệu luyện thi
(160)
Tạp chí
(97)
Thể thao
(527)
Thiết kế công nghiệp
(20)
Thiếu Niên
(169)
Thơ
(3)
Thơ, danh ngôn
(89)
Thời Trang
(23)
Tình yêu, hôn nhân, gia đình
(1077)
Triết học
(260)
Từ điển
(580)
Từ điển chuyên ngành
(274)
Văn Hoá - Xã Hội
(1167)
Văn hoá nghệ thuật
(299)
Vật nuôi, cây cảnh, cá cảnh
(246)
Xây dựng
(64)
Đề kiếm tra
(7)
... Xem thêm
Số trang
≥50 trang
(60890)
≥200 trang
(32807)
≥500 trang
(6652)
≥1000 trang
(1247)
Kích cỡ
≤ 8x12cm
(8825)
≤ 9x13.5cm
(8849)
≤ 10x13cm
(9776)
≤ 11x20cm
(11184)
≤ 12x12cm
(20089)
≤ 13x20cm
(34553)
≤ 14x20cm
(40951)
≤ 15x20.5cm
(52208)
≤ 16x24cm
(61144)
≤ 17x24cm
(65380)
≤ 18x21cm
(66274)
≤ 19x19cm
(71393)
≤ 20x28cm
(73191)
≤ 21x25cm
(75378)
≤ 22x20cm
(75579)
≤ 23x19cm
(75693)
≤ 24x16cm
(75787)
≤ 25x25cm
(75960)
≤ 26x15cm
(76038)
≤ 27x18.5cm
(76070)
≤ 29x4cm
(76134)
Nhà xuất bản
Giáo Dục
(2979)
Kim Đồng
(9109)
Mỹ Thuật
(3524)
Trẻ
(7742)
Văn hoá thông tin
(3567)
Văn Học
(3375)
Lao Động
(2247)
Phụ Nữ
(2079)
Thanh Niên
(2185)
Thời Đại
(1989)
Tổng hợp Thành phố Hồ Chí Minh
(2362)
Đang cập nhật
(1757)
20th Century Fox (2006)
(1)
Advance Cad
(16)
Anphabook
(15)
Asbooks
(12)
Atria book
(2)
Báo Sinh viên VN - Hoa Học Trò
(74)
Báo Văn Hóa
(8)
Ben Yeo
(1)
BKHN - Huy Hoàng
(2)
Bộ Giáo Dục
(10)
Cà Mau
(76)
Cengage Learning
(3)
Collins Cobuild
(4)
Compass Publishing
(2)
Công An Nhân Dân
(17)
Công Thương
(31)
Dân Trí - Long Minh
(42)
Dân trí - Đông A
(19)
DC comics
(1)
Filipacchi Publishing
(1)
Forbes Việt Nam
(7)
Giáo Dục Việt Nam
(22)
Giáo dục Việt nam
(707)
H.F. Ullmann
(1)
Heinle Cengage Learning
(1)
Hội Nhà Văn
(642)
Hội nhà văn - Công ty sách Phương Nam
(1)
Hội Nhà Văn - Nhã Nam
(1)
Hồng Bàng
(359)
Hồng Đức - Trí Việt
(26)
Khoa vật lí trường đại học tổng hợp Hà Nội
(4)
Kinh tế quốc dân
(25)
Lao Động&TTHVNN Đông tây
(10)
Li-Zenn
(2)
Little Simon
(2)
Loft
(1)
MACMILLAN
(3)
NXB Hồng Bàng
(2)
NXB TPHCM
(4)
NXB Văn học Viêt Nam
(13)
NXB Đà nẵng
(138)
NXB Đồng Nai
(81)
Page One
(1)
Pepin Press
(1)
Periplus
(1)
Peterson's
(1)
Phương Đông
(219)
Robert Rose
(2)
Sở Thể Thao Văn Hóa và Du Lịch Hà Nội
(1)
Sư phạm
(203)
Sự Thật
(1)
TangArt
(3)
Tectum
(1)
Thời Đại - Đống Đa
(174)
Tiresias-Pari
(1)
Tổng Hợp
(5)
Tổng Hợp TP.HCM - Firstnew
(41)
Trung Tâm Việt Ngữ Hồng Bàng
(13)
Tự lực
(4)
Từ điển Bách khoa
(56)
Tuttle Publishing
(2)
TVM comics
(16)
TĐBK - Văn Lang
(8)
Văn Hóa Thông Tin
(1192)
Văn Hóa Văn Nghệ
(38)
Văn Hóa Văn Nghệ
(169)
Văn Học Nghệ Thuật
(13)
Vạn Phật Thánh Thành
(18)
Vàng Anh
(2)
XB Giáo dục Gia Định
(1)
Đại học Công Nghiệp TP.HCM
(10)
Đại học Hoa Sen
(1)
Đại Học KTQD - Alpha
(3)
Đại học Quốc Gia Hà Nội
(254)
Đại Học Sư Phạm
(337)
Đại học sư phạm Thành phố Hồ Chí Minh
(150)
Đại học Thái Nguyên
(1)
Đâị học tổng hợp sư phạm Matxcơva
(1)
Đại học và trung học chuyên nghiệp
(3)
ĐH Quốc gia TP.HCM
(27)
ĐH Sư phạm TP.HCM
(30)
Âm nhạc
(218)
Anchor Book
(1)
Bách Khoa
(86)
Bản đồ
(10)
Báo Cáo Của NHTG Phối Hợp Với NHPT Châu Á
(1)
Bảo tàng lịch sử Việt Nam
(7)
Bloomsbury
(1)
Bộ Tài Chính
(31)
Britaninca
(1)
Bưu Điện
(34)
Cambridge
(11)
Cambridge University
(3)
Chính trị - Hành chính
(21)
Chính Trị Quốc Gia
(939)
Công an nhân dân
(447)
Công ty sách Thái Hà
(2)
Công ty Văn Hóa Giáo Dục Long Minh
(4)
Dân Trí
(1243)
F&W Publications
(4)
Giao thông vận tải
(601)
Grolier
(2)
H.F. Ullmann
(2)
Hà Nội
(1651)
Hải Phòng
(468)
HarperCollins Publishers
(2)
Hội báo Thừa Thiên Huế
(4)
Hội Nhà Văn
(848)
Hội nhà văn - Công ty Văn hoá Đông A
(1)
Hội Nhà Văn - TTVHNN Đông Tây
(3)
Hồng Đức
(944)
Human Kinetics
(3)
Khoa học Kỹ thuật
(803)
Khoa học tự nhiên và Công Nghệ
(37)
Khoa Học Xã Hội
(431)
KHTN&CN
(4)
Kids for kids
(1)
Lao động - Xã hội
(1904)
Lonely Planet
(75)
Long An
(3)
Lý luận chính trị
(15)
Mc Graw – Hill
(5)
Mũi Cà Mau
(206)
Nghệ An
(26)
Nông Nghiệp
(382)
Omnibus
(1)
Oxford University Press
(58)
Oxford University press
(15)
Pearson Education
(2)
Penguin Book
(2)
Phương Đông
(660)
Quân đội Nhân Dân
(320)
Sân Khấu
(106)
Sở GD - ĐT TP.HCM
(2)
SSDG - Công ty Phần mềm Học Sinh & Sinh Viên
(25)
Tài Chính
(592)
Tân Hoa Xã
(1)
TangArt
(1)
Tạp chí Việt - Mỹ
(2)
Taschen
(3)
Thanh Hoá
(745)
Thành phố Hồ Chí Minh
(763)
Thể Dục Thể Thao
(256)
Thế Giới
(434)
Thomson
(7)
Thống Kê
(950)
Thông tấn
(550)
Thông tin
(29)
Thông tin & truyền thông
(227)
Thuận Hoá
(177)
Tôn giáo
(575)
Tổng cục Thống kê
(7)
Tổng hợp Tiền Giang
(6)
Tổng Hợp Đồng Nai
(256)
Trẻ - Hội Nhà Văn
(4)
Tri Thức
(650)
Tri thức trẻ
(1)
Trí Việt
(30)
Trung tâm công nghệ thông tin du lịch
(1)
Trung tâm xúc tiến du lịch Đà Nẵng
(1)
Trường Đại Học Kinh Tế Quốc Dân
(11)
Trường Đại Học Sư Phạm TPHCM
(34)
Tư pháp
(77)
Từ điển Bách Khoa
(722)
Văn Hoá
(81)
Văn Hóa - Dân Tộc
(73)
Văn hóa Sài Gòn
(996)
Văn Hóa Xã Hội
(13)
Văn Học & TTVHNN Đông Tây
(6)
Văn Nghệ
(149)
Văn Nghệ TP.HCM
(216)
VNA Publishinh House
(2)
World book
(2)
Xây Dựng
(560)
Y Hoc
(312)
Y học - Thời Đại
(2)
Đà Nẵng
(1411)
Đặc San Báo Đầu Tư
(2)
Đại học Bách Khoa
(7)
Đại học Huế
(1)
Đại học kinh tế quốc dân Hà Nội
(114)
Đại học Kinh Tế TPHCM
(12)
Đại học Quốc gia Hà Nội
(1121)
Đại học Sư Phạm
(1044)
Đại Liên Đại học Công nghệ
(3)
Đang cập nhật
(981)
ĐH Quốc Gia TP. HCM
(916)
Đồng Nai
(1011)
Đồng Tháp
(29)
... Xem thêm
Tìm theo vần
B
(7120)
C
(8971)
D
(4895)
H
(4879)
N
(7038)
T
(15909)
G
(2833)
K
(3410)
L
(2965)
M
(2816)
S
(2812)
A
(1366)
E
(584)
F
(223)
I
(345)
J
(87)
O
(665)
P
(2385)
Q
(848)
R
(563)
U
(169)
V
(2091)
W
(161)
X
(381)
Y
(325)
Z
(12)
0
(4)
1
(1555)
2
(421)
3
(482)
4
(179)
5
(397)
6
(131)
7
(175)
8
(123)
9
(169)
... Xem thêm
Hình thức bìa
Bìa mềm
(70393)
Bìa cứng
(2154)
Bìa gấp
(260)
Đang cập nhật
(1483)
Bạn muốn thêm lựa chọn ?
Các từ khóa liên quan.
máy khoan
,
khoa than
,
cửa cuốn
,
khoa cua
,
khoa
,
mũi khoan
,
anh khoa than
,
khoa van tay
,
ao khoac
,
ao khoac nam
,
may khoan
,
hinh khoa than
,
ao khoac nu
,
khoan
,
chung khoan
,
khoa khach san
,
áo khoác
,
bach khoa
,
dụng cụ khoa
,
noi khoa co so
Bộ sách giáo khoa lớp 1 (14 cuốn) - So sánh giá
Lịch sử giá
5.0
/
1
đánh giá
Xếp hạng
8
/ 77.343
So sánh giá
Thông tin chung
Nhận xét
(3)
Đánh giá
(1)
Hỏi đáp
(1)
Hình ảnh
Bạn nghĩ gì về sản phẩm này?
Hiện tại chưa có gian hàng nào bán sản phẩm
Bộ sách giáo khoa lớp 1 (14 cuốn)
trên Vatgia.com
Click vào đây
để bán sản phẩm
Nhận xét về Bộ sách giáo khoa lớp 1 (14 cuốn)
(3)
Anh ngọc 0916610627
·
30/08/2014 - 23:26
Xin hỏi địa chỉ của nhà sách ở đâu ạ? tôi chỉ cần mua sách toán in lớp 1 và vở bài tập đạo đức lớp 1 thì có còn hàng bán không ạ?
Trả lời
·
1
·
08/04/2014 - 14:10
đien a. lop 1 gi co tin
Trả lời
·
0
·
19/02/2014 - 19:44
tai sao ko co sach ti
n
hoc ha
Trả lời
·
Rao vặt liên quan đến Bộ sách giáo khoa lớp 1 (14 cuốn). -
Xem thêm
Sách tài chính quốc tế hay nhất
(200.000 ₫ / cuốn)
Sách tài chính tiên tệ hay nhất
(50.000 ₫ / cuốn)
Mua sách cũ hà nội
(1.000.000.000 ₫)
Luật giáo dục - Luật giáo dục đại học & Văn bản hướng dẫn thi hành
(335.000 ₫)
Danh bạ điện thoại ngành giao thông vận tải 2014-2015
(9 ₫)
Niên giám thống kê Việt Nam 2013 xuất bản năm 2014 mới nhất
(Thỏa thuận...)
Tài liệu bồi dưỡng kế toán trưởng nhà nước
(298.000 ₫)
Hệ thống mục lục ngân sách nhà nước năm 2015
(335.000 ₫)
Sách biểu thuế xuất nhập khẩu song ngữ 2015 mới nhất giao hàng miễn phí
(550.000 ₫)
Muối rửa bát chuyên dụng , bột rửa bát chuyên dụng cho máy rửa bát
(Thỏa thuận...)
Các sản phẩm khác.
Phân Loại Và Giải Chi Tiết Các Dạng Toán...
79.500₫
Dạy theo chuẩn kiến thức, Kỹ năng - Môn:...
42.000₫
Nhật ký vú em
73.000₫
Ebook 31 - Sách móc kết hợp hạt trang...
25.000₫
Vì sao ai cũng hài lòng
54.000₫
Sam Walton - Cuộc đời kinh doanh tại Mỹ
120.000₫
Lần đầu làm sếp - những mẹo mực quản lý...
70.000₫
Thiên tài & sự giáo dục từ sớm
46.400₫
Chiến binh cầu vòng
65.000₫
New toeic 400 new toeic test preparation...
71.000₫
Những điều trường Harvard không dạy bạn
49.000₫
Học nhanh - nhớ lâu: 600 essential...
217.000₫
6 phút tự học tiếng anh mỗi ngày (kèm 1...
60.000₫
Nhật ký Louis bướng bỉnh - đưa bố mẹ vào...
44.000₫
Sổ tay thực hành tin học văn phòng phiên...
36.000₫
Dạy con làm giàu Tập VII (Tái bản) - Ai...
44.000₫
7 nguyên tắc bất biến để xây dựng doanh...
65.000₫
Nghìn lẻ một đêm (Bìa cứng)
219.800₫
Cảm lạnh mùa hè
79.000₫
Đọc vị bất kỳ ai - để không bị lừa dối...
53.000₫
Lằn ranh sinh tử
230.000₫
Cô dâu mất chồng
190.000₫
Hình ảnh của bạn đáng giá triệu đô
190.000₫
Steve Jobs - Sức mạnh của sự khác biệt
81.000₫
Bệnh loãng xương và cách điều trị
25.000₫
Phật quang đại từ điển - HT Thích Quảng...
6.000.000₫
Giáo trình sửa chữa và bảo dưỡng hệ...
80.000₫
Từ điển 1001 món ăn Việt Nam
290.000₫
Sản phẩm mới
Bộ kỹ năng rèn luyện mềm cho bé từ 7 - 15 tuổi
360° teen - Điều tớ chưa nói
360° teen - Cầu vồng đầy nắng
Biểu thuế xuất nhập khẩu 2015 song ngữ anh việt
360° teen - Không bây giờ thì bao giờ?
360° teen - Valentine nhiều vị
Bộ thẻ học các loài chim, động vật, côn trùng
Sản phẩm nổi bật
Sản phẩm xem nhiều
Hướng dẫn học và giải chi tiết bài tập tiếng anh - Lớp 8
Bộ sách giáo khoa lớp 3
Hướng dẫn trả lời câu hỏi và bài tập địa lí 7
Những bài làm văn mẫu lớp 11/Tập 1
Từ điển Anh - Anh - Việt (265.000 từ)
Thuốc biệt dược và cách sử dụng
Để học tốt ngữ văn 7 - Tập 1
Bí truyền về cách chọn nuôi gà đá - gà chọi
Những bài văn mẫu lớp 11 (Chương trình chuẩn)
16 phương pháp và kĩ thuật giải nhanh bài tập trắc nghiệm môn hoá học
Nhiều gian hàng bán
Hướng dẫn hạch toán chế độ kế toán ngân sách - tài chính xã và các quy định mới nhất dành cho kế toán trưởng xã phường thị trấn
Chính sách thuế mới 2011 - Hướng dẫn mới nhất về thi hành luật quản lý thuế, quy định về sử dụng hóa đơn 2011
Quản trị học
Chế độ kế toán hành chính sự nghiệp
Đường cung 20 Triều - Tập 1 và Tập 2
Lý thuyết, bài tập và bài giải kế toán quản trị
Bài tập quản trị sản xuất
Hồng lâu mộng - (trọn bộ) - tập 1+2
Bá tước Môngtơ Crixtô
Chế độ kế toán doanh nghiệp vừa và nhỏ 2012
Mua sắm
>
Sách, đồ văn phòng
>
Sách
(
Sách
,
sach
,
tạp chí
,
từ điển
)
Trang thông tin, giá cả, cửa hàng bán, bình chọn, hỏi đáp về
Bộ sách giáo khoa lớp 1 (14 cuốn)
trong mục
Sách
Rao vặt
|
Hỏi đáp
|
Review - Đánh giá
|
Lưu trữ rao vặt
|
Quà tết
|
Việc làm
|
Exciter 150
|
Dien thoai
|
Laptop
|
Mua ban oto
|
Xe may
|
iPhone 5
|
iPhone 5s
|
iPhone 6
|
iPhone 6 Plus
|
iPhone 4
|
iPhone 4s
|
Điện thoại iphone
|
Galaxy s5
|
Điện thoại samsung
|
HTC One
|
Điện thoại HTC
|
Nokia
|
Nokia lumia 625
|
Nokia lumia 520
|
Sony xperia z3
|
Sony xperia m
|
Sony xperia z1
|
Áo khoác đẹp
|
Áo khoác da
|
Áo khoác nam
|
Giày nam
|
Vest nam
|
Đầm công sở
|
Áo khoác nữ
|
Giày cao gót
|
Điện thoại sony
|
Bất động sản
|
Cho thue nha
|
Tìm việc
|
Máy lọc nước
|
Cách làm trắng da
|
Sim số đẹp
|
Chè
|
CLB Billiard
|
Đồ chơi nhân vật
|
Áo thun đôi
|
Máy cắt không khí
|
Xe máy
|
Khách sạn Ninh Bình
|
Dịch vụ thẩm mỹ
|
Bàn vi tính
|
Đầu thu kỹ thuật số
|
Thời trang nữ khác
Giới thiệu
|
Hướng dẫn
|
Quy chế hoạt động
|
Chính sách bảo mật thông tin
Công ty Cổ phần Vật Giá Việt Nam. Số GCNDT: 011032001615, cấp ngày 21/06/2012, nơi cấp: UBND thành phố Hà Nội
Trụ sở chính: Lê Đại Hành, Hai Bà Trưng, Hà Nội - Chi nhánh Hồ Chí Minh: Đường Lữ Gia, Phường 15, Quận 11, Hồ Chí Minh

Set-Cookie: history_product=54280%7C0; path=/


text:
3.200.000 ₫
3.300.000 ₫
3.300.000 ₫
6.600.000 ₫
2.950.000 ₫
Liên hệ ...
3.500.000 ₫
Liên hệ ...
5.199.000 ₫
Liên hệ ...
4.300.000 ₫
Liên hệ ...
Liên hệ ...
3.550.000 ₫
2.900.000 ₫
99.000.000 ₫
9.500.000 ₫
8.850.000 ₫
8.850.000 ₫
4.000.000 ₫
3.500.000 ₫
9.250.000 ₫
6.300.000 ₫
Liên hệ ...
2.500.000 ₫
Liên hệ ...
3.400.000 ₫
1.650.000 ₫
5.300.000 ₫
Liên hệ ...

Set-Cookie: history_raovat=4145721%7C0; path=/


text:
G2403 là thiết bị cho phép kết nối với máy tính và thực hiện việc gửi nhận tin nhắn 1 cách tự động thông qua 1 phần mềm mà chúng tôi cung cấp.
Với thiết bị này, các công ty có thể quảng cáo và thông tin khuyến mãi đến khách hàng nhanh nhất và dễ dàng nhất, giúp tăng doanh thu mà lại tiết kiệm thời gian 1 cách triệt để.
Ứng dụng:
+ Gửi 1 nội dung tin nhắn đến nhiều số ĐTDĐ
+ Nhắn tin tra cứu thông tin (tự động) : kiểm tra giá, tồn kho, kiểm tra doanh số, kiểm tra điểm thi, điểm học
+ Nhắn tin email : Gởi emal đến di động, và ngược lại (gởi tin từ di động vào địa chỉ email)
+ Báo có email : Gởi tin nhắn đến di động của bạn thông báo có 1 email.
+ Giải pháp cho các trung tâm hỗ trợ khách hàng .
+ Nhận hồi đáp từ khách hàng : giúp doanh nghiệp có được thông tin từ các khách hàng trực tiếp sử dụng sản phẩm.
+ Tin nhắn 2 chiều cho việc giám sát và điều khiển từ xa , như thang máy, tòa nhà, bảo mật. Bạn không có mặt tại công ty, hệ thống tự động thông báo với bạn khi gặp sự cố.
+ Giải pháp cho các ứng dụng thương mại điện tử, quy trình công việc, các chiến dịch marketing .
Đặc biệt khi Mua 1 modem - MIỄN PHÍ 1 license SMART 1.3 Basic GSM
KHUYẾN MÃI ĐẶC BIỆT Giá bán: 2.450.000đ / modem .
Thiết bị được bảo hành 12 tháng. Giao hàng toàn quốc.
HÃY LIÊN HỆ TRỰC TIẾP VỚI CHÚNG TÔI ĐỂ ĐƯỢC TƯ VẤN TỐT NHẤT
Mọi chi tiết vui lòng liên hệ : CÔNG TY CỔ PHẦN INET URL: http://inet.vn
Tại HN : 129 – phan van truong – cau giay – ha noi
DD : 0904886094; 0978274288 ( Dũng)
Email: phamtiendung86@gmail.com
YM: inet_hanoi001
Website : www.modem.vn
Thông tin liên hệ: pham tien dung
GSM modem G2403R / G2403U
Sam Intercel thiết bị nhắn tin sms hàng loạt sms marketing
Infosmart 48GN2
3Com Smart Interface Card
D-Link DSL-2740B
SureCom EP-4804SX-V ADSL w/4 Port/ Router/ Gateway/ Firewall/ Wireless
D-link DSL-200
DHP-1320
DIR-505
Draytek Vigor 2925FN
TP-LINK TD-W8970
NETIS DL4201 Wired ADSL2+ Modem Router
Cisco ISA550
Cisco ISA550
DrayTek Vigor 2130FV
ZyXEL 660HW-61
Thomson SpeedTouch 580
2Wire 2701HG-T
Repotec RP-IP2404A
Repotec RP-IP2401A
Draytek Vigor 2912n
Draytek Vigor 2912
Kasda KW58191
D-Link DSL-2750E/U
D-Link DSL-2700E
Buffalo WBMR-HP-GNV2
Draytek BANDLUXE C330 USB 3.5G
D-Link DSL-2540U
Linksys X3500 N750 Dual-Band Wireless Router with ADSL2+ Modem and USB
US Robotics 56K Business Modem with V.92 USR3453C

markdown:
|Siêu VIP còn trống
|
Liên hệ Q.Cáo
0909.929.055
|Siêu VIP còn trống
|
Liên hệ Q.Cáo
0909.929.055
|Siêu VIP còn trống
|
Liên hệ Q.Cáo
0909.929.055
|Siêu VIP còn trống
|
Liên hệ Q.Cáo
0909.929.055
|Siêu VIP còn trống
|
Liên hệ Q.Cáo
0909.929.055
|Siêu VIP còn trống
|
Liên hệ Q.Cáo
0909.929.055
|Siêu VIP còn trống
|
Liên hệ Q.Cáo
0909.929.055
|Siêu VIP còn trống
|
Liên hệ Q.Cáo
0909.929.055
|
|
Tin rao vặt này đã hết hạn! Tin lưu trữ..
Bạn hãy vào mục
|
|
|
|
|
|
|Đăng bởi :||
|![]()
|Thông tin chung||
|
|Hãng sản xuất|
|Thông tin chi tiết||
|
G2403 là thiết bị cho phép kết nối với
[ máy tính](http://mua247.com/forum/autolink.php?id=1&forumid=18&script=showthread) và thực hiện việc gửi nhận tin nhắn 1 cách tự động thông qua 1 phần mềm mà chúng tôi cung cấp.
Với thiết bị này, các công ty có thể quảng cáo và thông tin khuyến mãi đến khách hàng nhanh nhất và dễ dàng nhất, giúp tăng doanh thu mà lại tiết kiệm thời gian 1 cách triệt để.
Ứng dụng:
+ Gửi 1 nội dung tin nhắn đến nhiều số ĐTDĐ
+ Nhắn tin tra cứu thông tin (tự động) : kiểm tra giá, tồn kho, kiểm tra doanh số, kiểm tra điểm thi, điểm học
+ Nhắn tin email : Gởi emal đến di động, và ngược lại (gởi tin từ di động vào địa chỉ email)
+ Báo có email : Gởi tin nhắn đến di động của bạn thông báo có 1 email.
+ Giải pháp cho các trung tâm hỗ trợ khách hàng .
+ Nhận hồi đáp từ khách hàng : giúp doanh nghiệp có được thông tin từ các khách hàng trực tiếp sử dụng sản phẩm.
+ Tin nhắn 2 chiều cho việc giám sát và điều khiển từ xa , như thang máy, tòa nhà, bảo mật. Bạn không có mặt tại công ty, hệ thống tự động thông báo với bạn khi gặp sự cố.
+ Giải pháp cho các ứng dụng thương mại điện tử, quy trình công việc, các chiến dịch marketing .
Đặc biệt khi Mua 1 modem - MIỄN PHÍ 1 license SMART 1.3 Basic GSM
KHUYẾN MÃI ĐẶC BIỆT Giá bán: 2.450.000đ / modem .
Thiết bị được bảo hành 12 tháng. Giao hàng toàn quốc.
HÃY LIÊN HỆ TRỰC TIẾP VỚI CHÚNG TÔI ĐỂ ĐƯỢC TƯ VẤN TỐT NHẤT
Mọi chi tiết vui lòng liên hệ : CÔNG TY CỔ PHẦN INET URL:
[ http://inet.vn](http://mua247.com/forum/redirector.php?url=http%3A%2F%2Fwww.5giay.vn%2Fredirector.php%3Furl%3Dhttp%253A%252F%252Finet.vn)
Tại HN : 129 – phan van truong – cau giay – ha noi
DD : 0904886094; 0978274288 ( Dũng)
Email:
[phamtiendung86@gmail.com](mailto:phamtiendung86@gmail.com)
YM: inet_hanoi001
Website :
[ www.modem.vn](http://mua247.com/forum/redirector.php?url=http%3A%2F%2Fwww.5giay.vn%2Fredirector.php%3Furl%3Dhttp%253A%252F%252Fwww.modem.vn%252F)
Thông tin liên hệ: pham tien dung
GSM modem G2403R / G2403U
Sam Intercel thiết bị nhắn tin sms hàng loạt sms marketing
Infosmart 48GN2
3Com Smart Interface Card
D-Link DSL-2740B
SureCom EP-4804SX-V ADSL w/4 Port/ Router/ Gateway/ Firewall/ Wireless
D-link DSL-200
DHP-1320
DIR-505
Draytek Vigor 2925FN
TP-LINK TD-W8970
NETIS DL4201 Wired ADSL2+ Modem Router
Cisco ISA550
Cisco ISA550
DrayTek Vigor 2130FV
ZyXEL 660HW-61
Thomson SpeedTouch 580
2Wire 2701HG-T
Repotec RP-IP2404A
Repotec RP-IP2401A
Draytek Vigor 2912n
Draytek Vigor 2912
Kasda KW58191
D-Link DSL-2750E/U
D-Link DSL-2700E
Buffalo WBMR-HP-GNV2
Draytek BANDLUXE C330 USB 3.5G
D-Link DSL-2540U
Linksys X3500 N750 Dual-Band Wireless Router with ADSL2+ Modem and USB
US Robotics 56K Business Modem with V.92 USR3453C

Set-Cookie: history_raovat=2517441%7C0; path=/


markdown:
|Siêu VIP còn trống
|
Liên hệ Q.Cáo
0909.929.055
|Siêu VIP còn trống
|
Liên hệ Q.Cáo
0909.929.055
|Siêu VIP còn trống
|
Liên hệ Q.Cáo
0909.929.055
|Siêu VIP còn trống
|
Liên hệ Q.Cáo
0909.929.055
|Siêu VIP còn trống
|
Liên hệ Q.Cáo
0909.929.055
|Siêu VIP còn trống
|
Liên hệ Q.Cáo
0909.929.055
|Siêu VIP còn trống
|
Liên hệ Q.Cáo
0909.929.055
|Siêu VIP còn trống
|
Liên hệ Q.Cáo
0909.929.055
(597 0 )Cửa kính cường lực
(885 0 )Cửa Nhôm
(6.449 0 )Thế giới Thang - nơi cung cấp giá thang trực tiếp từ nhà sản xuất
(6 0 )Cửa nhựa giả gỗ cao cấp Trường Sa
(339 0 )Cửa nhựa lõi thép, cửa kính
(1.453 0 )CỬA NHỰA HÀ NỘI - HANOWINDOW uPVC: SẢN PHẨM DUY NHẤT CÙNG PHÁT TRIỂN MỘT CỘNG ĐỒNG VN BỀN VỮNG! Tel 0989 55 2989
(573 0 )Cửa gõ công nghiệp HDF, cua go cong nghiep HDF, cửa gỗ Trường Sa
(771 0 )Cửa nhựa đài loan, cửa nhựa cao cấp, cua nhua dai loan
(509 0 )Cửa gỗ mdf veneer, cua mdf, cua go cong nghiep mdf phang, cửa gỗ công nghiệp phẵng
(764 0 )Cửa nhựa cao cápcuawar nhựa, cua nhua cao cap, cửa nhựa đài loan, cửa nhựa giã gỗ, cửa nhựa nhà vệ sinh
(3.081 0 )Chuyên sản xuất thi công cửa nhôm kính, của kính cường lực...
(565 0 )CỬA NHỰA CAO CẤP, CỬA NHỰA GIẢ GỖ, CỬA NHỰA, CỬA NHỰA ĐÀI LOAN
(524 0 )Cửa gỗ công nghiệp MDF Veneer, cua go cong nghiep MDF Veneer
(2.893 0 )Hệ cửa thép an toàn vân gỗ
(6 0 )Cửa gỗ tự nhiên
(7.871 1 )Báo giá cạnh tranh cửa nhựa lõi thép hà nội - hanowindow upvc 2014
(727 0 )Cua go cam xe, cua go tu nhien cam xe, cửa gỗ tự nhiên căm xe, cửa căm xe, xồi mỹ
(145 0 )Cửa gỗ công nghiệp HDF Sơn Màu - Cửa gỗ công nghiệp Hoàng Sa
(292 0 )Cửa gỗ công nghiệp HDF veneer - Cửa gỗ công nghiệp Hoàng Sa
(1 0 )Cửa nhựa lõi thép Europrofilewindow
(2 0 )Cửa nhựa lõi thép bán ở quận 7 - miễn phí giao hàng tận nơi
(4 0 )Cửa nhựa lõi thép upvc giá rẻ, đẹp
(277 0 )Cửa vách nhôm kính
(1.965 0 )Cửa nhôm Việt Pháp tại Hải Phòng
(2.214 0 )Cửa kính cường lực, cửa nhôm kính
(1.418 0 )Nhôm kính Hải Phòng, tủ chạn bếp, kính cường lực, inox, cầu thang kính
(139 0 )Cửa nhôm Việt Pháp Hải Phòng
(1.284 0 )Làm cửa nhôm kính tại Hải Phòng
(414 0 )Nhôm Kính Hải Phòng giá rẻ nhất Hải Phòng
(15 0 )Chuyên bán buôn, lắp đặt, cửa kính, vách kính cường lực uy tín nhất Hải Dương
(57 0 )Cửa nhựa lõi thép ProWindow bền, đẹp, giá rẻ
(10 0 )Cửa nhựa nhà vệ sinh, cửa nhựa giả gỗ, cửa nhựa Y@DOOR, cửa nhựa cao cấp, cửa nhựa
(7 0 )Cửa gỗ công nghiệp, cửa gỗ HDF Veneer, cửa Veneer, cửa gỗ đẹp, cửa gỗ thông phòng
(24 0 )Cửa gỗ HDF
(10 0 )Chuyên thi công, cung cấp, lắp đặt cửa nhôm Vân gỗ, nhôm hệ Việt Pháp, nhôm dụng
(325 0 )Cửa nhôm Việt Pháp - kính cường lực Hải Phòng
(5 0 )Cửa nhựa lõi thép Europrofilewindow nhanh chóng
(1.242 0 )Cửa thép an toàn vân gỗ hanowindow steel door - an toàn, thẩm mỹ pr
(8 0 )Báo giá cửa nhựa lõi thép quận 9 ( khuyến mãi 10 - 15%) dịp tết.
(26 0 )Cửa gỗ MDF veneer Trường Sa
Cửa kính cường lực cao cấp giá rẻ tại Hoàng Mai
Cung cấp và lắp đặt cửa kính - Thành phát luckydoor
|
|

Set-Cookie: u_nologin_id=1616128924; expires=Sun, 10-May-2015 14:23:47 GMT; path=/; httponly


text:
Keywords:phim bo, phim hong kong, phim han quoc, phim tam ly, phim 18, hai kich, phim hoat hinh, tan co, cai luong, webcam videos
Category:Video, Phim, Hài Kịch, Nấu Ăn, Nhạc Việt Nam, Nhạc Hàn Quốc, Nhạc Vàng, Phim Việt Nam, Phim Trung Quốc, Phim Hồng Kông, Phim Nhật Bản, Phim Hàn Quốc, Phim Đài Loan, Phim Thái Lan, Phim Hành Động, Phim Hoạt Hình, Phim Tâm Lý, Phim Viễn Tưởng, Phim Dã Sử, Phim Kinh Dị - Ma, Phim Hài, Phim Tình Cảm, Phim Võ Thuật, Phim Thần Thoại, Tân Cổ - Cải Lương, Trang Điểm - Làm Đẹp, Việt Karaoke, Webcam Videos, Phim 18+, Hong Kong Drama, Hong Kong Movie, Japanese Drama, Japanese Movie, Chinese Drama, Chinese Movie, Korean Drama, Korean Show, Korean Movie, Hollywood Drama, Taiwan Movie, Taiwan Drama, Phỏng Vấn, Phỏng Vấn Xin Việc, Phim HD, Người Đẹp, Hot Jav, Phim Chiếu Rạp, Anri Sugihara, Saori Hara, Maria Ozawa, Tsubasa Amami, Tsukasa Aoi, Kirara Asuka, Yui Hatano, Aino Kishi, Azumi Mizushima, Rina Rukawa, Ria Sakurai, Hitomi Tanaka, Akie Harada, Rina Aizawa, Yoko Matsugane, Akiho Yoshizawa, Reon Kadena, Mizuki Hoshina, Momoka Nishina, Sayaka Isoyama, Ai Shinozaki
Disclaimer: VideosViet.Com is a video search engine that indexing and organizing videos on the web. Everyday 1,000+ new videos, phim, ca nhac, hai kich, phong su.

Cache-Control: no-cache, no-store, must-revalidate, post-check=0, pre-check=0

Server: cloudflare-nginx