我开始Java EE项目,需要大力扩展。迄今为止,这一概念是:

  • 几个消息驱动的豆类、负责的不同部分的建筑
  • 各多边发展银行所有会议豆注,处理的业务逻辑
  • 几个实体豆、提供获取持久层
  • 通信之间的不同部分的架构,通过请求/应答的概念,通过JMS信息:
    • MDB收到消息包含活动的请求
    • 使用其会议豆执行必要的业务逻辑
    • 返回响应的对象msg到原来的请求

当时的想法是,通过德-偶部分的架构彼此通过的消息车,没有限制的可伸缩性。只是开始多个部件--只要它们都连到同样的车,我们可以成长和成长。

不幸的是,我们具有巨大的问题的请求的答复的概念。事务的管理似乎是,在我们的方式很多。它缝该届会议豆不应该使用消息?!

阅读 http://blogs.oracle.com/fkieviet/entry/request_reply_from_an_ejbhttp://forums.sun.com/message.jspa?messageID=10338789, 我得到的感觉是,人们实际上推荐 反对 请求/回复的概念前总.

如果是这种情况下,如何 你之间的通信你的前总?(要记住,可扩展性是什么我以后)

细节我目前的安装:

  • MDB1'TestController',使用的(当地的)SLSB1'TestService'的商务逻辑
  • TestController.onMessage()使TestService发送信息到队列XYZ和请求的答复
    • TestService使用豆管理的事务
    • TestService建立连接&届会议的JMS经纪人通过一个共同连接工厂,在初始化(@PostConstruct)
    • TestService提交事务在发送之后,然后开始的另一个事务并等待10秒的响应
  • 消息得到MDB2'LocationController',其使用(当地)SLSB2'LocationService'的商务逻辑
  • LocationController.onMessage()使LocationService发送消息 所请求的JMSReplyTo队列
    • 同一骨髓移植概念,同@PostConstruct概念
  • 所有使用相同的连接工厂访问的经纪人

问题:第一个消息发送(通过SLSB1)和收到的(由MDB2)确定。发送返回的消息(通过SLSB2)的现。但是, SLSB1从来没有收到任何东西 -这只是时间出来。

我试图不messageSelector,没有变化,仍然没有接收信息。

这不是好消耗的消息通过会议豆?

SLSB1-TestService.java

@Resource(name = "jms/mvs.MVSControllerFactory")
private javax.jms.ConnectionFactory connectionFactory;

@PostConstruct
public void initialize() {
    try {
      jmsConnection = connectionFactory.createConnection();
      session = jmsConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
      System.out.println("Connection to JMS Provider established");
    } catch (Exception e) { }
}

public Serializable sendMessageWithResponse(Destination reqDest, Destination respDest, Serializable request) {
    Serializable response = null;

    try {
        utx.begin();
        Random rand = new Random();
        String correlationId = rand.nextLong() + "-" + (new Date()).getTime();

        // prepare the sending message object
        ObjectMessage reqMsg = session.createObjectMessage();
        reqMsg.setObject(request);
        reqMsg.setJMSReplyTo(respDest);
        reqMsg.setJMSCorrelationID(correlationId);

        // prepare the publishers and subscribers
        MessageProducer producer = session.createProducer(reqDest);

        // send the message
        producer.send(reqMsg);
        System.out.println("Request Message has been sent!");
        utx.commit();

        // need to start second transaction, otherwise the first msg never gets sent
        utx.begin();
        MessageConsumer consumer = session.createConsumer(respDest, "JMSCorrelationID = '" + correlationId + "'");
        jmsConnection.start();
        ObjectMessage respMsg = (ObjectMessage) consumer.receive(10000L);
        utx.commit();

        if (respMsg != null) {
            response = respMsg.getObject();
            System.out.println("Response Message has been received!");
        } else {
            // timeout waiting for response
            System.out.println("Timeout waiting for response!");
        }

    } catch (Exception e) { }

    return response;
}

SLSB2-LocationService.Java (只有回复方法,其余是上述相同)

public boolean reply(Message origMsg, Serializable o) {
    boolean rc = false;

    try {
        // check if we have necessary correlationID and replyTo destination
        if (!origMsg.getJMSCorrelationID().equals("") && (origMsg.getJMSReplyTo() != null)) {
            // prepare the payload
            utx.begin();
            ObjectMessage msg = session.createObjectMessage();
            msg.setObject(o);

            // make it a response
            msg.setJMSCorrelationID(origMsg.getJMSCorrelationID());
            Destination dest = origMsg.getJMSReplyTo();

            // send it
            MessageProducer producer = session.createProducer(dest);
            producer.send(msg);
            producer.close();
            System.out.println("Reply Message has been sent");
            utx.commit();

            rc = true;
        }

    } catch (Exception e) {}

    return rc;
}

sun-resources.xml

<admin-object-resource enabled="true" jndi-name="jms/mvs.LocationControllerRequest"  res-type="javax.jms.Queue"  res-adapter="jmsra">
    <property name="Name" value="mvs.LocationControllerRequestQueue"/>
</admin-object-resource>
<admin-object-resource enabled="true" jndi-name="jms/mvs.LocationControllerResponse"  res-type="javax.jms.Queue"  res-adapter="jmsra">
    <property name="Name" value="mvs.LocationControllerResponseQueue"/>
</admin-object-resource>

<connector-connection-pool name="jms/mvs.MVSControllerFactoryPool"  connection-definition-name="javax.jms.QueueConnectionFactory"  resource-adapter-name="jmsra"/>
<connector-resource enabled="true" jndi-name="jms/mvs.MVSControllerFactory" pool-name="jms/mvs.MVSControllerFactoryPool"  />
有帮助吗?

解决方案

请求/回复模式,即使用JMS,仍然是 同步 在本质。呼叫者发送消息,然后等待答复。这不仅是复杂的,因为分布式交易,同时也意味着,在等待答复时,一个或几个资源(在线至少在这种情况下)的分配和浪费。你可以不扩大这个方式:你是本来就有限数量的螺纹。

有一个真正可伸缩JMS建筑一切都必须 异步.在其他术语:你不应该等待。消息发送和接收应通过必要的信息,以触发下一个活动。

如果消息的大小会是太大了,你可以存储只有一个标识和存储相应的数据库中的数据。但随后的数据库将成为又一个争论的焦点。

如果不同的信息需要知道的在其长期运行的过程中,他们参加,也可以使用 相关的标识符.收到消息时,收到可以"恢复"的长期运行的活动使用的相关标识符。这是一个传统的模式与BPEL。主要的差异之间的同步请求/回应和异步信息,与相关标识符,资源可以被释放之间的每一个步骤。你可以的规模与以后,但不是第一次。

说实话,我很困惑你长的职位,并没有理解如果你的设计而异(和更正),或同步与请求/回应(和有问题的).但我希望,我提供一些元件的答复。

在任何情况下去访问的网站 企业集成模式, 它是一个宝贵的信息来源。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top