私はJBossの世界の初心者で、現在最初のプログラムに取り組んでいます。したがって、私の質問が些細なことでしたら、あらかじめご容赦ください。しかし、私はまだ答えを知りません (JBoss コミュニティと Coderanch で既に質問しています) ので、誰かアドバイスをいただければ幸いです。
課題は、さらに情報を取得したり停止したりするために、EJB メソッドを非同期で実行することです。
JBoss AS バージョン 5.0、Eclipse JUNO (プラグイン 3.8.2-4.2.2) を使用しています。
ejb31-api-experimental-3.1.4.jar ライブラリから取得した AsyncResult クラスを使用しています。サーバー上のビジネス ロジックは完全に機能しているように見えますが、結果がクライアント アプリケーションに返されるときに例外が発生します。
私のEJBサンプルコードは次のとおりです。
package org.braman.apps.demo.ejb;
import javax.ejb.Stateless;
import java.net.*;
import java.io.*;
import java.util.*;
import java.util.concurrent.Future;
import javax.ejb.*;
import javax.ejb.Asynchronous;
import javax.ejb.AsyncResult;
import java.io.Serializable;
@Stateless
@Remote
@Asynchronous
public class DemoStatelessBean implements DemoStatelessRemote, Serializable {
@Override
@Asynchronous
public Future<String> tn_mainloop() {
// my business logic here
return new AsyncResult<String>("HELLO");
}
}
Remote interface is:
package org.braman.apps.demo.ejb;
import javax.ejb.Remote;
import java.util.concurrent.Future;
import javax.ejb.*;
@Remote
public interface DemoStatelessRemote {
public String getDemoWord();
@Asynchronous
public Future<String> tn_mainloop();
}
クライアントアプリケーションは
public class DemoStatelessClient implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
public static void main(String[] args) throws Exception
{
Context context;
Properties properties = new Properties(); properties.put("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
properties.put("java.naming.factory.url.pkgs","=org.jboss.naming:org.jnp.interfaces");
properties.put("java.naming.provider.url","localhost:1099");
context = new InitialContext(properties);
DemoStatelessRemote simpleSession
= (DemoStatelessRemote) context.lookup("DemoStatelessBean/remote");
System.out.printf(">> %s\n", DemoStatelessRemote.class.getName());
try {
//Future<String> fut=simpleSession.tn_mainloop();
final Future<String> str = simpleSession.tn_mainloop();
str.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
} catch (EJBException ejbe) {
ejbe.printStackTrace();
}
}
}
メソッド自体は完全にうまく機能します (JBoss コンソールではすべて問題なく動作します)。ただし、結果をクライアントに返すときにエラーが発生します。誰かが助けてくれれば幸いです。インターネットを調べましたが、私が見つけた唯一の解決策は、「シリアル化可能な」インターフェースの実装に関するものです。ただし、AsyncResult は提供されたクラスです。AsyncResult を含む jar は ejb31-api-experimental-3.1.4.jar で、インターネットで見つかりました。助けてください。前もって感謝します/
ログ:
Caused by: org.jboss.remoting.InvocationFailureException: Unable to perform invocation; nested exception is: java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: javax.ejb.AsyncResult at org.jboss.remoting.transport.socket.SocketClientInvoker.handleException(SocketClientInvoker.java:139) at org.jboss.remoting.transport.socket.MicroSocketClientInvoker.transport(MicroSocketClientInvoker.java:886) at org.jboss.remoting.MicroRemoteClientInvoker.invoke(MicroRemoteClientInvoker.java:160) at org.jboss.remoting.Client.invoke(Client.java:1708) at org.jboss.remoting.Client.invoke(Client.java:612) at org.jboss.aspects.remoting.InvokeRemoteInterceptor.invoke(InvokeRemoteInterceptor.java:60) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) at org.jboss.aspects.tx.ClientTxPropagationInterceptor.invoke(ClientTxPropagationInterceptor.java:61) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) at org.jboss.ejb3.security.client.SecurityClientInterceptor.invoke(SecurityClientInterceptor.java:65) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) at org.jboss.ejb3.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:76) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) at org.jboss.aspects.remoting.PojiProxy.invoke(PojiProxy.java:62) at $Proxy4.invoke(Unknown Source) at org.jboss.ejb3.proxy.handler.session.SessionSpecProxyInvocationHandlerBase.invoke(SessionSpecProxyInvocationHandlerBase.java:125) ... 2 more Caused by: java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: javax.ejb.AsyncResult at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) at org.jboss.aop.joinpoint.InvocationResponse.readExternal(InvocationResponse.java:119) at java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1810) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1769) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1964) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1888) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) at org.jboss.remoting.serialization.impl.java.JavaSerializationManager.receiveObjectVersion2_2(JavaSerializationManager.java:238) at org.jboss.remoting.serialization.impl.java.JavaSerializationManager.receiveObject(JavaSerializationManager.java:138) at org.jboss.remoting.marshal.serializable.SerializableUnMarshaller.read(SerializableUnMarshaller.java:123) at org.jboss.remoting.transport.socket.MicroSocketClientInvoker.versionedRead(MicroSocketClientInvoker.java:1215) at org.jboss.remoting.transport.socket.MicroSocketClientInvoker.transport(MicroSocketClientInvoker.java:845) at org.jboss.remoting.MicroRemoteClientInvoker.invoke(MicroRemoteClientInvoker.java:160) at org.jboss.remoting.Client.invoke(Client.java:1708) at org.jboss.remoting.Client.invoke(Client.java:612) at org.jboss.aspects.remoting.InvokeRemoteInterceptor.invoke(InvokeRemoteInterceptor.java:60) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) at org.jboss.aspects.tx.ClientTxPropagationInterceptor.invoke(ClientTxPropagationInterceptor.java:61) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) at org.jboss.ejb3.security.client.SecurityClientInterceptor.invoke(SecurityClientInterceptor.java:65) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) at org.jboss.ejb3.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:76) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) at org.jboss.aspects.remoting.PojiProxy.invoke(PojiProxy.java:62) at $Proxy4.invoke(Unknown Source) at org.jboss.ejb3.proxy.handler.session.SessionSpecProxyInvocationHandlerBase.invoke(SessionSpecProxyInvocationHandlerBase.java:125) at $Proxy3.tn_mainloop(Unknown Source) at org.braman.apps.demo.ejb.DemoStatelessClient.main(DemoStatelessClient.java:59) at org.jboss.aspects.remoting.InvokeRemoteInterceptor.invoke(InvokeRemoteInterceptor.java:72) ... 12 more Caused by: java.io.NotSerializableException: javax.ejb.AsyncResult at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1173) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:343) at org.jboss.aop.joinpoint.InvocationResponse.writeExternal(InvocationResponse.java:100) at java.io.ObjectOutputStream.writeExternalData(ObjectOutputStream.java:1438) at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1407) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1167) at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1526) at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1491) at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1409) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1167) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:343) at org.jboss.remoting.serialization.impl.java.JavaSerializationManager.sendObjectVersion2_2(JavaSerializationManager.java:120) at org.jboss.remoting.serialization.impl.java.JavaSerializationManager.sendObject(JavaSerializationManager.java:95) at org.jboss.remoting.marshal.serializable.SerializableMarshaller.write(SerializableMarshaller.java:120) at org.jboss.remoting.transport.socket.ServerThread.versionedWrite(ServerThread.java:998) at org.jboss.remoting.transport.socket.ServerThread.completeInvocation(ServerThread.java:781) at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:695) at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:522) at org.jboss.remoting.transport.socket.ServerThrea
d.run(ServerThread.java:230)