У меня есть куча bean-компонентов ejb 3.0 без сохранения состояния, вызывающих друг друга по цепочке. Рассмотрим, BeanA.do (сообщение) -> BeanB.do () -> BeanC.do () -> BeanD.do (). Теперь я хотел бы получить доступ к данным сообщения из BeanD.do (). Очевидное решение - передать сообщение в качестве параметра для всех вызовов do () (на самом деле, как это работает сейчас), но мне нужно какое-то более приятное решение.
Есть ли какой-то контекст вызова? И можно ли связать с ним произвольные данные?
Что я хотел бы сделать, это просто поместить сообщение в BeanA.do (message) в какое-то локальное хранилище, связанное с вызовом функции bean-компонента, и получить его в BeanD.do ().
Любые идеи?




Я не верю, что в спецификации EJB есть что-то, что обеспечивает эту функциональность. Если вы находитесь на определенном сервере приложений, вы можете использовать специфические для этого сервера приложения (я думаю, что JBoss позволяет добавлять элементы в контекст вызова). вы также можете подделать что-то с помощью JNDI.
лично мне это кажется плохим дизайном. я мог бы увидеть это, если бы у вас был какой-то код посередине, который вы не могли контролировать, но зачем это делать в противном случае? вы усложняете выполнение своей логики кода, потому что у вас есть куча «волшебных» данных, которые просто появляются в вашей функции.
У вас может быть класс со статическими методами получения / установки, которые обращаются к статическому полю ThreadLocal. Однако я бы прислушался к совету Джеймса и очень внимательно подумал, хотите ли вы связать свои EJB с этим другим классом. Определенно дважды проверьте документы сервера приложений, поскольку я не уверен, поддерживается ли использование ThreadLocals в среде EJB.
У меня точно такая же проблема. Ирония в том, что это легко сделать с помощью SOAP в jax-ws или jax-rpc, но сложно сделать с EJB.
Я обсуждаю, стоит ли отказываться от использования локального или удаленного интерфейса EJB и вместо этого передавать сообщения через JMS, что также упрощает эту задачу.
Есть законные случаи, когда это необходимо, и это не является недостатком дизайна.
Это то, что предлагает Шов. Немного неудобно работать с чистыми веб-сервисами (т.е. без интерфейса веб-интерфейса). Однако мне это удалось, и это прекрасно работает.
Мне нужно использовать контекст вызова в JAX WS. Брент говорит «Ирония заключается в том, что это легко сделать с помощью SOAP в jax-ws или jax-rpc, но сложно сделать с EJB».
Не могли бы вы сообщить мне, как использовать контекст вызова в JAX WS?
Спасибо за Ваш ответ. Я попробую поискать в документации JBoss. В противном случае я бы согласился с вами, что «волшебные» данные не годятся. Но в текущей ситуации явная передача контекстных данных только отвлекает от реальной бизнес-логики.