You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomee.apache.org by xianzheng <jo...@lgsolutions.com.au> on 2008/06/11 05:50:29 UTC
How to embed a server into openejb standard alone server
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.
Thanks a lok,
Joe
--
View this message in context: http://www.nabble.com/How-to-embed-a-server-into-openejb-standard-alone-server-tp17769556p17769556.html
Sent from the OpenEJB User mailing list archive at Nabble.com.
Re: How to embed a server into openejb standard alone server
Posted by xianzheng <jo...@lgsolutions.com.au>.
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.
Re: How to embed a server into openejb standard alone server
Posted by David Blevins <da...@visi.com>.
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.
>
>
Re: How to embed a server into openejb standard alone server
Posted by xianzheng <jo...@lgsolutions.com.au>.
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?
Thanks a lot,
Joe
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.
Re: How to embed a server into openejb standard alone server
Posted by David Blevins <da...@visi.com>.
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