Java Spring启动消息中继似乎已连接,但消息未中继到外部(amazonMQ)代理
我正在Spring引导应用程序中为websocket配置外部代理(amazonMQ)中继 启动时,配置似乎良好,继电器按照以下is日志连接。 我用错误的URL进行了测试,很明显我得到了未知的后异常,所以我认为我的主机配置是好的 我已经用本地ActiveMQ对此进行了测试,并且我的测试设置工作得非常好,所以消息流也没有问题。 我可以在管理控制台中看到连接的消费者和创建的主题 这是我的代码基于 当我尝试连接客户端时,我会收到连接消息,随后会断开同一会话的连接 如果是SSL的问题,那么我在Spring文档中没有找到配置SSL的参考资料Java Spring启动消息中继似乎已连接,但消息未中继到外部(amazonMQ)代理,java,spring-boot,stomp,amazon-mq,Java,Spring Boot,Stomp,Amazon Mq,我正在Spring引导应用程序中为websocket配置外部代理(amazonMQ)中继 启动时,配置似乎良好,继电器按照以下is日志连接。 我用错误的URL进行了测试,很明显我得到了未知的后异常,所以我认为我的主机配置是好的 我已经用本地ActiveMQ对此进行了测试,并且我的测试设置工作得非常好,所以消息流也没有问题。 我可以在管理控制台中看到连接的消费者和创建的主题 这是我的代码基于 当我尝试连接客户端时,我会收到连接消息,随后会断开同一会话的连接 如果是SSL的问题,那么我在Spring
private static final String HOST = "b-xxxxxxxxxxxxxxxxxx.mq.aws-region.amazonaws.com";
private static final int PORT = 61617;
private static final String USER = "username-here";
private static final String PASSCODE = "passcode-here";
private ReactorNettyTcpClient<byte[]> createTcpClient() {
return new ReactorNettyTcpClient(HOST, PORT, new StompReactorNettyCodec());
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableStompBrokerRelay()
.setRelayHost(HOST)
.setRelayPort(PORT)
.setSystemLogin(USER)
.setSystemPasscode(PASSCODE)
.setClientLogin(USER)
.setClientPasscode(PASSCODE)
.setTcpClient(createTcpClient());
registry.setApplicationDestinationPrefixes("/app")
.setPathMatcher(new AntPathMatcher("."));
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws")
.setAllowedOrigins("*").withSockJS();
}
@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
AuthenticatedUser a = null;
registration.interceptors(new ChannelInterceptorAdapter() {
@Override
public Message<?> preSend(Message<?> message, MessageChannel channel) {
StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
log.info(" accessor {}", accessor);
return message;
}
});
当客户端尝试连接时记录日志
accessor StompHeaderAccessor [headers={simpMessageType=CONNECT,
stompCommand=CONNECT, nativeHeaders={accept-version=[1.1,1.0], heart-beat=[10000,10000]},
simpSessionAttributes={}, simpHeartbeat=[J@7070e97e,
simpSessionId=52usza4t}]
accessor StompHeaderAccessor [headers={simpMessageType=DISCONNECT,
stompCommand=DISCONNECT, simpSessionAttributes={},
simpSessionId=52usza4t}]
有人面临类似的情况吗?
提前感谢:)我用正确的库版本解决了它,特别是与reactor的冲突。 分享对我有用的东西 首先,我将我的spring boot版本从2.0.4升级到“2.1.6.RELEASE”
compile 'io.netty:netty-all:4.1.36.Final'
compile 'io.projectreactor:reactor-core:3.2.10.RELEASE'
compile 'io.projectreactor:reactor-net:2.0.5.RELEASE'
compile 'io.projectreactor:reactor-spring-context:2.0.7.RELEASE'
compile 'io.projectreactor.netty:reactor-netty:0.8.9.RELEASE'
// had to add this as application was failing to start complaining about jms
context.
compile 'javax.jms:javax.jms-api:2.0.1/reactor'
compile group: 'org.springframework', name: 'spring-messaging', version:
'5.1.8.RELEASE'
compile group: 'org.springframework', name: 'spring-jms', version:
'5.0.6.RELEASE'
导入lombok.extern.slf4j.slf4j;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.beans.factory.annotation.Qualifier;
导入org.springframework.context.annotation.Configuration;
导入org.springframework.messaging.simp.config.MessageBrokerRegistry;
导入org.springframework.messaging.simp.stomp.StompReactorNettyCodec;
导入org.springframework.messaging.tcp.reactor.ReactorNettyTcpClient;
导入org.springframework.security.authentication.AuthenticationManager;
导入org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
导入org.springframework.web.socket.config.annotation.StompEndpointRegistry;
导入org.springframework.web.socket.config.annotation.websocketmessagebrokerconfig;
导入java.net.InetAddress;
导入java.net.InetSocketAddress;
导入java.net.SocketAddress;
导入java.net.UnknownHostException;
@Slf4j
@配置
@EnableWebSocketMessageBroker
公共类WebSocketConfig实现WebSocketMessageBrokerConfiger{
@限定词
私人AuthenticationManager AuthenticationManager;
@自动连线
私有WebSocketSecurityHandler WebSocketSecurityHandler;
@值(${spring.config.mq.username}”)
私有字符串用户名;
@值(${spring.config.mq.password}”)
私有字符串密码;
@值(${spring.config.mq.host}”)
私有字符串主机;//“b-xxxxxx-xxxxx-xxxxx-xxxxx-xxxxx-x.mq.eu-central-1.amazonaws.com”;
@值(${spring.config.mq.port}”)
私有int端口;//Amazon MQ(ActiveMQ)STOMP端口=61614
私有SocketAddress getAddress(){
试一试{
InetAddress addr=InetAddress.getByName(主机);
SocketAddress sockaddr=新的InetSocketAddress(地址,端口);
返回sockaddr;
}捕获(未知后异常e){
日志错误(“连接失败”);
}
返回null;
}
私有ReactorNettyCPClient createTcpClient()的{
ReactorNettyCPClient无担保;
unSecured=新的ReactorNettyTcpClient(
client->client.addressSupplier(()->getAddress()).secure(),
新的StompReactorNettyCodec());
无担保返回;
}
@凌驾
public void配置MessageBroker(MessageBrokerRegistry注册表){
registry.enablestombrokerrelay(“/topic/”、“/queue/”)
.setRelayHost(主机)
.setRelayPort(端口)
.setSystemLogin(用户名)
.setSystemPasscode(密码)
.setClientLogin(用户名)
.setClientPasscode(密码)
.setTcpClient(createTcpClient());
registry.setApplicationDestinationPrefixes(“/app”);
//.setPathMatcher(新的AntPathMatcher(“.”);
}
@凌驾
公共无效注册表TompendPoints(StompEndpointRegistry注册表){
registry.addEndpoint(“/websocket”);
registry.addEndpoint(“/sockjs”)
.withSockJS();
}
}
compile 'io.netty:netty-all:4.1.36.Final'
compile 'io.projectreactor:reactor-core:3.2.10.RELEASE'
compile 'io.projectreactor:reactor-net:2.0.5.RELEASE'
compile 'io.projectreactor:reactor-spring-context:2.0.7.RELEASE'
compile 'io.projectreactor.netty:reactor-netty:0.8.9.RELEASE'
// had to add this as application was failing to start complaining about jms
context.
compile 'javax.jms:javax.jms-api:2.0.1/reactor'
compile group: 'org.springframework', name: 'spring-messaging', version:
'5.1.8.RELEASE'
compile group: 'org.springframework', name: 'spring-jms', version:
'5.0.6.RELEASE'
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.messaging.simp.stomp.StompReactorNettyCodec;
import org.springframework.messaging.tcp.reactor.ReactorNettyTcpClient;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.net.UnknownHostException;
@Slf4j
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Qualifier
private AuthenticationManager authenticationManager;
@Autowired
private WebSocketSecurityHandler webSocketSecurityHandler;
@Value("${spring.config.mq.username}")
private String userName;
@Value("${spring.config.mq.password}")
private String password;
@Value("${spring.config.mq.host}")
private String host; // "b-xxxxxx-xxxxx-xxxx-xxxx-xxxxx-x.mq.eu-central-1.amazonaws.com";
@Value("${spring.config.mq.port}")
private int port; // Amazon MQ (ActiveMQ) STOMP port = 61614
private SocketAddress getAddress() {
try {
InetAddress addr = InetAddress.getByName(host);
SocketAddress sockaddr = new InetSocketAddress(addr, port);
return sockaddr;
} catch (UnknownHostException e) {
log.error("failed to connect");
}
return null;
}
private ReactorNettyTcpClient<byte[]> createTcpClient() {
ReactorNettyTcpClient unSecured;
unSecured = new ReactorNettyTcpClient<>(
client -> client.addressSupplier(() -> getAddress()).secure(),
new StompReactorNettyCodec());
return unSecured;
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableStompBrokerRelay("/topic/", "/queue/")
.setRelayHost(host)
.setRelayPort(port)
.setSystemLogin(userName)
.setSystemPasscode(password)
.setClientLogin(userName)
.setClientPasscode(password)
.setTcpClient(createTcpClient());
registry.setApplicationDestinationPrefixes("/app");
//.setPathMatcher(new AntPathMatcher("."));
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/websocket");
registry.addEndpoint("/sockjs")
.withSockJS();
}
}