Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
S
spring-cloud-netflix
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
openSource
spring-cloud-netflix
Commits
a685a726
Commit
a685a726
authored
Oct 11, 2016
by
Ryan Baxter
Committed by
GitHub
Oct 11, 2016
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #1384 from bslota/master
#1376 Register and cancel event sending fix
parents
2f09aa29
4aaa7d05
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
239 additions
and
22 deletions
+239
-22
InstanceRegistry.java
...amework/cloud/netflix/eureka/server/InstanceRegistry.java
+52
-22
InstanceRegistryTest.java
...ork/cloud/netflix/eureka/server/InstanceRegistryTest.java
+187
-0
No files found.
spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/InstanceRegistry.java
View file @
a685a726
...
...
@@ -18,6 +18,7 @@ package org.springframework.cloud.netflix.eureka.server;
import
java.util.List
;
import
com.netflix.eureka.lease.Lease
;
import
org.springframework.beans.BeansException
;
import
org.springframework.cloud.netflix.eureka.server.event.EurekaInstanceCanceledEvent
;
import
org.springframework.cloud.netflix.eureka.server.event.EurekaInstanceRegisteredEvent
;
...
...
@@ -35,6 +36,7 @@ import com.netflix.eureka.registry.PeerAwareInstanceRegistryImpl;
import
com.netflix.eureka.resources.ServerCodecs
;
import
lombok.extern.apachecommons.CommonsLog
;
import
org.springframework.context.ApplicationEvent
;
/**
* @author Spencer Gibb
...
...
@@ -78,37 +80,27 @@ public class InstanceRegistry extends PeerAwareInstanceRegistryImpl
@Override
public
void
register
(
InstanceInfo
info
,
int
leaseDuration
,
boolean
isReplication
)
{
if
(
log
.
isDebugEnabled
())
{
log
.
debug
(
"register "
+
info
.
getAppName
()
+
", vip "
+
info
.
getVIPAddress
()
+
", leaseDuration "
+
leaseDuration
+
", isReplication "
+
isReplication
);
}
// TODO: what to publish from info (whole object?)
this
.
ctxt
.
publishEvent
(
new
EurekaInstanceRegisteredEvent
(
this
,
info
,
leaseDuration
,
isReplication
));
handleRegistration
(
info
,
leaseDuration
,
isReplication
);
super
.
register
(
info
,
leaseDuration
,
isReplication
);
}
@Override
public
boolean
cancel
(
String
appName
,
String
serverId
,
boolean
isReplication
)
{
if
(
log
.
isDebugEnabled
())
{
log
.
debug
(
"cancel "
+
appName
+
" serverId "
+
serverId
+
", isReplication {}"
+
isReplication
);
}
this
.
ctxt
.
publishEvent
(
new
EurekaInstanceCanceledEvent
(
this
,
appName
,
serverId
,
isReplication
));
public
void
register
(
final
InstanceInfo
info
,
final
boolean
isReplication
)
{
handleRegistration
(
info
,
resolveInstanceLeaseDuration
(
info
),
isReplication
);
super
.
register
(
info
,
isReplication
);
}
@Override
public
boolean
cancel
(
String
appName
,
String
serverId
,
boolean
isReplication
)
{
handleCancelation
(
appName
,
serverId
,
isReplication
);
return
super
.
cancel
(
appName
,
serverId
,
isReplication
);
}
@Override
public
boolean
renew
(
final
String
appName
,
final
String
serverId
,
boolean
isReplication
)
{
if
(
log
.
isDebugEnabled
())
{
log
.
debug
(
"renew "
+
appName
+
" serverId "
+
serverId
+
", isReplication {}"
+
isReplication
);
}
log
(
"renew "
+
appName
+
" serverId "
+
serverId
+
", isReplication {}"
+
isReplication
);
List
<
Application
>
applications
=
getSortedApplications
();
for
(
Application
input
:
applications
)
{
if
(
input
.
getName
().
equals
(
appName
))
{
...
...
@@ -119,11 +111,49 @@ public class InstanceRegistry extends PeerAwareInstanceRegistryImpl
break
;
}
}
this
.
ctxt
.
publishEvent
(
new
EurekaInstanceRenewedEvent
(
this
,
appName
,
serverId
,
instance
,
isReplication
));
publishEvent
(
new
EurekaInstanceRenewedEvent
(
this
,
appName
,
serverId
,
instance
,
isReplication
));
break
;
}
}
return
super
.
renew
(
appName
,
serverId
,
isReplication
);
}
@Override
protected
boolean
internalCancel
(
String
appName
,
String
id
,
boolean
isReplication
)
{
handleCancelation
(
appName
,
id
,
isReplication
);
return
super
.
internalCancel
(
appName
,
id
,
isReplication
);
}
private
void
handleCancelation
(
String
appName
,
String
id
,
boolean
isReplication
)
{
log
(
"cancel "
+
appName
+
", serverId "
+
id
+
", isReplication "
+
isReplication
);
publishEvent
(
new
EurekaInstanceCanceledEvent
(
this
,
appName
,
id
,
isReplication
));
}
private
void
handleRegistration
(
InstanceInfo
info
,
int
leaseDuration
,
boolean
isReplication
)
{
log
(
"register "
+
info
.
getAppName
()
+
", vip "
+
info
.
getVIPAddress
()
+
", leaseDuration "
+
leaseDuration
+
", isReplication "
+
isReplication
);
publishEvent
(
new
EurekaInstanceRegisteredEvent
(
this
,
info
,
leaseDuration
,
isReplication
));
}
private
void
log
(
String
message
)
{
if
(
log
.
isDebugEnabled
())
{
log
.
debug
(
message
);
}
}
private
void
publishEvent
(
ApplicationEvent
applicationEvent
)
{
this
.
ctxt
.
publishEvent
(
applicationEvent
);
}
private
int
resolveInstanceLeaseDuration
(
final
InstanceInfo
info
)
{
int
leaseDuration
=
Lease
.
DEFAULT_DURATION_IN_SECS
;
if
(
info
.
getLeaseInfo
()
!=
null
&&
info
.
getLeaseInfo
().
getDurationInSecs
()
>
0
)
{
leaseDuration
=
info
.
getLeaseInfo
().
getDurationInSecs
();
}
return
leaseDuration
;
}
}
spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/InstanceRegistryTest.java
0 → 100644
View file @
a685a726
package
org
.
springframework
.
cloud
.
netflix
.
eureka
.
server
;
import
static
org
.
junit
.
Assert
.*;
import
static
org
.
mockito
.
Matchers
.
isA
;
import
static
org
.
mockito
.
Mockito
.
doAnswer
;
import
static
org
.
mockito
.
Mockito
.
doReturn
;
import
java.util.ArrayList
;
import
java.util.LinkedList
;
import
java.util.List
;
import
com.netflix.discovery.shared.Application
;
import
org.junit.Before
;
import
org.junit.Test
;
import
org.junit.runner.RunWith
;
import
org.mockito.invocation.InvocationOnMock
;
import
org.mockito.stubbing.Answer
;
import
org.springframework.boot.autoconfigure.EnableAutoConfiguration
;
import
org.springframework.boot.builder.SpringApplicationBuilder
;
import
org.springframework.boot.test.context.SpringBootTest
;
import
org.springframework.boot.test.mock.mockito.MockBean
;
import
org.springframework.boot.test.mock.mockito.SpyBean
;
import
org.springframework.cloud.netflix.eureka.server.InstanceRegistryTest.TestApplication
;
import
org.springframework.cloud.netflix.eureka.server.event.EurekaInstanceCanceledEvent
;
import
org.springframework.cloud.netflix.eureka.server.event.EurekaInstanceRegisteredEvent
;
import
org.springframework.cloud.netflix.eureka.server.event.EurekaInstanceRenewedEvent
;
import
org.springframework.context.ApplicationEvent
;
import
org.springframework.context.ApplicationListener
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.test.context.junit4.SpringJUnit4ClassRunner
;
import
com.netflix.appinfo.InstanceInfo
;
import
com.netflix.appinfo.LeaseInfo
;
import
com.netflix.eureka.registry.PeerAwareInstanceRegistry
;
/**
* @author Bartlomiej Slota
*/
@RunWith
(
SpringJUnit4ClassRunner
.
class
)
@SpringBootTest
(
classes
=
TestApplication
.
class
,
webEnvironment
=
SpringBootTest
.
WebEnvironment
.
RANDOM_PORT
,
value
=
{
"spring.application.name=eureka"
,
"logging.level.org.springframework."
+
"cloud.netflix.eureka.server.InstanceRegistry=DEBUG"
})
public
class
InstanceRegistryTest
{
private
final
List
<
ApplicationEvent
>
applicationEvents
=
new
LinkedList
<>();
private
static
final
String
APP_NAME
=
"MY-APP-NAME"
;
private
static
final
String
HOST_NAME
=
"my-host-name"
;
@SpyBean
(
PeerAwareInstanceRegistry
.
class
)
private
InstanceRegistry
instanceRegistry
;
@MockBean
private
ApplicationListener
<
EurekaInstanceRegisteredEvent
>
instanceRegisteredEventListenerMock
;
@MockBean
private
ApplicationListener
<
EurekaInstanceCanceledEvent
>
instanceCanceledEventListenerMock
;
@MockBean
private
ApplicationListener
<
EurekaInstanceRenewedEvent
>
instanceRenewedEventListener
;
@Before
public
void
setup
()
{
applicationEvents
.
clear
();
Answer
applicationListenerAnswer
=
prepareListenerMockAnswer
();
doAnswer
(
applicationListenerAnswer
).
when
(
instanceRegisteredEventListenerMock
)
.
onApplicationEvent
(
isA
(
EurekaInstanceRegisteredEvent
.
class
));
doAnswer
(
applicationListenerAnswer
).
when
(
instanceCanceledEventListenerMock
)
.
onApplicationEvent
(
isA
(
EurekaInstanceCanceledEvent
.
class
));
doAnswer
(
applicationListenerAnswer
).
when
(
instanceRenewedEventListener
)
.
onApplicationEvent
(
isA
(
EurekaInstanceRenewedEvent
.
class
));
}
@Test
public
void
testRegister
()
throws
Exception
{
// creating instance info
final
LeaseInfo
leaseInfo
=
getLeaseInfo
();
final
InstanceInfo
instanceInfo
=
getInstanceInfo
(
leaseInfo
);
// calling tested method
instanceRegistry
.
register
(
instanceInfo
,
false
);
// event of proper type is registered
assertEquals
(
1
,
applicationEvents
.
size
());
assertTrue
(
applicationEvents
.
get
(
0
)
instanceof
EurekaInstanceRegisteredEvent
);
// event details are correct
final
EurekaInstanceRegisteredEvent
registeredEvent
=
(
EurekaInstanceRegisteredEvent
)
(
applicationEvents
.
get
(
0
));
assertEquals
(
instanceInfo
,
registeredEvent
.
getInstanceInfo
());
assertEquals
(
leaseInfo
.
getDurationInSecs
(),
registeredEvent
.
getLeaseDuration
());
assertEquals
(
instanceRegistry
,
registeredEvent
.
getSource
());
assertFalse
(
registeredEvent
.
isReplication
());
}
@Test
public
void
testDefaultLeaseDurationRegisterEvent
()
throws
Exception
{
// creating instance info
final
InstanceInfo
instanceInfo
=
getInstanceInfo
(
null
);
// calling tested method
instanceRegistry
.
register
(
instanceInfo
,
false
);
// instance info duration is set to default
final
EurekaInstanceRegisteredEvent
registeredEvent
=
(
EurekaInstanceRegisteredEvent
)
(
applicationEvents
.
get
(
0
));
assertEquals
(
LeaseInfo
.
DEFAULT_LEASE_DURATION
,
registeredEvent
.
getLeaseDuration
());
}
@Test
public
void
testInternalCancel
()
throws
Exception
{
// calling tested method
instanceRegistry
.
internalCancel
(
APP_NAME
,
HOST_NAME
,
false
);
// event of proper type is registered
assertEquals
(
1
,
applicationEvents
.
size
());
assertTrue
(
applicationEvents
.
get
(
0
)
instanceof
EurekaInstanceCanceledEvent
);
// event details are correct
final
EurekaInstanceCanceledEvent
registeredEvent
=
(
EurekaInstanceCanceledEvent
)
(
applicationEvents
.
get
(
0
));
assertEquals
(
APP_NAME
,
registeredEvent
.
getAppName
());
assertEquals
(
HOST_NAME
,
registeredEvent
.
getServerId
());
assertEquals
(
instanceRegistry
,
registeredEvent
.
getSource
());
assertFalse
(
registeredEvent
.
isReplication
());
}
@Test
public
void
testRenew
()
throws
Exception
{
// creating application list
final
LeaseInfo
leaseInfo
=
getLeaseInfo
();
final
InstanceInfo
instanceInfo
=
getInstanceInfo
(
leaseInfo
);
final
List
<
InstanceInfo
>
instances
=
new
ArrayList
<>();
instances
.
add
(
instanceInfo
);
final
Application
application
=
new
Application
(
APP_NAME
,
instances
);
final
List
<
Application
>
applications
=
new
ArrayList
<>();
applications
.
add
(
application
);
// stubbing applications list
doReturn
(
applications
).
when
(
instanceRegistry
).
getSortedApplications
();
// calling tested method
instanceRegistry
.
renew
(
APP_NAME
,
HOST_NAME
,
false
);
// event of proper type is registered
assertEquals
(
1
,
applicationEvents
.
size
());
assertTrue
(
applicationEvents
.
get
(
0
)
instanceof
EurekaInstanceRenewedEvent
);
// event details are correct
final
EurekaInstanceRenewedEvent
registeredEvent
=
(
EurekaInstanceRenewedEvent
)
(
applicationEvents
.
get
(
0
));
assertEquals
(
APP_NAME
,
registeredEvent
.
getAppName
());
assertEquals
(
HOST_NAME
,
registeredEvent
.
getServerId
());
assertEquals
(
instanceRegistry
,
registeredEvent
.
getSource
());
assertEquals
(
instanceInfo
,
registeredEvent
.
getInstanceInfo
());
assertFalse
(
registeredEvent
.
isReplication
());
}
@Configuration
@EnableAutoConfiguration
@EnableEurekaServer
protected
static
class
TestApplication
{
public
static
void
main
(
String
[]
args
)
{
new
SpringApplicationBuilder
(
TestApplication
.
class
).
run
(
args
);
}
}
private
LeaseInfo
getLeaseInfo
()
{
LeaseInfo
.
Builder
leaseBuilder
=
LeaseInfo
.
Builder
.
newBuilder
();
leaseBuilder
.
setRenewalIntervalInSecs
(
10
);
leaseBuilder
.
setDurationInSecs
(
15
);
return
leaseBuilder
.
build
();
}
private
InstanceInfo
getInstanceInfo
(
LeaseInfo
leaseInfo
)
{
InstanceInfo
.
Builder
builder
=
InstanceInfo
.
Builder
.
newBuilder
();
builder
.
setAppName
(
APP_NAME
);
builder
.
setHostName
(
HOST_NAME
);
builder
.
setPort
(
8008
);
builder
.
setLeaseInfo
(
leaseInfo
);
return
builder
.
build
();
}
private
Answer
prepareListenerMockAnswer
()
{
return
new
Answer
()
{
@Override
public
Object
answer
(
InvocationOnMock
invocation
)
throws
Throwable
{
return
applicationEvents
.
add
((
ApplicationEvent
)
invocation
.
getArguments
()[
0
]);
}
};
}
}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment