Thanks for explaining it detailed.
I'll try it once I've got time for sure.
:)
Zhou
David Blevins wrote:
>
>
> On Jun 11, 2008, at 12:17 AM, xianzheng wrote:
>
>>
>> Hi David,
>> Thanks for your reply.
>> I think i might need the second option. Cause what my legacy server
>> does is
>> a kind of RPC invokation. So I need to embed it into openejb so that
>> it
>> could accept requests and map requests to specific session ejbs.
>> If I understand correctly, i need to code up a container wrapper for
>> it. Do
>> you happen to know where I could find some references in order to do
>> such
>> things?
>
> If you've got a network protocol you'll definitely need to implement a
> ServerService [1]. We can get you going on that and worry about the
> rest as you come to it.
>
> You basically implement that interface and then include a properties
> file in your jar in the path:
> META-INF/org.apache.openejb.server.ServerService/myprotocol
>
> Where "myprotocol" is a properties file that looks like so:
>
> server = org.superbiz.foo.MyServerServiceImplementation
> bind = 127.0.0.1
> port = 4204
> disabled = false
> threads = 200
>
> You need only drop that jar into the <openejb.home>/lib directory and
> it will start up on boot. We'll even take the contents of
> "myprotocol" and create a <openejb.home>/conf/myprotocol.properties
> file automatically so that it can easily be configured. You'll even
> be able to do properties overrides on the command line and via system
> properties, such as:
>
> ./bin/openejb start -Dmyprotocol.port=4567 -
> Dmyprotocol.only_from=127.0.0.1
>
> The above would bind your protocol to prot 4567 and only allow people
> on the localhost to connect to it. (the "only_from" supports a ton of
> options, getting good docs for it is definitely on the todo list)
>
> A simple MyServerServiceImplementation might look like this:
>
> public class MyServerServiceImplementation implements
> org.apache.openejb.server.ServerService {
>
> public void service(Socket socket) throws IOException {
> InputStream in = socket.getInputStream();
> OutputStream out = socket.getOutputStream();
>
> try {
> service(in, out);
> } finally {
> try {
> if (socket != null) socket.close();
> } catch (Throwable t) {
> // log something
> }
> }
> }
>
> public void service(InputStream in, OutputStream out) throws
> IOException {
> // DO YOUR STUFF HERE
> // alternatively you can use the service(Socket socket)
> method instead
> }
>
> //
> // The following aren't required in most situations
> //
>
> public void init(Properties props) throws Exception {
> }
>
> public void start() throws ServiceException {
> }
>
> public void stop() throws ServiceException {
> }
>
> public String getName() {
> return "myprotocol";
> }
>
> public int getPort() {
> return 0;
> }
>
> public String getIP() {
> return "";
> }
> }
>
>
> For some good code to browse, just about every module under this path
> is a ServerService of one kind or another. Some invoke beans like the
> openejb-ejbd, some are adapters for third party protocols like openejb-
> hsql, openejb-derbynet and openejb-activemq, some are non-ejb
> protocols like openejb-http and openejb-telnet.
>
> http://svn.apache.org/repos/asf/openejb/tags/openejb-3.0/server/
>
> On the object invoking front there are a couple internal concepts to
> understand. Every ejb in the system has an DeploymentInfo object
> associated with it. These can be located by DeploymentId, which by
> default will be the same as the ejb-name of the ejb. A Container will
> hold several DeploymentInfo objects. A Container looks a lot like
> plain reflection, it has an invoke() method that looks as follows:
>
> public Object invoke(Object deployID, Class callInterface, Method
> callMethod, Object [] args, Object primKey) throws OpenEJBException;
>
> INVOKING, OPTION #1
>
> The "to the metal" way to invoke is to get references to a container
> and invoke it as as follows:
>
> import org.apache.openejb.DeploymentInfo;
> import org.apache.openejb.loader.SystemInstance;
> import org.apache.openejb.spi.ContainerSystem;
> ....
> String deploymentId = ..// get this from your protocol somewhere
> Object instanceId = ..// null for stateless beans, will be a
> container created value for stateful
> Object[] args = ..// get this from your protocol somewhere
> Method method = ..// the method you want to invoke
>
> ContainerSystem containerSystem =
> SystemInstance.get().getComponent(ContainerSystem.class);
> DeploymentInfo deploymentInfo =
> containerSystem.getDeploymentInfo(deploymentId);
> RpcContainer container = (RpcContainer)
> deploymentInfo.getContainer();
>
> Object result = container.invoke(deploymentId,
> method.getDeclaringClass(), method, args, instanceId);
>
> // serialize the result back to your client.
> // done
>
> For several examples of the above code, check out the
> EjbRequestHandler [2] class.
>
> INVOKING, OPTION #2
>
> The above can be tricky when you start dealing with creating,
> removing, stateful bean identity, app and system exception handling
> and more so it can sometimes be far easier to just ignore all that and
> just deal with the proxy instance that you can get from the
> LocalInitialContextFactory. Essentially the same thing but 100% plain
> reflection.
>
> String jndiName = ..// get this from your protocol somewhere
> Object[] args = ..// get this from your protocol somewhere
> Method method = ..// the method you want to invoke
>
> ContainerSystem containerSystem =
> SystemInstance.get().getComponent(ContainerSystem.class);
> Context ejbJndiContext = (Context)
> containerSystem.getJNDIContext().lookup("openejb/ejb"); // all ejbs
> live here
>
> Object beanReference = ejbJndiContext.lookup(jndiName);
>
> Object result = method.invoke(beanReference, args);
>
> // serialize the result back to your client.
> // done
>
>
> -David
>
> [1]
> http://svn.apache.org/repos/asf/openejb/tags/openejb-3.0/server/openejb-server/src/main/java/org/apache/openejb/server/ServerService.java
> [2]
> http://svn.apache.org/repos/asf/openejb/tags/openejb-3.0/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbRequestHandler.java
>
>> David Blevins wrote:
>>>
>>>
>>> On Jun 10, 2008, at 8:50 PM, xianzheng wrote:
>>>
>>>>
>>>> Hi all,
>>>> I'm new to J2EE and OpenEJB.
>>>> Just wondering, is there a way to embed an application server
>>>> which is
>>>> written in JAVA in openejb? I guess, I'll have to write a container
>>>> to wrap
>>>> it around? If so, is there a guide to write such thing? As my
>>>> understanding,
>>>> JCA can only allows ejbs to connect to other servers rather than
>>>> listening
>>>> connections?
>>>>
>>>> I have a very old server application i wrote, which complies a non-
>>>> standard
>>>> communication protocol. So i'm thinking whether i could embed it
>>>> into
>>>> openejb to listening to "old" request and benefit openejb's other
>>>> cool
>>>> features.
>>>
>>> Hi Joe,
>>>
>>> Depending on what you want to do exactly there are likely many ways
>>> to
>>> do it.
>>>
>>> It is possible to plug in new protocols into a standard OpenEJB
>>> install and support custom clients. It's very easy to drop something
>>> in that listens on a socket and does "stuff". OpenEJB will find it
>>> on
>>> startup and hook it up as it does the other protocols. The "stuff"
>>> is
>>> where all the detail lies. Reflectively invoking proxies on the
>>> server side by looking them up from the local global JNDI
>>> (LocalInitialContextFactory) is easy, whereas sending invocations
>>> directly into the EJB Containers like the EJBd protocol does is
>>> harder. Can show you how to do that if it sounds like a route you
>>> might want to take. (you basically implement a specific interface
>>> then include a special properties file in your jar and drop it into
>>> openejb, pretty easy)
>>>
>>> If you have your own "component container" it is possible to add new
>>> custom containers to a standard OpenEJB install. This is a bit more
>>> involved but not completely impossible. The advantage here is that
>>> any container can be invoked by any of the protocols plugged into
>>> OpenEJB.
>>>
>>> Sounds like you want more the first option where you can add a new
>>> protocol. There are definitely options. Couple rounds of "mutual
>>> data exchange" (aka discussion) and I'm sure we can find a good game
>>> plan :)
>>>
>>> -David
>>>
>>>
>>>
>>>
>>>
>>
>> --
>> View this message in context:
>> http://www.nabble.com/How-to-embed-a-server-into-openejb-standard-alone-server-tp17769556p17771513.html
>> Sent from the OpenEJB User mailing list archive at Nabble.com.
>>
>>
>
>
>
--
View this message in context:
http://www.nabble.com/How-to-embed-a-server-into-openejb-standard-alone-server-tp17769556p17861267.html
Sent from the OpenEJB User mailing list archive at Nabble.com.