什么是最好的通信模式EJB3基础的应用程序?
-
20-09-2019 - |
题
我开始Java EE项目,需要大力扩展。迄今为止,这一概念是:
- 几个消息驱动的豆类、负责的不同部分的建筑
- 各多边发展银行所有会议豆注,处理的业务逻辑
- 几个实体豆、提供获取持久层
- 通信之间的不同部分的架构,通过请求/应答的概念,通过JMS信息:
- MDB收到消息包含活动的请求
- 使用其会议豆执行必要的业务逻辑
- 返回响应的对象msg到原来的请求
当时的想法是,通过德-偶部分的架构彼此通过的消息车,没有限制的可伸缩性。只是开始多个部件--只要它们都连到同样的车,我们可以成长和成长。
不幸的是,我们具有巨大的问题的请求的答复的概念。事务的管理似乎是,在我们的方式很多。它缝该届会议豆不应该使用消息?!
阅读 http://blogs.oracle.com/fkieviet/entry/request_reply_from_an_ejb 和 http://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。主要的差异之间的同步请求/回应和异步信息,与相关标识符,资源可以被释放之间的每一个步骤。你可以的规模与以后,但不是第一次。
说实话,我很困惑你长的职位,并没有理解如果你的设计而异(和更正),或同步与请求/回应(和有问题的).但我希望,我提供一些元件的答复。
在任何情况下去访问的网站 企业集成模式, 它是一个宝贵的信息来源。