我有一个系统,其中不同的服务器进程正在处理通过 JMS 代理从各种客户端作为 JMS 消息传递的请求。
我正在尝试确定消息的来源。有没有办法获取 IP 或一些关于来源的识别信息?
澄清:我已经有未知用户部署的客户端,所以我试图避免更改消息类......
我有一个系统,其中不同的服务器进程正在处理通过 JMS 代理从各种客户端作为 JMS 消息传递的请求。
我正在尝试确定消息的来源。有没有办法获取 IP 或一些关于来源的识别信息?
澄清:我已经有未知用户部署的客户端,所以我试图避免更改消息类......
There is an optional JMS header mentioned in the JMS specification called JMSXUserID which which identifies the user sending a message (which the broker validates and ensures is correct to avoid spoofing) which some JMS providers support.
For example here is how to enable it in Apache ActiveMQ
我不相信。至少我找不到方法。
如果您需要将回复发送回消息源,您可以让发送方设置“JMSReplyTo”属性并回复回该目的地。
或者,您可以稍微更改您的消息传递模式并嵌入源信息消息本身。发送者将在消息中表明自己的身份,而接收者可以从那里读取它。
如果您可以控制正在发送的消息的构造,则始终可以将 IP 地址作为属性添加到消息中。然后您可以使用Message 上的getStringProperty方法检查该值。
如果您控制发送消息的客户端的代码,您可以发明一些属性名称,例如“IPOfSender”,并使用 Message.setStringProperty() 在每条消息中包含该属性。
// client code
String myIPString = ...;
Message m = session.createTextMessage();
m.setStringProperty("IPOfSender", myIPString);
...
它取决于您的 JMS 服务器。某些服务器具有允许您查看连接详细信息的管理工具/API。
Using glassfish, if you look at the getJMSMessageID() of the message, you should see a string to the effect of "ID:40-192.168.0.242(f5:62:c6:58:22:6f)-52506-122885191641". It appears as though the IP is a substring of the message id.
Please note that this is what I can see under our setup, so there may be other factors at play (ie. spring), but I know that string wasn't created by us programatically.
Short answer: NO