Logging 为什么带有Wildfly ActiveMQ的slf4j会导致ObjectMessage.getMessage()抛出JMSException?

Logging 为什么带有Wildfly ActiveMQ的slf4j会导致ObjectMessage.getMessage()抛出JMSException?,logging,jms,activemq,wildfly-10,Logging,Jms,Activemq,Wildfly 10,我正在恢复一个使用WildFly 8/HornetMQ/Log4J的旧应用程序。它是一个交换JMS对象消息的远程Java GUI客户端 到目前为止,当为WildFly 10/ActiveMQ/Slf4j重新配置时,所有功能都能正常工作,除了一件事: 在我的MDB收到ObjectMessage(其对象是ArrayList)后,当MDB调用消息上的getObject()时,它会抛出JMSException错误。jmsception。e、 getMessage()返回: 但是,如果我从ArrayLis

我正在恢复一个使用WildFly 8/HornetMQ/Log4J的旧应用程序。它是一个交换JMS对象消息的远程Java GUI客户端

到目前为止,当为WildFly 10/ActiveMQ/Slf4j重新配置时,所有功能都能正常工作,除了一件事:

在我的MDB收到ObjectMessage(其对象是ArrayList)后,当MDB调用消息上的getObject()时,它会抛出JMSException错误。jmsception。e、 getMessage()返回:

但是,如果我从ArrayList中的EntityParent实例中删除Slf4J日志记录,则所有日志记录都可以正常工作……除非我无法从MDB从ObjectMessage中提取的EntityParent子类中进行日志记录

以下是我目前所知道的:

这显然是Slf4j的问题,我猜是序列化。因为否则,Slf4j在服务器端就可以正常工作。我的意思是,上面的消息是用MDB中的记录器代码写入WF日志的:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
final Logger logger = Logger.getLogger(GoMsgBean.class.getName());
My MDB确认消息以如下方式到达: ActiveMQObjectMessage

在传输ObjectMessage之前,我测试了EntityParent实例和ArrayList的序列化能力,包括:

new ObjectOutputStream(new ByteArrayOutputStream()).writeObject(each of the above objects separately);
web搜索带来了一个与我的问题相匹配的结果–getObject()抛出JMSException。但它被标记为未应答。而且,在讨论代理服务器和类加载器时,所发布的内容被包装得如此严苛,以至于毫无用处

我发现了与Log4j记录器相关的其他讨论。他们建议将记录器注释为@Transient。但后来又声称切换到slf4j“解决”了这个问题,而没有使它变成“瞬态”。所以我都切换到slf4j,并将其标记为“瞬态”。未使用ArrayList中EntityParent的所有子类中的所有记录器:

@Transient
final Logger logger = LoggerFactory.getLogger(LoggedIn.class);
slf4j网站讨论了其他问题,但它们似乎都涉及应用程序试图保留log4j日志的情况。不再是我的案子了

所以我希望有人能帮上忙,因为我不知道还能去哪里找……我真正的工作是在MDB提取实体后处理数据库

如果有任何用处,下面是standalone-full.xml的activeMQ子系统

<subsystem xmlns="urn:jboss:domain:messaging-activemq:1.0">
    <server name="default">
        <security enabled="false"/>
        <security-setting name="#">
            <role name="guest" send="true" consume="true" create-non-durable-queue="true" delete-non-durable-queue="true"/>
        </security-setting>
        <address-setting name="#" dead-letter-address="jms.queue.DLQ" expiry-address="jms.queue.ExpiryQueue" max-size-bytes="10485760" page-size-bytes="2097152" message-counter-history-day-limit="10"/>
        <http-connector name="http-connector" socket-binding="http" endpoint="http-acceptor"/>
        <http-connector name="http-connector-throughput" socket-binding="http" endpoint="http-acceptor-throughput">
    <param name="batch-delay" value="50"/>
        </http-connector>
        <in-vm-connector name="in-vm" server-id="0"/>
        <http-acceptor name="http-acceptor" http-listener="default"/>
        <http-acceptor name="http-acceptor-throughput" http-listener="default">
            <param name="batch-delay" value="50"/>
            <param name="direct-deliver" value="false"/>
        </http-acceptor>
        <in-vm-acceptor name="in-vm" server-id="0"/>
        <jms-queue name="ExpiryQueue" entries="java:/jms/queue/ExpiryQueue"/>
        <jms-queue name="DLQ" entries="java:/jms/queue/DLQ"/>
        <jms-queue name="SendToServerQueue" entries="java:jboss/exported/jms/queue/sendToServerQueue java:/jms/queue/sendToServerQueue"/>
        <jms-queue name="SendToClientQueue2" entries="java:jboss/exported/jms/queue/sendToClientQueue2"/>
        <connection-factory name="InVmConnectionFactory" entries="java:/ConnectionFactory" connectors="in-vm"/>
        <connection-factory name="RemoteConnectionFactory" entries="java:jboss/exported/jms/RemoteConnectionFactory" connectors="http-connector"/>
        <pooled-connection-factory name="activemq-ra" entries="java:/JmsXA java:jboss/DefaultJMSConnectionFactory" connectors="in-vm" transaction="xa"/>
    </server>
</subsystem>

使记录器变量
暂时
,我的意思不是说
@transient

您在部署中排除了日志子系统或日志依赖项吗哎呀。。。我还没来得及提一下,上面的评论就消失了,我在deployed时发现.ear的META-INFO文件夹中内置了一个module.xml工件。就在上面。不知道如何格式化这些注释中的代码。但是我把它拿走了。。。没有变化。getObject()上存在相同错误。否则,我没有故意在部署中添加依赖项。ear中内置的其他xml文件是application.xml和persistence.xml,这两个文件都不是地址日志。我在[wildfly-10.1.0.Final\modules\system\layers\base\org\jboss\logging\main\module.xml]中找到了这个文件……(我正在研究如何使代码看起来像代码)对不起。。。这只是一个测试,我只能尝试一个真实的注释:“第1行第2行第3行”?Post说Backtics将格式化代码。但似乎并不感谢你。就这么简单。所以我欠你赏金。但就我的一生而言,我不知道如何奖励它。或者可能是堆栈溢出在过期时偷走了它。你知道我是否还能奖励它吗。还是我必须再发一张来付清?这个系统真的需要更好的解释。我同意,确实如此。一旦它消失了,我相信它就消失了。你可以向梅塔询问这件事。
<subsystem xmlns="urn:jboss:domain:messaging-activemq:1.0">
    <server name="default">
        <security enabled="false"/>
        <security-setting name="#">
            <role name="guest" send="true" consume="true" create-non-durable-queue="true" delete-non-durable-queue="true"/>
        </security-setting>
        <address-setting name="#" dead-letter-address="jms.queue.DLQ" expiry-address="jms.queue.ExpiryQueue" max-size-bytes="10485760" page-size-bytes="2097152" message-counter-history-day-limit="10"/>
        <http-connector name="http-connector" socket-binding="http" endpoint="http-acceptor"/>
        <http-connector name="http-connector-throughput" socket-binding="http" endpoint="http-acceptor-throughput">
    <param name="batch-delay" value="50"/>
        </http-connector>
        <in-vm-connector name="in-vm" server-id="0"/>
        <http-acceptor name="http-acceptor" http-listener="default"/>
        <http-acceptor name="http-acceptor-throughput" http-listener="default">
            <param name="batch-delay" value="50"/>
            <param name="direct-deliver" value="false"/>
        </http-acceptor>
        <in-vm-acceptor name="in-vm" server-id="0"/>
        <jms-queue name="ExpiryQueue" entries="java:/jms/queue/ExpiryQueue"/>
        <jms-queue name="DLQ" entries="java:/jms/queue/DLQ"/>
        <jms-queue name="SendToServerQueue" entries="java:jboss/exported/jms/queue/sendToServerQueue java:/jms/queue/sendToServerQueue"/>
        <jms-queue name="SendToClientQueue2" entries="java:jboss/exported/jms/queue/sendToClientQueue2"/>
        <connection-factory name="InVmConnectionFactory" entries="java:/ConnectionFactory" connectors="in-vm"/>
        <connection-factory name="RemoteConnectionFactory" entries="java:jboss/exported/jms/RemoteConnectionFactory" connectors="http-connector"/>
        <pooled-connection-factory name="activemq-ra" entries="java:/JmsXA java:jboss/DefaultJMSConnectionFactory" connectors="in-vm" transaction="xa"/>
    </server>
</subsystem>
package org.america3.gotest.shared.jpa;

//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Transient;
import org.america3.gotest.shared.interfaces.DataItemKeyValues;
import org.america3.gotest.shared.tools.Utility;

@NamedQueries(
{@NamedQuery(name="LoggedIn.findLoggedInbyId",
             query = "SELECT li "  +
                     "From LoggedIn li "   + 
                     "WHERE li.memberId = :memberIdP"),
 @NamedQuery(name="findLoggedInByAll",
             query = "DELETE FROM LoggedIn li " +
                     "WHERE li.memberId = :memberIdP " +
                     "AND   li.memberPw = :memberPwP " +
                     "AND   li.clientHash = clientHashP")
})

@Entity(name="LoggedIn")
@Table(name="loggedins")
public class LoggedIn extends EntityParent implements Serializable, DataItemKeyValues {
  /* See EntityParent for explanation of 9 fields
   * This subclass only persists memberId, memberPW, and clientHash
   */

  //@Transient
  //final Logger logger = LoggerFactory.getLogger(LoggedIn.class);

  //constructors
  public LoggedIn() {
    this.setMemberId(NOT_APPLICABLE);
    this.setMemberPw(NOT_APPLICABLE);
    this.SetClientHash(NOT_APPLICABLE);
    this.setClientUserId(NOT_APPLICABLE);
    this.setClientUserPw(NOT_APPLICABLE);
    this.setOwnerId(NOT_APPLICABLE);
    this.setOwnerPw(NOT_APPLICABLE);
    this.setOpponentId(NOT_APPLICABLE);
    this.setOpponentPw(NOT_APPLICABLE);
  };

  public LoggedIn(String hash, String id, String pw) {   
    this();
    if (id != null && pw !=null && hash != null) {
      this.setMemberId(id);
      this.setMemberPw(pw);
      this.SetClientHash(hash);
    } else {
      //logger.error("Log in was attempted with: id \"" + id + "\" pw \"" + hash + "\"");
      String iAmM = Utility.getIAmM(Thread.currentThread().getStackTrace());
      System.err.println(iAmM + "Log in was attempted with: id \"" + id + "\" pw \"" + hash + "\"");
    }
  }

  public LoggedIn(EntityParent loggedIn) {
    this();
    this.memberId = loggedIn.getMemberId();
    this.memberPw = loggedIn.getMemberPw();
    this.clientHash = loggedIn.getClientHash();
  }

  // persisted fields
  @Id @Column(name="PK")
  @GeneratedValue(strategy=GenerationType.IDENTITY)
  private Integer pk;

  @Column(name="MBR_ID")
  private String memberId;

  @Column(name="MBR_PW")
  private String memberPw;

  @Column(name="HASH")
  private String clientHash;

  // Transient fields
  @Transient
  private String clientUserId;
  @Transient
  private String clientUserPw;
  @Transient
  private String ownerId;
  @Transient
  private String ownerPw;
  @Transient
  private String opponentId;
  @Transient
  private String opponentPw;

  private static final long serialVersionUID = 1L;  

  // get set methods
  public Integer getPk () {return this.pk;}
  public void setPk (Integer pk) {this.pk = pk;}

  public String getMemberId () {return memberId;}
  public void   setMemberId (String memberId) {this.memberId = (memberId == null? "" : memberId);}

  public String getMemberPw () {return this.memberPw;}
  public void   setMemberPw (String memberPw) {this.memberPw = (memberPw == null? "" : memberPw);}

  public String getClientHash () {return clientHash;}
  public void   SetClientHash (String clientHash) {this.clientHash = (clientHash == null? "" : clientHash);}

  public boolean equals (LoggedIn otherLoggedIn) {
    if (otherLoggedIn == null) return false;
    if (this.pk == otherLoggedIn.getPk()) {
      return true;
    } else {
      return false;
    }
  }

  // other methods
  @Transient
  public String getClientUserId () {return this.clientUserId;}
  public void   setClientUserId (String clientUserId) {this.clientUserId = (clientUserId == null? "" : clientUserId);}

  @Transient
  public String getClientUserPw () {return this.clientUserPw;}
  public void   setClientUserPw (String clientUserPw) {this.clientUserPw = (clientUserPw == null? "" : clientUserPw);}

  @Transient
  public String getOwnerId () {return this.ownerId;}
  public void   setOwnerId (String ownerId) {this.ownerId = (ownerId == null? "" : ownerId);}

  @Transient
  public String getOwnerPw () {return ownerPw;}
  public void   setOwnerPw (String ownerPw) {this.ownerPw = (ownerPw == null? "" : ownerPw);}

  @Transient
  public String getOpponentId () {return opponentId;}
  public void   setOpponentId (String opponentId) {this.opponentId = (opponentId == null? "" : opponentId);}

  @Transient
  public String getOpponentPw () {return opponentPw;}
  public void   setOpponentPw (String opponentPw) {this.opponentPw = (opponentPw == null? "" : opponentPw);}


  public void writeEntity () {
    //String iAmS = Utility.getIAmS(Thread.currentThread().getStackTrace());
    //logger.info(iAmS + this.getClass().getSimpleName() + "  contains these values");
    //logger.info(iAmS + "  PK (pk)             : " + this.pk);
    //logger.info(iAmS + "  MBR_ID (memberId)   : " + this.memberId);
    //logger.info(iAmS + "  MBR_PW (memberPw)   : " + this.memberPw);
    //logger.info(iAmS + "  HASH (clientHash)   : " + this.clientHash);
    //logger.info(iAmS + "  Trans (clientUserId): " + this.clientUserId);
    //logger.info(iAmS + "  Trans (clientUserPw): " + this.clientUserPw);
  }

}