Java 增加一次处理的出列消息数(ActiveMQ)
我在JBoss AS7中运行了一个MDB,它使用ActiveMQ JCA资源适配器从远程ActiveMQ 5.6代理接收消息 生产商代码:Java 增加一次处理的出列消息数(ActiveMQ),java,jboss,activemq,Java,Jboss,Activemq,我在JBoss AS7中运行了一个MDB,它使用ActiveMQ JCA资源适配器从远程ActiveMQ 5.6代理接收消息 生产商代码: public void sendMessage(IDeliveryMessage message) throws Exception { Connection conn = null; Session session = null; MessageProducer producer = null; try {
public void sendMessage(IDeliveryMessage message) throws Exception {
Connection conn = null;
Session session = null;
MessageProducer producer = null;
try {
// Setup the connection & session
ConnectionFactory cf = NamedObjectLocator.getConnectionFactory();
conn = cf.createConnection();
Destination destination = NamedObjectLocator.getDestination();
session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
conn.start();
// Send a text message
producer = session.createProducer(destination);
ObjectMessage om = session.createObjectMessage(message);
String id = System.currentTimeMillis()+"";
om.setJMSCorrelationID(id);
System.out.println("Producer: " + id);
producer.send(om);
} catch (Exception e) {
throw new Exception(e.getMessage(), e);
} finally {
if (producer != null) {
producer.close();
}
if (session != null) {
session.close();
}
if (conn != null) {
conn.stop();
conn.close();
}
}
}
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.Message;
import javax.jms.MessageListener;
@MessageDriven(name = "OutBoundMDB", activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/OutboundIntegrationQueue")})
public class OutBoundMDB implements MessageListener {
public static final long serialVersionUID = 8609676375853959140L;
public void onMessage(Message message) {
try {
System.out.println("Consumer: " + message.getJMSCorrelationID());
Thread.sleep(20000L);
} catch (Exception e) {
LogManager.logError(e);
}
}
}
消费者代码:
public void sendMessage(IDeliveryMessage message) throws Exception {
Connection conn = null;
Session session = null;
MessageProducer producer = null;
try {
// Setup the connection & session
ConnectionFactory cf = NamedObjectLocator.getConnectionFactory();
conn = cf.createConnection();
Destination destination = NamedObjectLocator.getDestination();
session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
conn.start();
// Send a text message
producer = session.createProducer(destination);
ObjectMessage om = session.createObjectMessage(message);
String id = System.currentTimeMillis()+"";
om.setJMSCorrelationID(id);
System.out.println("Producer: " + id);
producer.send(om);
} catch (Exception e) {
throw new Exception(e.getMessage(), e);
} finally {
if (producer != null) {
producer.close();
}
if (session != null) {
session.close();
}
if (conn != null) {
conn.stop();
conn.close();
}
}
}
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.Message;
import javax.jms.MessageListener;
@MessageDriven(name = "OutBoundMDB", activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/OutboundIntegrationQueue")})
public class OutBoundMDB implements MessageListener {
public static final long serialVersionUID = 8609676375853959140L;
public void onMessage(Message message) {
try {
System.out.println("Consumer: " + message.getJMSCorrelationID());
Thread.sleep(20000L);
} catch (Exception e) {
LogManager.logError(e);
}
}
}
jbossstandalone.xml:
<subsystem xmlns="urn:jboss:domain:resource-adapters:1.0">
<resource-adapters>
<resource-adapter>
<archive>
activemq-rar.rar
</archive>
<transaction-support>XATransaction</transaction-support>
<config-property name="ServerUrl">
tcp://localhost:61616
</config-property>
<connection-definitions>
<connection-definition class-name="org.apache.activemq.ra.ActiveMQManagedConnectionFactory" jndi-name="java:/JmsXA" enabled="true" use-java-context="true" pool-name="ActiveMQConnectionFactoryPool" use-ccm="true">
<xa-pool>
<min-pool-size>1</min-pool-size>
<max-pool-size>20</max-pool-size>
</xa-pool>
</connection-definition>
</connection-definitions>
<admin-objects>
<admin-object class-name="org.apache.activemq.command.ActiveMQQueue" jndi-name="java:/queue/OutboundIntegrationQueue" enabled="true" use-java-context="true" pool-name="ActiveMQQueue.OutboundIntegrationQueue">
<config-property name="PhysicalName">queue/OutboundIntegrationQueue</config-property>
</admin-object>
</admin-objects>
</resource-adapter>
</resource-adapters>
</subsystem>
我希望一次退出队列的邮件数量(目前约为10条)增加到50条或更多。请查看。您几乎肯定需要调整maxSessions
和maxMessagesPerSession
以满足您的性能目标
您可能还需要调整容器维护的池中MDB实例的数量(在本例中为JBoss EAP)。在服务器配置中搜索
mdb strict max pool
。默认情况下,它从服务器的CPU计数导出池大小,但您可以使用max pool size
显式设置它。我相信推导过程使用了以下公式:Runtime.getRuntime().availableProcessors()*4
(请参阅)。您如何处理消息(例如MDB、standalone MessageConsumer、standalone MessageListener等)?你们有多少消费者?您是否已将ActiveMQ配置为在JBoss AS7中嵌入式运行,还是独立运行?您如何处理这些消息?MDB。。。你们有多少消费者?1.您是否已将ActiveMQ配置为在JBoss AS7中嵌入式运行,还是独立运行?未嵌入Jboss,它是独立运行的。如果您在Jboss AS7中运行一个MDB,它使用来自远程ActiveMQ 5.x代理的消息,那么我假设MDB使用的是ActiveMQ JCA资源适配器。如果正确,MDB的激活配置是什么?如果没有,请详细说明如何在JBoss AS7和ActiveMQ代理之间配置连接。另外,你不应该用你自己的评论来回答这些评论,而应该用额外的细节来编辑你的原始问题,这样问题就更全面、更容易回答。我已经重新表述了整个问题——希望这能更好地解释我的问题,并可能帮助我找到解决方案。谢谢