GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Problema com EJB Client partindo de um JBoss para outro JBoss

ejb
jboss
Tags: #<Tag:0x00007f515d3d0b48> #<Tag:0x00007f515d3dc1f0>

#1

Bom dia pessoal, preciso muito da ajuda de vocês, não sei mais o que fazer. Vou descrever o meu cenário.

Tenho 2 aplicações hospedadas em servidores de aplicação jboss-eap-6.1, através da injeção de EJB remoto preciso que uma aplicação utilize um EJB que se encontra na outra aplicação.

Então eu inicio um Jboss, com a aplicação A.

E agora preciso executar o EJB remotamente, tenho o seguinte codigo:

List<Imovel> lista = new ArrayList<Imovel>();
	try
	{
		Properties props = new Properties();
		props.put("remote.connections", "default");
		props.put("remote.connection.default.port", "4448");
		props.put("remote.connection.default.host", "localhost");
		props.put("remote.connection.default.username", "ejb");
		props.put("remote.connection.default.password", "ejb@1234");
		props.put("remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS", "false");
		props.put("remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT", "false");
		props.put("remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED", "false");

		EJBClientConfiguration ejbClientConfiguration = new PropertiesBasedEJBClientConfiguration(props);
		ContextSelector<EJBClientContext> contextSelector = new ConfigBasedEJBClientContextSelector(ejbClientConfiguration);
		EJBClientContext.setSelector(contextSelector);

		Properties jndiProperties = new Properties();

		jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
		jndiProperties.put("jboss.naming.client.ejb.context", "true");

		Context context = new InitialContext(jndiProperties);

		IWSTMIPTUSiap wstmIptu = (IWSTMIPTUSiap) context.lookup("ejb:siapconnector-ear/siapconnector-ejb//WSTMIPTUSiap!" + IWSTMIPTUSiap.class.getCanonicalName());

		FiltroImovel filtro = new FiltroImovel();
		filtro.setCpfCnpj("123456789");
		Contribuinte contribuinte = wstmIptu.listarImoveis(filtro);
		System.out.println("Nome: " + contribuinte.getNome());
		System.out.println("CPF: " + contribuinte.getCpfCnpj());
		System.out.println("CUC: " + contribuinte.getNumeroCuc());
		System.out.println("Endereço: " + contribuinte.getLogradouro() + ", " + contribuinte.getNumero() + ", " + contribuinte.getBairro() + "\n");
		System.out.println("Imóveis: ");
		for (Imovel imovel : contribuinte.getImoveis())
		{
			System.out.println("Inscrição: " + imovel.getInscricao() + " - " + imovel.getLogradouro() + ", " + imovel.getNumero() + ", " + imovel.getBairro() + ", " + imovel.getComplemento());
		}
	} catch (Exception e)
	{
		e.printStackTrace();
	}
	return lista;

Quando eu executo esse codigo em um main(), ele funciona perfeitamente, conecta la no outro jboss e executa o método listarImoveis().

Porém agora, quando eu inicio o jboss onde se encontra essa aplicação cliente, e executo o mesmo codigo, chamando de um ManagedBean por exemplo.

Quando ele executa a linha:

EJBClientConfiguration ejbClientConfiguration = new PropertiesBasedEJBClientConfiguration(props);

Printa no log o seguinte:

10:58:21,245 WARN  [org.xnio.option.parse] (http-/0.0.0.0:8080-1) Invalid option 'org.xnio.Options.SSL_ENABLED' in property 'remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED': java.lang.IllegalArgumentException: Class 'org.xnio.Options' not found
10:58:21,250 WARN  [org.xnio.option.parse] (http-/0.0.0.0:8080-1) Invalid option 'org.xnio.Options.SASL_POLICY_NOANONYMOUS' in property 'remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS':  java.lang.IllegalArgumentException: Class 'org.xnio.Options' not found
10:58:21,254 WARN  [org.xnio.option.parse] (http-/0.0.0.0:8080-1) Invalid option 'org.xnio.Options.SASL_POLICY_NOPLAINTEXT' in property 'remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT':  java.lang.IllegalArgumentException: Class 'org.xnio.Options' not found

E logo após executando a linha:

ContextSelector<EJBClientContext> contextSelector = new ConfigBasedEJBClientContextSelector(ejbClientConfiguration);

Printa o seguinte log:

11:02:10,569 ERROR [org.jboss.remoting.remote.connection] (Remoting "config-based-ejb-client-endpoint" read-1) JBREM000200: Remote connection failed: javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
11:02:10,576 WARN  [org.jboss.ejb.client.remoting.ConfigBasedEJBClientContextSelector] (http-/0.0.0.0:8080-1) Could not register a EJB receiver for connection to localhost:4448: java.lang.RuntimeException: javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
	at org.jboss.ejb.client.remoting.IoFutureHelper.get(IoFutureHelper.java:91) [jboss-ejb-client-1.0.21.Final-redhat-1.jar:1.0.21.Final-redhat-1]

não vou colocar o log inteiro por limitaçao do GUJ em 32000 caracteres.

Mais adiante quando executa a linha:

EJBClientContext.setSelector(contextSelector);

Cai no catch e printa o seguinte log:

java.lang.SecurityException: EJBCLIENT000021: EJB client context selector may not be changed
	at org.jboss.ejb.client.EJBClientContext.setSelector(EJBClientContext.java:210)
	at br.com.ejbclientside.programmatically.ClientServiceProgrammatically.listarImoveis(ClientServiceProgrammatically.java:44)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at 

não vou colocar o log inteiro por limitaçao do GUJ em 32000 caracteres.

Eu não sei mais o que fazer, pq o mesmo codigo funciona executando localmente em um main() e quando é executado a partir de um servidor de aplicação jboss não funcionar?

Por favor me ajudem!!

Obrigado.


#2

Quando você roda no “main” de uma classe, localmente, a mesma não realiza uma série de validações que o JBoss realiza. Por isso funciona.

Segue lista com 3 links onde problema semelhante ocorre. Talvez ajude a nortear aí.

https://developer.jboss.org/thread/235771?_sscc=t


https://access.redhat.com/solutions/726673


#3

Opa, tudo bem?

Então… também tive esse problema(e outros) e vou tentar explicar aqui(não sei se nos termos corretos) o que pretendia fazer e como resolvi, funcionou para mim.
Fazemos várias chamadas ejb remotas, e eventualmente tínhamos o seguinte problema:

Caused by: java.io.IOException: Channel Channel ID fa8f69c7 (outbound) of Remoting connection 0196f4b5 to null has been closed (https://developer.jboss.org/thread/198390)

Isso acontecia devido a chamadas remotas onde não se gerenciava o contexto, e dai o próprio JBoss se encarrega de gerenciar os canais de comunicação automaticamente.
Mas com isso, ao passar o tempo essa conexão ficava “idle” e eventualmente acontecia de “perder” essa conexão, devido a razões conhecidas ou desconhecidas(firewall, limite de conexões, ao subir uma nova versão)

Então para resolver esse primeiro problema, recorri a seguinte documentação:

https://docs.jboss.org/author/display/WFLY8/Scoped+EJB+client+contexts

Após colocar a seguinte propriedade:

props.put(“org.jboss.ejb.client.scoped.context”,“true”);

Passamos então a gerenciar o escopo ejb, podendo assim abrir e fechar os canais de comunicação.
Dai me deparei com outro problema, que foi esse que foi citado nos comentários:

https://stackoverflow.com/questions/18844144/unrecognized-ssl-message-plaintext-connection

Isso teoricamente acontece pois o server não suporta comunicação ssl como default.
Pra resolver isso, deve-se colocar a seguinte propriedade:

props.put(“remote.connection.”+nomeDaSuaConexao+".connect.options.org.xnio.Options.SSL_ENABLED", “false”);

(deve-se preencher o host e port da mesma forma)

E ai sim caimos em um dos seus problemas(calma que tem mais):

Invalid option ‘org.xnio.Options.SSL_ENABLED’ in property ‘remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED’: java.lang.IllegalArgumentException: Class ‘org.xnio.Options’ not found

Isso acontece pela falta da dependência do XNIO. Você poderia colocar as dependências do jboss-ejb-client no seu pom que resolveria(no meu caso utilizei a jboss-as-ejb-client-bom),
mas resolveu parcialmente para mim. Quando era em ears diferentes, ele insistia no erro. Até que por fim coloquei essa configuração no jboss-deployment-structure.xml
para exportar a dependência:

<jboss-deployment-structure>
  <deployment>
    <dependencies>
      <module name="org.jboss.xnio" export="true"/>
    </dependencies>
  </deployment>
</jboss-deployment-structure>

Enfim enxergando a classe, ele consegue instanciar e setar SSL_ENABLED para false.
Agora gerencio o escopo ejb manualmente e consigo abrir e fechar os channels, não tendo mais problemas de conexão fechada.

Espero ter ajudado.