2009-04-23 44 views
6

Tôi có một ứng dụng Web sử dụng lò xo và ngủ đông và thanh chống (nó chạy trên Tomcat)Chủ đề trong mùa xuân

Trình tự gọi là một cái gì đó như thế này ...

Struts hành động gọi là đậu dịch vụ xuân mà lần lượt gọi Spring DAO bean. Việc thực hiện DAO là một thực hiện Hibernate.

Câu hỏi là Tất cả các hạt đậu mùa xuân của tôi có đang chạy trong cùng một chuỗi không? Tôi có thể cất giữ thứ gì đó trong ThreadLocal và lấy nó trong một loại đậu khác không?

Tôi khá chắc chắn điều này sẽ không hoạt động trong Bean Session phiên không trạng thái. Thùng chứa EJB có thể (hoặc sẽ) sinh ra một sợi mới cho mỗi cuộc gọi đến phiên bean

Hộp chứa mùa xuân có giống nhau không? tức là chạy tất cả các hạt trong cùng một chuỗi?

Khi tôi đã cố gắng thử JUnit -. Tôi đã cùng một id qua Thread.currentThread() getId() trong các trường hợp thử nghiệm và hai beans- dẫn tôi để tin rằng chỉ có một thread trong hành động

Hoặc hành vi không thể đoán trước? Hoặc nó sẽ thay đổi khi chạy trên máy chủ Tomcat?

Làm rõ Tôi không muốn trao đổi dữ liệu giữa hai luồng. Tôi muốn đưa dữ liệu vào ThreadLocal và có thể lấy nó từ tất cả các bean trong ngăn xếp cuộc gọi. Điều này sẽ chỉ hoạt động nếu tất cả các hạt đậu trong cùng một chủ đề

+0

Bạn có thể đăng một số mã mẫu không? Tôi không chắc bạn đang cố gắng đạt được điều gì. –

Trả lời

15

Mùa xuân không sinh ra chủ đề. Tomcat. Mùa xuân chỉ là tạo ra và dây lên các đối tượng cho bạn.

Mỗi yêu cầu từ trình duyệt được xử lý trong một yêu cầu. Đó là Tomcat xử lý yêu cầu. Đó là Tomcat tạo ra luồng để xử lý yêu cầu.

Giả sử bạn vừa tạo một hạt đơn trong Mùa xuân có tên là "X". Sau đó, cùng một ví dụ của X được sử dụng bởi tất cả các yêu cầu.

Đậu mùa xuân không sống trong chuỗi. Họ chỉ được phân bổ trên heap.

+0

Vì vậy, khi chạy dưới Tomcat-sẽ kết thúc của tôi để kết thúc dòng chảy dưới một sợi? –

+0

Có, giả định mọi thứ nằm trên cùng một cá thể máy chủ ứng dụng. –

+0

Đây là giải thích tốt nhất cho đến nay. –

1

Tất cả các hạt đậu mùa xuân của tôi có đang chạy trong cùng một chuỗi không? Tôi có thể lưu trữ một cái gì đó trong ThreadLocal và nhận được nó trong đậu khác không? AFAIK cho các thành phần bạn đã đề cập (dịch vụ đậu, DAO đậu - tôi đoán họ là đồng bằng mùa xuân đậu), mùa xuân không đẻ trứng một chủ đề mới. Tôi không hiểu trường hợp sử dụng của bạn (ví dụ, trao đổi dữ liệu giữa hai luồng).

Đối với hầu hết webapps, một chủ đề mới được sinh ra cho mỗi yêu cầu mới, và nếu bạn muốn chia sẻ dữ liệu giữa hai yêu cầu bạn thường: - sử dụng các thông số get/bài để vượt qua các dữ liệu - sử dụng phiên để chia sẻ dữ liệu

Để trả lời câu hỏi của bạn, tôi chắc chắn rằng thùng chứa mùa xuân không sinh ra chủ đề cho hầu hết các thành phần.

+0

Tôi không muốn trao đổi dữ liệu giữa hai luồng. tôi muốn đưa dữ liệu vào luồng và có thể lấy dữ liệu từ tất cả các bean trong ngăn xếp cuộc gọi. Điều này sẽ chỉ hoạt động nếu tất cả các hạt trong cùng một chủ đề ... –

0

Có, bạn có thể thực hiện việc này.Các chủ đề tương tự sẽ được sử dụng để thực hiện hành động của bạn để ThreadLocal sẽ làm việc. Thông thường, cùng một luồng được sử dụng cho bean phiên không trạng thái, giả sử nó đang chạy trong cùng một cá thể máy chủ ứng dụng. Tôi sẽ không phụ thuộc vào điều này mặc dù, vì nó có lẽ là nhà cung cấp phụ thuộc.

Chúng tôi sử dụng kỹ thuật này để truy cập danh tính người gọi ở bất kỳ đâu trong mã. Chúng ta cũng sử dụng các session bean và jms, nhưng rõ ràng truyền thông tin giữa các container và thiết lập ThreadLocal tại mỗi điểm vào. Bằng cách này nó không quan trọng nếu đậu (phiên hoặc mdb) là địa phương hay không.

+0

Tôi không nghĩ rằng anh ta thực sự đang sử dụng một phiên đậu không trạng thái? Tôi đã cho rằng anh ta đang sử dụng POJO trong Spring như một sự thay thế. –

+0

và theo mặc định, Spring sẽ tạo hạt của bạn làm đơn, nghĩa là cùng một phiên bản được chia sẻ trên tất cả các yêu cầu. Nhưng nếu anh ta lưu trữ một cái gì đó trong ThreadLocal, nó không quan trọng. –

+0

Tôi cho rằng điểm của bạn về POJO là đúng, nhưng anh ta đã đề cập rằng anh ta không nghĩ rằng nó sẽ hoạt động, vì vậy tôi cho rằng đây có thể là một lựa chọn khác mà anh ta nghĩ đến (có hoặc không có Spring). Tôi chỉ nghĩ rằng tôi sẽ cung cấp cho anh ta một số thông tin về điều đó cũng như dựa trên kinh nghiệm của riêng tôi làm một cái gì đó tương tự. – Robin

0

Ngoài tất cả các câu trả lời khác, tôi sẽ chỉ cần thêm những điều sau đây:

Thông thường lý do duy nhất để chuyển đổi chủ đề là vì một số yêu cầu về parallellity. Vì điều này thường không đến miễn phí về mặt phức tạp, bạn thường sẽ được thông báo rõ ràng khi điều này xảy ra.

Chuyển đổi chủ đề trong những gì dường như là một xử lý đơn luồng của một yêu cầu thực sự là vô cùng phức tạp. Điều này thường sẽ chỉ xảy ra ở một nơi trong một container, và điều này thường được xử lý bởi các trình đọc tcp/ip socket nhận được yêu cầu từ các máy khách bên ngoài. Các chủ đề đọc này thường xác định luồng (hồ bơi) nào sẽ xử lý yêu cầu và chuyển tiếp yêu cầu đến luồng đó. Sau đó yêu cầu ở lại với chuỗi đó.

Vì vậy, thông thường điều duy nhất sẽ/có thể xảy ra là các chuỗi bổ sung được tạo ra để xử lý song song hoặc không đồng bộ (như JMS).