Как отправить объект inputStream в Java EJBean? - PullRequest
4 голосов
/ 08 декабря 2009

У меня есть Java-клиент для сессионного компонента, я хочу отправить ему inputStream следующим образом:

Примечание: я работаю с EJB 3.0

public class SenderSimulator {

public static void main(String[] arg){
    Properties p = new Properties();
    p.put("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
    p.put("java.naming.provider.url", "jnp://localhost:1099");
    p.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");

    try {
        Context context = new InitialContext(p);
        RogersBatchImporter  bean = (RogersBatchImporter)context.lookup("RogersImporterBean/remote");
        InputStream in = new FileInputStream("filePath");           
        System.out.println("Result: " + bean.processBatch(in));  // line 29
    } catch (NamingException e) {
        e.printStackTrace();
    } catch (LogConfigurationException e) {
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}

}

но выдает следующее исключение:

Exception in thread "main" java.lang.reflect.UndeclaredThrowableException

at $Proxy0.processBatch(Unknown Source)

at package.main(SenderSimulator.java:29)

Caused by: java.rmi.MarshalException: Failed to communicate.  Problem during marshalling/unmarshalling; nested exception is: 
    java.io.NotSerializableException: java.io.FileInputStream
    at org.jboss.remoting.transport.socket.SocketClientInvoker.handleException(SocketClientInvoker.java:127)
    at org.jboss.remoting.transport.socket.MicroSocketClientInvoker.transport(MicroSocketClientInvoker.java:689)
    at org.jboss.remoting.MicroRemoteClientInvoker.invoke(MicroRemoteClientInvoker.java:122)
    at org.jboss.remoting.Client.invoke(Client.java:1634)
    at org.jboss.remoting.Client.invoke(Client.java:548)
    at org.jboss.aspects.remoting.InvokeRemoteInterceptor.invoke(InvokeRemoteInterceptor.java:62)
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    at org.jboss.aspects.tx.ClientTxPropagationInterceptor.invoke(ClientTxPropagationInterceptor.java:67)
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    at org.jboss.aspects.security.SecurityClientInterceptor.invoke(SecurityClientInterceptor.java:53)
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    at org.jboss.ejb3.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:74)
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    at org.jboss.ejb3.stateless.StatelessRemoteProxy.invoke(StatelessRemoteProxy.java:107)
    ... 2 more
Caused by: java.io.NotSerializableException: java.io.FileInputStream
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1156)
    at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1338)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1146)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)
    at java.rmi.MarshalledObject.<init>(MarshalledObject.java:101)
    at org.jboss.aop.joinpoint.MethodInvocation.writeExternal(MethodInvocation.java:318)
    at java.io.ObjectOutputStream.writeExternalData(ObjectOutputStream.java:1421)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1390)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)
    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.MicroSocketClientInvoker.versionedWrite(MicroSocketClientInvoker.java:969)
    at org.jboss.remoting.transport.socket.MicroSocketClientInvoker.transport(MicroSocketClientInvoker.java:606)
    at org.jboss.remoting.MicroRemoteClientInvoker.invoke(MicroRemoteClientInvoker.java:122)
    at org.jboss.remoting.Client.invoke(Client.java:1634)
    at org.jboss.remoting.Client.invoke(Client.java:548)
    at org.jboss.aspects.remoting.InvokeRemoteInterceptor.invoke(InvokeRemoteInterceptor.java:62)
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    at org.jboss.aspects.tx.ClientTxPropagationInterceptor.invoke(ClientTxPropagationInterceptor.java:67)
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    at org.jboss.aspects.security.SecurityClientInterceptor.invoke(SecurityClientInterceptor.java:53)
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    at org.jboss.ejb3.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:74)
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    at org.jboss.ejb3.stateless.StatelessRemoteProxy.invoke(StatelessRemoteProxy.java:107)
    at $Proxy0.processBatch(Unknown Source)
    at com.cybersource.rogers.batch.request.SenderSimulator.main(SenderSimulator.java:29)
    at org.jboss.aspects.remoting.InvokeRemoteInterceptor.invoke(InvokeRemoteInterceptor.java:74)
    ... 10 more

Ответы [ 4 ]

12 голосов
/ 08 декабря 2009

Как указали другие, File, InputStream и многие другие объекты, связанные с вводом-выводом, не сериализуются и поэтому не могут быть растянуты по соединению между клиентом и сервером (без дополнительной функциональности). В контексте J2EE контейнер должен завершать процессы как можно быстрее, чтобы минимизировать использование ресурсов и позволить параллельную обработку. До Java NIO операции ввода-вывода обычно блокировались (ожидание чтения или записи данных), что приводило к зависанию потоков (т. Е. Временно останавливалось в лучшем случае, в худшем случае постоянно).

Однажды я работал над проектом, в котором некоторые разработчики, которые были довольно новичками в Java, открывали FTP-соединения с удаленными серверами из EJBs & ndash; вопреки моим предупреждениям и тем из документации J2EE. Когда удаленный сервер не отвечал, единственным способом отсоединить наш сервер было убить и перезапустить его!

Поэтому: захватите содержимое файла на клиенте и отправьте его через соединение в виде большой строки, или символьного или байтового массива, или чего-то еще. Таким образом, ваш процесс EJB будет иметь все данные, готовые к обработке.

Если объем данных слишком велик, чтобы сделать это в разумном объеме памяти, то это не является жизнеспособным решением. В этом случае рекомендуемое решение для клиента - записать данные в базу данных (возможно, большой двоичный объект) и прочитать EJB из базы данных.

3 голосов
/ 08 декабря 2009

Если вы используете удаленный EJB-компонент, тогда объекты Object маршалируются и демаршализируются (преобразуются из Object в байтовый поток, отправляются, а затем обратно в Object). Это требует, чтобы все ваши параметры реализовали Serializable. Поскольку FileInputStream не сериализуем, он не будет работать как параметр. Вам нужно будет отправить содержимое файла в формате String (байт [] также должен работать).

0 голосов
/ 08 декабря 2009

JBoss имеет сериализованный входной поток класс.

Это работает для тестирования bean-компонента, который использует InputStream через контрактный интерфейс.

0 голосов
/ 08 декабря 2009

Для отправки по проводам аргументы функции вашего сессионного компонента должны быть сериализованными . Поток не может быть сериализован (т.е. не реализует интерфейс Serializable), поэтому вы не сможете передать его удаленному компоненту.

Чтобы получить аргумент для удаленного компонента, вам нужно использовать сериализуемое представление.

...