是什么原因可以激励程序员在分布式Java应用程序中使用Java JMS(Java消息服务)API而不是java.net包的UDP套接字API,或者使用UDP套接字API代替JMS API?如果可能,请举例说明.
目前,我们在ActiveMQ库之上使用一些自定义代码来进行JMS消息传递.我一直在寻求切换到Camel,易于使用,易于维护和可靠性.
使用我目前的配置,Camel的ActiveMQ实现比我们的旧实现要慢得多,无论是发送和接收的每条消息的延迟,还是发送和接收大量消息所花费的时间.我试过调整一些配置(例如最大连接),但无济于事.
我有两个应用程序,一个使用我们的旧实现,一个使用Camel实现.每个应用程序都将JMS消息发送到本地ActiveMQ服务器上的主题,并且还侦听有关该主题的消息.这用于测试两个场景: - 在循环中向主题发送100,000条消息,并查看从开始发送到结束处理所有这些消息所需的时间. - 每100毫秒发送一条消息,并测量从发送到处理每条消息的延迟(以ns为单位).
我是否可以根据发送到消息洪流的时间和个别消息的时间来改进下面的实现?理想情况下,改进将涉及调整我错过的一些配置,或建议更好的方法来做,而不是太hacky.将会赞赏对改进的解释.
编辑:既然我是异步发送消息,我似乎有一个并发问题.receivedCount没有达到100,000.查看ActiveMQ Web界面,排队100,000条消息,排队100,000条,因此消息处理方面可能存在问题.我已经改成receivedCount了一个AtomicInteger并添加了一些日志来帮助调试.这可能是Camel本身(或ActiveMQ组件)的问题,还是消息处理代码有问题?据我所知,只有~99,876条消息正在通过floodProcessor.process.
编辑:更新了异步发送和记录并发问题.
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.camel.component.ActiveMQComponent;
import org.apache.activemq.pool.PooledConnectionFactory;
import org.apache.camel.CamelContext;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.jms.JmsConfiguration;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.log4j.Logger;
public class CamelJmsTest{
private static final Logger logger = Logger.getLogger(CamelJmsTest.class);
private static final boolean flood = true;
private static final int NUM_MESSAGES …Run Code Online (Sandbox Code Playgroud) 我的问题是,最好的方法是跟踪应用程序管理员的异常.(出于维护目的,通知管理员抛出的异常).
对于系统用户,我认为应该捕获异常并显示相应的错误消息. 我认为,对于系统管理员来说,最好的方法是让消息系统将每个异常的详细信息作为消息发送给接收方.一旦接收方收到新的错误消息,它就会在数据库中持续显示,或者向管理员发送一封包含异常详细信息的电子邮件.
try{
....
}
catch(Exception e){
//what to do here? how to notify admin?
}
Run Code Online (Sandbox Code Playgroud) 我正在编写一个独立的main方法,它调用生产者(将数据推送到队列中),然后调用一个持续监听主题的消费者.
我已经覆盖了onMessage并且我能够从队列中获取消息,但是我无法将消息返回给调用方法.
实际上,我想把这条消息带到浏览器,因此想测试一下我是否可以将它至少带到主机上.
请帮忙;
class TextMessageListener implements MessageListener {
String msgData;
public String getMsgData() {
return msgData;
}
public void setMsgData(String msgData) {
this.msgData = msgData;
}
public void onMessage(Message message) {
try {
if (message instanceof TextMessage) {
TextMessage textMessage = (TextMessage) message;
System.out.println("Received message in ::" + textMessage.getText() + " '");
setMsgData(textMessage.getText());
}
} catch (JMSException e) {
System.out.println("Caught:" + e);
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud) 当我运行JMS相关的应用程序时,我遇到以下异常错误.
javax.naming.NoInitialContextException:需要在环境或系统属性或applet参数或应用程序资源文件中指定类名:java.naming.factory.initial
我们正在使用Sun Application Server 9.1
知道我们缺少什么吗?
我已经尝试添加以下内容但结果仍然相同
Properties env = new Properties();
env.put("java.naming.factory.initial","com.sun.jndi.cosnaming.CNCtxFactory");
Context ctx = new InitialContext(env);
Run Code Online (Sandbox Code Playgroud) 我正在使用MQ7并尝试使用JMS api访问队列.得到这个错误.有没有人见过它?我该如何解决这个问题?TIA
线程"main"中的异常com.ibm.msg.client.jms.DetailedJMSException:JMSFMQ6312:Java(tm)MQI中发生异常.Java(tm)MQI抛出了描述问题的异常.有关详细信息,请参阅链接的异常.
引起:com.ibm.mq.jmqi.JmqiException:CC = 2; RC = 2495; AMQ8568:找不到本机JNI库'mqjbnd'.[3 = mqjbnd]
引起:java.lang.UnsatisfiedLinkError:java.library.path中没有mqjbnd
我正在尝试首次设置Apache ActiveMQ
我发现我的服务器名称中有一个下划线,这阻止了ActiveMQ的启动.它抛出了这个异常:
java.net.URISyntaxException:索引8的主机名中的非法字符:ws://cms_delta.mycompany.com:61614?maximumConnections = 1000&wireFormat.maxFrameSize = 104857600)...
我在哪里可以在配置中设置主机名.此服务器具有其他别名但没有下划线,或者我可以使用IP地址.正在自动获取服务器名称cms_delta.mycompany.com.
除了brokerName之外,我在activemq.xml中看不到任何明显的东西,但是这并没有解决问题.
这是完整的日志:
2013-11-14 14:30:02,347 | INFO | Refreshing org.apache.activemq.xbean.XBeanBrokerFactory$1@54520eb: startup date [Thu Nov 14 14:30:02 PST 2013]; root of context hierarchy | org.apache.activemq.xbean.XBeanBrokerFactory$1 | main
2013-11-14 14:30:04,100 | INFO | PListStore:[/opt/apache-activemq-5.9.0/data/esb-dev.mycompany.com/tmp_storage] started | org.apache.activemq.store.kahadb.plist.PListStoreImpl | main
2013-11-14 14:30:04,154 | INFO | Using Persistence Adapter: KahaDBPersistenceAdapter[/opt/apache-activemq-5.9.0/data/kahadb] | org.apache.activemq.broker.BrokerService | main
2013-11-14 14:30:04,475 | INFO | Persistence store purged. | org.apache.activemq.store.kahadb.MessageDatabase | main
2013-11-14 14:30:04,678 | INFO | Apache ActiveMQ 5.9.0 (esb-dev.mycompany.com, ID:cms_delta.mycompany.com-35039-1384468204550-0:1) …Run Code Online (Sandbox Code Playgroud) 如何使用Java API检查JMS服务器上是否存在队列?我现在不想向队列发送或接收任何数据,只需验证队列是否存在.此外,队列可能是空的.
这是我的代码示例.为简单起见,我删除了错误处理.
Connection connection = null;
Session session = null;
connection = factory.createConnection();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//I was hoping this next line would throw an exception if the queue does not exist
Queue queue = session.createQueue(queueName);
Run Code Online (Sandbox Code Playgroud)
我的JMS服务器是TIBCO EMS.我希望有一个适用于5-7版本的解决方案.
解
我按照接受的答案中的建议,但创建了一个浏览器.以下行根据需要引发了异常:
QueueBrowser browser = session.createBrowser(queue);
Run Code Online (Sandbox Code Playgroud) 我正在使用带@JmsListener注释的方法监听JMS消息,如下所示.
@JmsListener(destination="exampleQueue")
public void fetch(@Payload String message){
process(message);
}
Run Code Online (Sandbox Code Playgroud)
当这个方法执行导致异常时,我得到了一个警告日志
Execution of JMS message listener failed, and no ErrorHandler has been set.
Run Code Online (Sandbox Code Playgroud)
如何设置ErrorHandler处理案例.我正在使用spring boot 1.3.3.RELEASE
jms ×10
java ×8
java-ee ×2
activemq-cpp ×1
apache-camel ×1
ibm-mq ×1
listener ×1
performance ×1
sockets ×1
spring ×1
spring-boot ×1
spring-jms ×1
struts2 ×1
udp ×1