on 11-27-2009 1:12 PM
Bom dia.
Estamos com uma demanda para alteração do nome (dinamico) do arquivo XML enviado para os clientes e
outra alteração para colocar um texto no corpo do e-mail (tambem dinamico) enviado.
Vi que tenho que utilizar o Adapter Framework do Partner Connectivity Kit (PCK).
Temos os seguintes componentes no nosso PI:
SAP_ABA - 700 - 0019
SAP_BASIS - 700 - 0019
PI_BASIS - 2006_1_700 - 0009
ST-PI - 2008_1_700 - 0000
SAP_BW - 700 - 0021
SLL-NFE - 100 - 0011
ST-A/PI - 01L_BCO700 - 0000
Minha dúvida (por enquanto) é. Quais componentes e/ou ferramentas adicionais vou precisar instalar para
começar a desenvolver um Adapter Module?
Bernardo,
vc nao precisa instalar nada no seu servidor!
Vc vai desenvolver em plataforma Java, pois o Module é deployado no Adapter Engine do PI.
Vc só precisa instalar o Netweaver Developer Studio, mas ele é instalado localmente na sua maquina.
Veja esse artigo com detalhes do desenvolvimento de um module: http://www.sdn.sap.com/irj/scn/index?rid=/library/uuid/f013e82c-e56e-2910-c3ae-c602a67b918e
Para um sample code, va no wiki: https://wiki.sdn.sap.com/wiki/display/BPX/SamplecodetocreateemailbodyandXMLattachmentinanoutgoingNFEB2Be-mail+communication
Abs,
Henrique.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
OK. Baixei e instalei o SAP NetWeaver Developer Studio.
Baixei o SP24 for XI ADAPTER FRAMEWORK CORE 3.0
E extrai os arquivos necessários...qualquer problema eu falo.
Obrigado.
At.,
Bernardo Tavares Braga
Edited by: Bernardo Tavares Braga on Nov 27, 2009 8:38 PM
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Bernardo,
baixe o NWDS 7.0.
http://service.sap.com/swdc, busque por support packages e patches e procure por "developer studio".
Abs,
Henrique.
Bom dia.
Criamos o adapter module e solicitamos o deploy em DEV. Esta retornando o erro abaixo. Tem idéia do que pode ser?
===========================================================================
Deployment started Wed Dec 02 09:52:16 WGT 2009
===========================================================================
Starting Deployment of AdapterModuleEAR
Aborted: development component 'AdapterModuleEAR'/'sap.com'/'localhost'/'2009.12.01.18.36.40'/'0':Caught exception during application deployment from SAP J2EE Engine's deploy service:java.rmi.RemoteException: Cannot deploy application sap.com/AdapterModuleEAR.. Reason: Exception during generation of components of application sap.com/AdapterModuleEAR in container EJBContainer.; nested exception is: com.sap.engine.services.deploy.exceptions.ServerDeploymentException: Exception during generation of components of application sap.com/AdapterModuleEAR in container EJBContainer. (message ID: com.sap.sdm.serverext.servertype.inqmy.extern.EngineApplOnlineDeployerImpl.performAction(DeploymentActionTypes).REMEXC)
Deployment of AdapterModuleEAR finished with Error (Duration 14413 ms)
Obrigado.
At.,
Bernardo Tavares Braga
Boa tarde.
Antes de abrir o chamado estou tentando esgotar todas as possibilidades.
Fiz o How to, o projeto todo está OK, compilando sem problemas, porém estou com problema que a versão SAP NetWeaver 7.1 Composition Environment não possui a mesma interface da versão utilizada no How-to. Tentei adaptar os arquivos de configuração, porém cada vez que altero alguma coisa, o problema anterior se resolve e surge um novo no momento do Deploy, o último que tive foi esse: Cannot find the alternative deployment descriptor for EJB JAR file.
Tem um how-to baseado em uma versão mais nova do Developer Studio?
Qual versão do SAP EJB J2EE eu tenho que usar, a 1.4 ou a 5?
Obrigado.
At.,
Bernardo Tavares Braga
Henrique, estou trabalhando junto com o Bernardo nessa solução.
Baixamos o developer studio 7 e o deploy foi feito com sucesso.
Verifiquei a classe gerada por você no wiki (SetAttachmentName.java) e não entendi o que está sendo feito no trecho de código abaixo:
....
String message = moduleContext.getContextData("Message");
....
O que é retornado nessa chamada, é algo preenchido no conteúdo da mensagem?
Pergunto isso, porque eu criei um attachment porém ele não printou no corpo do email, o que tenho que fazer para que ele seja printado no corpo do email?
No me código eu setei conforme abaixo:
text.setName("NFEAtachment");
text.setContentType("text/plain");
text.setText(body);
O anexo foi criado com sucesso e enviado no email, porém o que eu desejo é que ele seja escrito no corpo do email.
Obs, o conteúdo da variável body é montado no mapping.
Marcio,
o metodo ModuleContext.getContextData(String) retorna o conteudo de um parametro que vc definiu na sequencia do module processor, no communication channel.
Na aba Module, vc teria os 2 modulos, o standard adapter module e o seu novo custom module.
No caso, vc teria que criar um parametro para o seu custom module (nesse exemplo, o nome do parametro é "Message"), e nesse parametro vc poderia fixar o texto que vai no corpo do email.
Alternativamente, vc pode montar esse texto dinamicamente no proprio codigo java do custom module, por exemplo baseado no conteudo XML.
Com relacao ao que vc descreveu, aparentemente o comportamento do Adapter Framework mudou nos ultimos SPs. Exatamente com esse codigo, ele criava o 2o anexo como inline e o conteudo ia no corpo do email.
Eu criei isso no projeto piloto de SAP NFE no Brasil.
Talvez uma pequena modificacao seja necessária para fazer funcionar.
Apesar do nome, o método Message.setContentType(String) seta o Content Disposition do payload.
Talvez funcione se vc usar algo do tipo:
text.setContentType("text/plain;inline;filename="Instrucoes.txt"");
Abs,
Henrique.
Uma outra alternativa é, depois do addAttachment(text), usar o metodo setMainPayload() pra setar o text como payload principal.
Ainda, no communication channel, em vez do Message Protocol XIPAYLOAD, tente o XIALL.
Abs,
Henrique.
Tem algo estranho. Efetuei o deploy exatamente como está na classe Java disponibilizada no wiki e quando uso os métodos via classe Payload alguma exceção é lançada, abaixo o erro:
Delivery of the message to the application using connection Mail_http://sap.com/xi/XI/System failed, due to: com.sap.aii.af.ra.ms.api.RecoverableException: Exception thrown in method process. The transaction is marked for rollback.: com.sap.engine.services.ejb.exceptions.BaseTransactionRolledbackLocalException: Exception thrown in method process. The transaction is marked for rollback..
Quando altero o código para usar TextPayload tudo funciona, ou melhor, não ocorre a exceção e o email é enviado com dois anexos, alguma idéia do que pode estar ocorrendo?
Abaixo o código que dá a exceção:
Payload text = msg.createPayload();
text.setContent(body.getBytes("UTF-8"));
text.setContentType("text/plain;filename="Instrucoes.txt"");
--nesse momento ocorre a exceção
msg.addAttachment(text);
Quando altero para o código abaixo não ocorre a exceção:
TextPayload text = msg.createTextPayload();
text.setName("NFeAttachment");
text.setContentType("text/plain");
text.setText(body);
Obs: Com isso não consegui setar o inline.
Acho que tentei, deu erro, mas vou tentar novamente e retorno amanhã, pois o basis que faz o deploy já foi embora. Lembro-me que tentei exatamente como você instruiu e não funcionou, daí tentei várias mudanças na parte do setContentType, mas não lembro se tentei com a classe TextPayload. Amanhã retorno o que ocorreu.
Obrigado por toda ajuda,
Márcio
Henrique,
Tentei o XIALL, ele além dos dois anexos, mandou também todo o Soap Document da mensagem do PI como anexo.
Fiz a seguinte alteração para testes amanhã:
text.setName("NFeAttachment");
text.setContentType("text/plain;inline");
text.setText(body);
Caso não funcione, vou tentar partir para o Mail Package.
Att,
Márcio
Henrique,
Achei um help interessante no SDN que talvez me ajude. http://www.sdn.sap.com/irj/scn/index?rid=/library/uuid/6d967fbc-0a01-0010-4fb4-91c6d38c5816&override... . Nesse artigo o Prashanth Azharuddin comenta sobre um EJB MessageTransformBean que me permite informar o Content Disposition do email para inline. A idéia minha será, efetuar a chamada do meu EJB, em seguida chamar o MessageTransformBean que coloca o meu anexo do tipo texto para inline e por último o EJB Default de email. O que acha da idéia?
Att,
Márcio
O Help que comentei no último post me fez refletir que se existe um EJB que consegue setar o Content Disposition provavelmente eu consigo fazer isso do meu código, daí comecei a analisar e cheguei a duas conclusões:
Existe um método na classe TextPayalod que é o setAttribute. Pesquisei um pouco sobre esse método e ele pode ser usado para seta propriedades do objeto, daí me veio a idéia de tentar isso:
text.setAttribute("Content-Disposition", "inline");
Isso me fez também pensar que o que pode estar errado é que talvez a chamada correta do setContentType deva ser:
text.setContentType("text/plain;Content-Disposition=inline");
Irei tentar seguir essa idéia para ver se resolve e assim que testar posto o resultado.
Novamente muito obrigado a todos pela ajuda,
Att,
Márcio
Marcio,
sim, muito provavelmente, o que o MessageTransformBean faz é chamar algum metodo que vc tb pode chamar, da interface Payload ou de alguma das subinterfaces.
Eu acho que tenho o codigo fonte desse module standard em algum lugar do meu note. Amanha dou uma buscada.
Com relacao a sua duvida, na verdade, o "text/plain" é o Content-Type, enqto que o "inline" eh o Content-Disposition (e o filename eh um parametro possivel do content disposition). Isso vc vê na RFC 2183 (http://www.ietf.org/rfc/rfc2183.txt). Soh que na library do AF, o objeto Payload nao tem um metodo setContentDisposition, entao o metodo setContentType faz as vezes de um.
Com relacao ao metodo .setAttribute(), ele está disponivel para vc na API do PI 7.0??
Se tiver, ele funciona sim!! Mas achei que ele soh estivesse disponivel no 7.1.
Olha soh o texto dessa nota:
Documentation: NetWeaver PI 7.1 SP6
AF API: NetWeaver PI 7.1 SP5
The com.sap.engine.interfaces.messaging.api.Payload interface was extended by the method to set, get and clear attributes. A Payload is mapped to a MIME attachment of the XI protocol, which uses SOAP with attachments internally. As such, MIME attachments have attributes like Content-Disposition or Content-Type, which now can be managed with the new getAttributeNames(), clearAttributes(), getAttribute(String attributeName), setAttribute(String name, String value), removeAttribute(String attributeName).
Se vc conseguir usar esse metodo, matou a charada.
Abs,
Henrique.
Henrique,
Descobri porque o corpo do email não está sendo escrito. Para que isso ocorra, o primeiro anexo tem que ser o texto e não o xml como está ocorrendo. Fiz com o MessageTransformBean mudar o xml do payload para texto e aí printou no corpo do email. Agora vem a pergunta, como faço para que o meu primeiro anexo seja o txt, ou seja, como passo o payload que já vem na mensagem para o segundo anexo? Pelo que andei lendo, uma vez atachado uma mensagem ela não pode ser removida da lista, então será que terei que criar o objeto de novo e atachar as duas mensagens?
Att,
Márcio
Marcio,
uma boa noticia!
No PI 7.0, com as APIs (.jars) do ultimo SP disponivel (SP20), existem os metodos .setAttribute() e .getAttribute() sim!
Ao menos apareceram aqui pra mim, na classe Payload.
No caso, seria apenas descobrir como alterar a ordem dos attachments na msg.
Na pior das hipoteses, dá pra remover o attachment NFe (msg.removeAttachment()) e adiciona-lo de novo apos o text.
Abs,
Henrique.
Se o .setAttribute() nao resolver, ultima tentativa: inclua as seguintes linhas de codigo.
1. substitua a linha
Message msg = (Message) inputModuleData.getPrincipalData();
pelo codigo abaixo:
Object obj = inputModuleData.getPrincipalData();
Message msg = (Message) obj;
com.sap.aii.messaging.mo.Message mo = null;
if (obj instanceof XIMessage) {
mo =
(com.sap.aii.messaging.mo.Message) ((XIMessage) obj)
.getXMBMessage();
} else if (obj instanceof MessageContext) {
mo = ((MessageContext) obj).getMessage();
} else {
Audit.addAuditLogEntry(
AuditLogStatus.WARNING,
"NFe: no payload found");
}
2. ao final do codigo, apos a linha
msg.addAttachment(text);
inclua o codigo abaixo:
XMBPayload apld = XMBMessageOperator.getApplicationPayload(mo);
for (int i = 0;
i < XMBMessageOperator.numberOfPayloadReferences(mo);
i++) {
XMBPayload pld = XMBMessageOperator.getPayload(mo, i);
if (pld.getPayloadName().equals(apld.getPayloadName()) {
continue;
} else {
pld.setPayloadType(PayloadType.APPLICATION);
apld.setPayloadType(PayloadType.APPLICATION_ATTACHMENT);
}
}
Para poder usar as classes abaixo:
com.sap.aii.adapter.xi.ms.XIMessage;
com.sap.aii.messaging.mo.Message
com.sap.aii.messaging.mo.MessageContext;
com.sap.aii.messaging.mo.xmb.XMBMessageOperator;
com.sap.aii.messaging.mo.xmb.XMBPayload;
vc precisa de 3 libs adicionais: aii_adapter_svc.jar, aii_msg_runtime.jar e guidgenerator.jar.
Vc consegue elas no proprio ambiente do PI.
Teoricamente a SAP nao autoriza o uso das classes dessas libs em modules custom.
Mas eu vi o codigo fonte do PayloadSwapBean e ele utiliza esse parametro.
Entao ou vc usa o PayloadSwapBean (o que nao seria tanto problema assim) ou usa essas classes.
Testa aí e vê se funciona.
Abs,
Henrique.
Henrique,
Conforme informei no último post, consegui entender que para que o corpo do email seja descrito, eu preciso que o primeiro attachment, ou o payload, não estou certo ainda, seja o primeiro anexo. Fiz uma alteração onde usei o removeAttachment, tudo no meu Modulo funcionou, porém no módulo default do correio recebi a seguinte mensagem:
Message processing failed. Cause: com.sap.aii.af.ra.ms.api.RecoverableException: com.sap.aii.messaging.srt.BubbleException: XI payload not found [null "null"]
Alguma idéia do que houve?
Abaixo um trecho do código:
try {
Audit.addAuditLogEntry(amk, AuditLogStatus.SUCCESS, "Removing NFe Attachment...");
msg.removeAttachment(nfe.getName());
Audit.addAuditLogEntry(amk, AuditLogStatus.SUCCESS, "NFe Attachment removed...");
}
catch (Exception e)
{
Audit.addAuditLogEntry(amk, AuditLogStatus.WARNING, "Erro removing NFe Attachment: " + e.getMessage());
}
try {
text.setAttribute("Content-Disposition", "inline");
text.setAttribute("charset", "UTF-8");
msg.addAttachment(text);
Audit.addAuditLogEntry(amk, AuditLogStatus.SUCCESS, "setAttribute was sucessfull...");
}
catch (Exception e1) {
Audit.addAuditLogEntry(amk, AuditLogStatus.WARNING, "Erro setting setContentType: " + e1.getMessage());
try {
text.setContentType("text/plain;Content-Disposition=inline;charset = "UTF-8"");
msg.addAttachment(text);
Audit.addAuditLogEntry(amk, AuditLogStatus.SUCCESS, "addAttachment was sucessfull...");
}
catch (Exception eAtt) {
Audit.addAuditLogEntry(amk, AuditLogStatus.WARNING, "Erro setting setAttribute: " + eAtt.getMessage());
try {
text.setContentType("text/plain");
msg.addAttachment(text);
Audit.addAuditLogEntry(amk, AuditLogStatus.SUCCESS, "setContentType with text-plain was sucessfull...");
}
catch (Exception err) {
Audit.addAuditLogEntry(amk, AuditLogStatus.WARNING, "Erro setting setContentType with text-plain: " + err.getMessage());
}
}
}
try
{
Audit.addAuditLogEntry(amk, AuditLogStatus.SUCCESS, "NFe: Setting Attachment Content Disposition...");
if (FileName == null)
nfe.setContentType("application/xml;charset = "UTF-8";filename="procNfe.xml"");
else
nfe.setContentType("application/xml;charset = "UTF-8";filename="" + FileName + """);
try {
Audit.addAuditLogEntry(amk, AuditLogStatus.SUCCESS, "Adding NFe Attachment...");
msg.addAttachment(nfe);
Audit.addAuditLogEntry(amk, AuditLogStatus.SUCCESS, "NFe Attachment added...");
}
catch (Exception e)
{
Audit.addAuditLogEntry(amk, AuditLogStatus.WARNING, "Erro removing NFe Attachment: " + e.getMessage());
}
Audit.addAuditLogEntry(amk, AuditLogStatus.SUCCESS, "NFe: " + FileName);
}
catch(InvalidParamException e)
{
Audit.addAuditLogEntry(amk, AuditLogStatus.ERROR, "NFe: Error setting E-mail details...");
throw new ModuleException("NFe: Error setting E-mail details...", e);
}
Att,
Márcio
Ficou horrível a formatação do último comentário, desculpe-me.
msg.removeAttachment(nfe.getName());
text.setAttribute("Content-Disposition", "inline");
text.setAttribute("charset", "UTF-8");
msg.addAttachment(text);
msg.addAttachment(text);
msg.addAttachment(nfe);
Daí ocorre o erro:
Message processing failed. Cause: com.sap.aii.af.ra.ms.api.RecoverableException: com.sap.aii.messaging.srt.BubbleException: XI payload not found [null "null"]
Att,
Márcio
Para o objeto Message, existe a interface disponivel na API do AF (que é a que vc usou no seu codigo para criar os attachmetns, por exemplo) mas existe tb uma classe interna, de uso restrito, que possui alguns outros metodos.
Dentro dessa classe, vc pode obter os payloads, que sao instancias do objeto XMBPayload e que possuem um atributo, payloadType, que define se sao o payload principal (PayloadType.APPLICATION) ou um attachment (PayloadType.APPLICATION_ATTACHMENT).
Eu extrai esse codigo do source do modulo PayloadSwapBean. Alternativamente, vc pode usar esse modulo standard sem ter que adicionar esse codigo ao seu.
Abs,
Henrique.
Alterei o código para ficar conforme sua orientação, porém alguma exceção ocorreu, estou com esse erro na mensagem:
Delivery of the message to the application using connection Mail_http://sap.com/xi/XI/System failed, due to: com.sap.aii.af.ra.ms.api.RecoverableException: Exception thrown in method process. The transaction is marked for rollback.: com.sap.engine.services.ejb.exceptions.BaseTransactionRolledbackLocalException: Exception thrown in method process. The transaction is marked for rollback..
Você saberia dizer como faço isso via Swap ou Transform como você comentou anteriormente?
Att,
Márcio
Henrique e Jose, muito obrigado por toda ajuda de vocês. Consegui resolver o meu problema utilizando javamapping. Tentei esgotar todas as possibilidades de efetuar a solução pelo módulo, porém eu não consegui fazer com que o anexo criado no módulo fosse printado no corpo do email. Usei o MessageTransformBean junto com o PayloadSwapBean, porém não obtive sucesso, sempre os o correio era enviado com dois anexos. Alterei via transform o tipo do payload da mensagem para text/plain daí ele escrevia o xml no corpo, só que o segundo não escrevia de jeito nenhum. Segui a orientação no blog do Stefan Grube (http://www.sdn.sap.com/irj/scn/weblogs;jsessionid=(J2EE3414800)ID0358120850DB11974506480389940426End?blog=/pub/wlg/6321) e deu certo.
Agradeço novamente toda ajuda,
Márcio
Marcio,
pena nao ter dado via module.
De fato a API do PI 7.0 nao eh a ideal para isso; o PI 7.1 trata bem melhor essas questoes. Alem do fato de que no PI 7.1 dah pra tratar attachment no mapping (a Java Mapping API do PI 7.1 trata nao soh o payload como todos os atributos e attachments da msg XI). Fica bem mais facil.
Abs,
Henrique.
User | Count |
---|---|
12 | |
3 | |
2 | |
1 | |
1 | |
1 | |
1 | |
1 | |
1 | |
1 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.